forked from axiom-team/astroport
11 lines
1.1 MiB
11 lines
1.1 MiB
/* minified */
|
||
function e(e,n){"use strict";var t=this;n&&n.length?_.forEach(n,(function(n){t[n]=e[n]})):["currency","issuer","medianTime","number","version","powMin","dividend","membersCount","hash","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions"].forEach((function(n){t[n]=e[n]})),t.identitiesCount=t.identities?t.identities.length:0,t.joinersCount=t.joiners?t.joiners.length:0,t.activesCount=t.actives?t.actives.length:0,t.leaversCount=t.leavers?t.leavers.length:0,t.revokedCount=t.revoked?t.revoked.length:0,t.excludedCount=t.excluded?t.excluded.length:0,t.certificationsCount=t.certifications?t.certifications.length:0,t.transactionsCount=t.transactions?t.transactions.length:0,t.empty=t.isEmpty()}function n(e,n){e.extensionPoint=n.extensions.points.current.get()}function t(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g,h,b){e.walletData=p.data,e.search={},e.login=p.isLogin(),e.motion=u.motion.default,e.fullscreen=u.screen.fullscreen.isEnabled(),e.showHome=function(){return s.nextViewOptions({historyRoot:!0}),t.go("app.home").then(u.loading.hide)},e.createHelptipScope=function(t){if(t||!n.tour&&n.settings.helptip.enable&&!u.screen.isSmall()){var i=e.$new();return r("HelpTipCtrl",{$scope:i}),i}},e.startHelpTour=function(t){if(n.tour=!0,!t)return s.clearHistory(),s.clearCache().then((function(){e.startHelpTour(!0)}));var i=e.createHelptipScope(!0);return i.startHelpTour().then((function(){i.$destroy(),delete n.tour})).catch((function(e){delete n.tour}))},e.isLogin=function(){return e.login},e.loadWalletData=function(e){return console.warn("[app-controller] DEPRECATED - Please use csWallet.load() instead of $scope.loadWalletData()",new Error),e=e||{},p.loadData(e).then((function(e){if(!e)throw"CANCELLED";return e}))},e.loadWallet=function(n){return console.warn("[app-controller] DEPRECATED - Please use csWallet.loadData() instead of $scope.loadWallet()",new Error),c.isStarted()?(n=n||{},p.isLogin()?p.data.loaded?a.when(p.data):p.loadData(n):e.showLoginModal(n).then((function(e){if(e)return n&&n.minData&&(n.minData=!1),p.loadData(n)})).then((function(e){if(e)return e;throw"CANCELLED"}))):c.ready().then((function(){return e.loadWallet(n)}))},e.loginAndGo=function(n,i){if(e.closeProfilePopover(),n=n||"app.view_wallet",p.isLogin())return t.go(n,i);if(h.httpsMode&&l.location&&"https:"!==l.location.protocol){var a=l.location.href,o=a.indexOf("#"),s=-1!==o?a.substr(0,o):a;if(a=(s="https"+s.substr(4))+t.href(n),!h.httpsModeDebug)return void(l.location.href=a);console.debug("[httpsMode] --- Should redirect to: "+a)}return e.showLoginModal().then((function(e){if(e)return t.go(n,i).then(u.loading.hide)}))},e.showLoginModal=function(t){return(t=t||{}).templateUrl=t.templateUrl||h.login&&h.login.templateUrl,t.controller=t.controller||h.login&&h.login.controller,E.showLogin(t).then((function(e){if(e)return g.data.rememberMe!==e.rememberMe&&(g.data.rememberMe=e.rememberMe,g.data.useLocalStorage=!!g.data.rememberMe||g.data.useLocalStorage,g.store()),p.login(e.username,e.password)})).then((function(e){return e&&(n.walletData=e),e})).catch((function(n){if("RETRY"===n)return u.loading.hide(),e.showLoginModal(t);u.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(n)}))},e.logout=function(n){return!(n=n||{}).force&&e.profilePopover?e.profilePopover.hide().then((function(){return n.force=!0,e.logout(n)})):n.askConfirm?u.alert.confirm("CONFIRM.LOGOUT").then((function(t){if(t)return n.askConfirm=!1,e.logout(n)})):(u.loading.show(),p.logout().then((function(){return i.isOpenLeft()&&i.toggleLeft(),s.clearHistory(),s.clearCache().then((function(){return e.showHome()}))})).catch(u.onError()))},e.isUserPubkey=function(e){return p.isUserPubkey(e)},p.api.data.on.login(e,(function(n,t){return e.login=!0,t?t.resolve():a.when()})),p.api.data.on.logout(e,(function(){e.login=!1})),e.showTransferModal=function(e){},e.showAboutModal=function(){return E.showAbout()},e.showJoinModal=function(){return e.closeProfilePopover(),E.showJoin()},e.showSettings=function(){return e.closeProfilePopover(),t.go("app.settings")},e.showHelpModal=function(e){return E.showHelp(e)},e.showProfilePopover=function(n){return u.popover.show(n,{templateUrl:"templates/common/popover_profile.html",scope:e,autoremove:!0,afterShow:function(n){e.profilePopover=n,o((function(){u.ink({selector:"#profile-popover .ink, #profile-popover .ink-dark"})}),100)}})},e.closeProfilePopover=function(){e.profilePopover&&e.profilePopover.isShown()&&o((function(){e.profilePopover.hide()}))},e.showPeerInfoPopover=function(n){return u.popover.show(n,{templateUrl:"templates/network/popover_peer_info.html",autoremove:!0,scope:e.$new(!0)})},e.openLink=function(e,n,t){return e.stopPropagation(),e.preventDefault(),(t=t||{}).onError=function(){return u.popover.copy(e,n)},b.uri.open(n,t),!1},e.showFab=function(e,n){u.motion.toggleOn({selector:"#"+e+".button-fab"},n)},e.hideFab=function(e,n){u.motion.toggleOff({selector:"#"+e+".button-fab"},n)},e.doMotion=function(n){return e.motion.show(n)},e.askFullscreen=function(){if(!e.fullscreen&&u.screen.isSmall()&&m.isWeb())return u.alert.confirm("CONFIRM.FULLSCREEN",null,{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then((function(n){n&&e.toggleFullscreen()}))},e.toggleFullscreen=function(){e.fullscreen=!u.screen.fullscreen.isEnabled(),u.screen.fullscreen.toggleAll()},e.askFullscreen()}function i(e,n,t,i,a,o,s,r,l){e.loading=!0,e.locales=angular.copy(l.locales),e.bgImage=function(){var e;if(Math.random()<.5)e="service";else{var n=moment().format("D"),t=moment().format("M");e=t<3||3==t&&n<21||12==t&&n>=21?"winter":3==t&&n>=21||t<6||6==t&&n<21?"spring":6==t&&n>=21||t<9||9==t&&n<21?"summer":"autumn"}var i={service:12,spring:7,summer:11,autumn:7,winter:5}[e],a=Math.floor(Math.random()*i)+1;return"./img/bg/{0}-{1}.jpg".format(e,a)}(),e.enter=function(t,a){ionic.Platform.isIOS()&&window.StatusBar&&(StatusBar.overlaysWebView(!1),StatusBar.overlaysWebView(!0)),a&&a.stateParams&&a.stateParams.error?(e.error=a.stateParams.error,e.node=r.data.node,e.loading=!1,i.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),n.go("app.home",{error:void 0},{reload:!1,inherit:!0,notify:!1})):s.ready().then((function(){e.loading=!1})).catch((function(n){e.node=r.data.node,e.loading=!1,e.error=n}))},e.$on("$ionicView.enter",e.enter),e.reload=function(){e.loading=!0,delete e.error,t(e.enter,200)},e.doQuickFix=function(e){"settings"===e&&(i.nextViewOptions({historyRoot:!0}),n.go("app.settings"))},e.changeLanguage=function(n){a.use(n),e.hideLocalesPopover(),l.data.locale=_.findWhere(e.locales,{id:n})},e.showLocalesPopover=function(n){o.popover.show(n,{templateUrl:"templates/api/locales_popover.html",scope:e,autoremove:!0,afterShow:function(n){e.localesPopover=n}})},e.hideLocalesPopover=function(){e.localesPopover&&(e.localesPopover.hide(),e.localesPopover=null)}}function a(e,n){e((function(){n.showJoin()}),100)}function o(e,n,t,i,a,o,s,r,l){e.formData={pseudo:""},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.search={looking:!0},e.showUsername=!1,e.showPassword=!1,e.smallscreen=t.screen.isSmall(),e.userIdPattern=l.constants.regex.USER_ID,e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes(),e.isLastSlide=!1},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes(),e.isLastSlide=4===e.slides.slider.activeIndex},e.showAccountPubkey=function(){e.formData.computing=!0,i.scryptKeypair(e.formData.username,e.formData.password).then((function(n){e.formData.pubkey=i.util.encode_base58(n.signPk),e.formData.computing=!1})).catch((function(n){e.formData.computing=!1,console.error(">>>>>>>",n),t.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.doNext=function(n){if(console.debug("[join] form "+n+" OK. index="+e.slides.slider.activeIndex),n||(n=1===e.slides.slider.activeIndex?"passwordForm":2===e.slides.slider.activeIndex?"pseudoForm":n),n){if(e[n].$submitted=!0,!e[n].$valid)return;"passwordForm"===n?(e.slideNext(),e.showAccountPubkey()):(e.slideNext(),"pseudoForm"===n&&e.showAccountPubkey())}},e.doNewAccount=function(i){if(!i)return t.alert.confirm("ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT").then((function(n){n&&e.doNewAccount(!0)}));t.loading.show(),s.login(e.formData.username,e.formData.password).then((function(t){e.closeModal(),a.data.wallet=a.data.wallet||{},a.data.wallet.alertIfUnusedWallet=!1,r.setDefaultProfile({title:e.formData.pseudo}),n.go("app.view_wallet")})).catch((function(e){t.loading.hide(),console.error(">>>>>>>",e),t.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))},e.showHelpModal=function(n){n||(n=1==e.slides.slider.activeIndex?"join-salt":2==e.slides.slider.activeIndex?"join-password":"join-pseudo"),o.showHelp({anchor:n})}}function s(e,n,t,i,a,o,s){e.computing=!1,e.pubkey=null,e.formData={rememberMe:o.data.rememberMe},e.showSalt=o.data.showLoginSalt,e.showPubkeyButton=!1,e.autoComputePubkey=!1,s.ready().then((function(){e.autoComputePubkey="a"===ionic.Platform.grade.toLowerCase()&&!i.screen.isSmall()})),e.doLogin=function(){e.form.$valid&&(i.loading.show(),e.closeModal(e.formData))},e.formDataChanged=function(){e.computing=!1,e.pubkey=null,e.autoComputePubkey&&e.formData.username&&e.formData.password?e.showPubkey():e.showPubkeyButton=e.formData.username&&e.formData.password},e.$watch("formData.username",e.formDataChanged,!0),e.$watch("formData.password",e.formDataChanged,!0),e.showPubkey=function(){e.computing=!0,e.showPubkeyButton=!1,e.pubkey="",n((function(){var n=e.formData.username,a=e.formData.password;t.scryptKeypair(n,a).then((function(i){n!==e.formData.username||a!==e.formData.password?e.showPubkey():(e.pubkey=t.util.encode_base58(i.signPk),e.computing=!1)})).catch((function(n){e.pubkey="",e.computing=!1,i.loading.hide(),console.error(">>>>>>>",n),i.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))}),500)},e.showJoinModal=function(){e.closeModal(),n((function(){a.showJoin()}),300)},e.showAccountSecurityModal=function(){e.closeModal(),n((function(){a.showAccountSecurity()}),300)}}function r(e,n,t,i,a){e.$on("$ionicView.enter",(function(o){e.locale=a.data.locale.id,n.stateParams&&n.stateParams.anchor&&t((function(){i(n.stateParams.anchor)}),100)}))}function l(e,n,t,i,a){e.locale=i.data.locale.id,a&&a.anchor&&n((function(){t(a.anchor)}),100)}function c(e,n,t,i,a,o,s,r,l,c,u,d,p,m){e.tour=!1,e.continue=!0,e.executeStep=function(n,t,i){if((i=angular.isDefined(i)?i:0)>=t.length)return s.when(!0);var a=t[i];if("function"!=typeof a)throw new Error("[helptip] Invalid step at index {0} of '{1}' tour: step must be a function".format(i,n));var o=a();return"boolean"==typeof o&&(o=s.when(o)),o.then((function(a){return angular.isUndefined(a)?(e.continue=!1,i):a&&i!==t.length-1?e.executeStep(n,t,i+1):a?-1:i+1})).catch((function(t){return t&&"transition prevented"==t.message?console.error("ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error".format(n,i)):console.error("ERROR: in help tour [{0}], in step [{1}] : {2}".format(n,i,t)),e.continue=!1,i}))},e.showHelpTip=function(n,t){return(t=t||{}).bindings=t.bindings||{},t.bindings.value=t.bindings.value||"",t.bindings.hasNext=!angular.isDefined(t.bindings.hasNext)||t.bindings.hasNext,t.timeout=t.timeout||(p.enable?900:500),t.autoremove=!0,t.bindings.tour=e.tour,t.backdropClickToClose=!e.tour,l.popover.helptip(n,t)},e.showHelpModal=function(e){Modals.showHelp({anchor:e})},e.startHelpTour=function(){return e.tour=!0,e.continue=!0,e.startCurrencyTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(u.data.helptip.currency=n,u.store(),e.continue)})).then((function(n){return!!n&&e.startNetworkTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(u.data.helptip.network=n,u.store(),e.continue)}))})).then((function(n){return!!n&&e.startWotTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(u.data.helptip.wot=n,u.store(),e.continue)}))})).then((function(n){return!!n&&e.startWotCertTour(0,!0).then((function(n){return!!n&&(u.data.helptip.wotCerts=n,u.store(),e.continue)}))})).then((function(n){return!!n&&e.startWalletNoLoginTour(0,!0)})).then((function(n){return!!n&&(!m.isLogin()||e.startWalletTour(0,!0).then((function(n){return!!n&&(u.data.helptip.wallet=n,u.store(),e.continue)})))})).then((function(n){return!!n&&(!m.isLogin()||e.startWalletCertTour(0,!0).then((function(n){return!!n&&(u.data.helptip.walletCerts=n,u.store(),e.continue)})))})).then((function(n){return!!n&&(!m.isLogin()||e.startTxTour(0,!0).then((function(n){return!!n&&(u.data.helptip.tx=n,u.store(),e.continue)})))})).then((function(n){return!!n&&e.startHeaderTour(0,!0)})).then((function(n){return!!n&&e.startSettingsTour(0,!0)})).then((function(n){return!!n&&e.finishTour()}))},e.startCurrencyTour=function(n,i){var o,s=[function(){return a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-currency",{bindings:{content:"HELP.TIP.MENU_BTN_CURRENCY",icon:{position:"left"}}})},function(){return a.isOpen()&&a.toggleLeft(!1),t.go(l.screen.isSmall()?"app.currency":"app.currency_view_lg").then((function(){return e.showHelpTip("helptip-currency-mass-member",{bindings:{content:"HELP.TIP.CURRENCY_MASS",icon:{position:"center"}}})}))},function(){return!u.data.useRelative||e.showHelpTip("helptip-currency-mass-member-unit",{bindings:{content:"HELP.TIP.CURRENCY_UNIT_RELATIVE",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return!u.data.useRelative||e.showHelpTip("helptip-currency-change-unit",{bindings:{content:"HELP.TIP.CURRENCY_CHANGE_UNIT",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return!!u.data.useRelative||e.showHelpTip("helptip-currency-change-unit",{bindings:{content:"HELP.TIP.CURRENCY_CHANGE_UNIT_TO_RELATIVE",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return l.screen.isSmall()&&r("helptip-currency-rules-anchor"),e.showHelpTip("helptip-currency-rules",{bindings:{content:"HELP.TIP.CURRENCY_RULES",icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return t.is("app.currency.tab_parameters")&&t.go("app.currency.tab_wot"),e.showHelpTip("helptip-currency-newcomers",{bindings:{content:"HELP.TIP.CURRENCY_WOT",icon:{position:"center"}},timeout:1200})}];return d.default().then((function(t){return o=t.parameters,e.executeStep("currency",s,n)}))},e.startNetworkTour=function(n,s){var r=function(){t.is("app.currency")&&o((function(){var e=i.document.querySelectorAll("ion-tabs .tabs a");e&&3==e.length&&angular.element(e[2]).triggerHandler("click")}),100)},p=[function(){return!!l.screen.isSmall()||(a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-network",{bindings:{content:"HELP.TIP.MENU_BTN_NETWORK",icon:{position:"left"}}}))},function(){return a.isOpen()&&a.toggleLeft(!1),t.go(l.screen.isSmall()?"app.currency.tab_network":"app.network").then((function(){return r(),e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_BLOCKCHAIN",icon:{position:"center",glyph:"ion-information-circled"}},timeout:1200})}))},function(){return r(),e.showHelpTip("helptip-network-peer-0",{bindings:{content:"HELP.TIP.NETWORK_PEERS",icon:{position:l.screen.isSmall()?void 0:"center"}},timeout:1e3,retry:20})},function(){return r(),e.showHelpTip("helptip-network-peer-0-block",{bindings:{content:"HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER",icon:{position:l.screen.isSmall()?void 0:"center"}}})},function(){r();var n=u.data.locale.id;return e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_PEERS_PARTICIPATE",contentParams:{installDocUrl:c.helptip&&c.helptip.installDocUrl?c.helptip.installDocUrl[n]?c.helptip.installDocUrl[n]:c.helptip.installDocUrl:"http://duniter.org"},icon:{position:"center",glyph:"ion-information-circled"},hasNext:s}})}];return d.default().then((function(t){return t.parameters,e.executeStep("network",p,n)}))},e.startWotTour=function(s,r){var c,u=[function(){return a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-wot",{bindings:{content:"HELP.TIP.MENU_BTN_WOT",icon:{position:"left"}},onError:"continue"})},function(){return a.isOpen()&&a.toggleLeft(!1),t.go("app.wot_lookup").then((function(){return e.showHelpTip("helptip-wot-search-text",{bindings:{content:l.screen.isSmall()?"HELP.TIP.WOT_SEARCH_TEXT_XS":"HELP.TIP.WOT_SEARCH_TEXT",icon:{position:"center"}}})}))},function(){return e.showHelpTip("helptip-wot-search-result-0",{bindings:{content:"HELP.TIP.WOT_SEARCH_RESULT",icon:{position:"center"}},timeout:700,retry:15})},function(){var n=i.document.getElementById("helptip-wot-search-result-0");return!n||(o((function(){angular.element(n).triggerHandler("click")})),e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS"},timeout:2500}))},function(){return e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT",contentParams:c,icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return e.showHelpTip("helptip-wot-view-certifications-count",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_CLICK",icon:{position:"center"},hasNext:r}})}];return d.default().then((function(t){return(c=t.parameters).currentUD=n.walletData.currentUD,e.executeStep("wot",u,s)}))},e.startWotCertTour=function(n,a){var s=[function(){if(t.is("app.wot_identity")){var n=i.document.getElementById("helptip-wot-view-certifications");if(!n)return!0;o((function(){angular.element(n).triggerHandler("click")}))}return e.showHelpTip(l.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFY",icon:{position:l.screen.isSmall()?"bottom-right":"center"}},timeout:l.screen.isSmall()?2e3:1e3,retry:10})},function(){return e.showHelpTip(l.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:a}})}];return e.executeStep("certs",s,n)},e.startWalletNoLoginTour=function(t,i){if(m.isLogin())return s.when(!0);var o=[function(){return a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"},hasNext:i}})}];return e.executeStep("wallet-no-login",o,t)},e.startWalletTour=function(i,o){if(!m.isLogin())return s.when(!0);var c=[function(){return a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"}}})},function(){return a.isOpen()&&a.toggleLeft(!1),t.go("app.view_wallet").then((function(){return e.showHelpTip(l.screen.isSmall()?"helptip-wallet-options-xs":"helptip-wallet-options",{bindings:{content:"HELP.TIP.WALLET_OPTIONS",icon:{position:l.screen.isSmall()?"right":"center"}}})}))},function(){return r("helptip-wallet-pubkey"),e.showHelpTip("helptip-wallet-pubkey",{bindings:{content:"HELP.TIP.WALLET_PUBKEY",icon:{position:"bottom-center"}},timeout:l.screen.isSmall()?2e3:500,retry:10})},function(){return r("helptip-wallet-certifications"),e.showHelpTip("helptip-wallet-certifications",{bindings:{content:l.screen.isSmall()?"HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS":"HELP.TIP.WALLET_CERTIFICATIONS",icon:{position:"center"}},timeout:500,onError:"continue",hasNext:o})}];return d.default().then((function(t){return t.parameters.currentUD=n.walletData.currentUD,e.executeStep("wallet",c,i)}))},e.startWalletCertTour=function(n,a){if(!m.isLogin())return s.when(!0);var r=!1,c=[function(){if(t.is("app.view_wallet")){var n=i.document.getElementById("helptip-wallet-certifications");if(!n)return r=!0,!0;o((function(){angular.element(n).triggerHandler("click")}))}return!l.screen.isSmall()||e.showHelpTip("helptip-received-certs",{bindings:{content:"HELP.TIP.WALLET_RECEIVED_CERTS"}})},function(){return!(!r&&l.screen.isSmall())||t.go("app.view_wallet").then((function(){return e.showHelpTip("helptip-wallet-given-certifications",{bindings:{content:"HELP.TIP.WALLET_GIVEN_CERTIFICATIONS",icon:{position:"center"}},timeout:500})}))},function(){if(r)return!0;if(t.is("app.view_wallet")){var n=i.document.getElementById("helptip-wallet-given-certifications");if(!n)return r=!0,!0;o((function(){angular.element(n).triggerHandler("click")}),500)}return e.showHelpTip(l.screen.isSmall()?"fab-select-certify":"helptip-certs-select-certify",{bindings:{content:"HELP.TIP.WALLET_CERTIFY",icon:{position:l.screen.isSmall()?"bottom-right":"center"}},timeout:l.screen.isSmall()?2e3:500,retry:10})},function(){return e.tour||r?a:e.showHelpTip("helptip-certs-stock",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:a}})}];return d.default().then((function(t){return t.parameters,e.executeStep("certs",c,n)}))},e.startTxTour=function(i,o){if(!m.isLogin())return s.when(!0);var r,l=[function(){return a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-tx",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_TX_MEMBER":"HELP.TIP.MENU_BTN_TX",icon:{position:"left"}}})},function(){return a.isOpen()&&a.toggleLeft(!1),t.go("app.view_wallet_tx").then((function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:u.data.useRelative?"HELP.TIP.WALLET_BALANCE_RELATIVE":"HELP.TIP.WALLET_BALANCE",contentParams:r,icon:{position:"center"}},retry:20})}))},function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:"HELP.TIP.WALLET_BALANCE_CHANGE_UNIT",contentParams:r,icon:{position:"center",glyph:"ion-information-circled"}}})}];return d.default().then((function(t){return(r=t.parameters).currentUD=n.walletData.currentUD,e.executeStep("tx",l,i)}))},e.startHeaderTour=function(n,t){if(l.screen.isSmall())return s.when(!0);function r(){var e=i.document.querySelectorAll("#helptip-header-bar-btn-profile");return e&&e.length?_.find(e,(function(e){return e.offsetWidth>0})):null}var c=[function(){if(l.screen.isSmall())return!0;var n=r();return!n||e.showHelpTip(n,{bindings:{content:"HELP.TIP.HEADER_BAR_BTN_PROFILE",icon:{position:"right"}}})},function(){if(l.screen.isSmall())return a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"},hasNext:t},timeout:1e3});var n=r();return!n||(o((function(){angular.element(n).triggerHandler("click")})),e.showHelpTip("helptip-popover-profile-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"center"},hasNext:t},timeout:1e3}).then((function(n){return e.closeProfilePopover(),n})))}];return e.executeStep("header",c,n)},e.startSettingsTour=function(n,i){var o,s=[function(){return!l.screen.isSmall()||(a.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"}},timeout:1e3}))},function(){return a.isOpen()&&a.toggleLeft(!1),t.go("app.settings").then((function(){return e.showHelpTip("helptip-settings-btn-unit-relative",{bindings:{content:"HELP.TIP.SETTINGS_CHANGE_UNIT",contentParams:o,icon:{position:"right",style:"margin-right: 60px"},hasNext:i},timeout:1e3})}))}];return d.default().then((function(t){return o=t.parameters,e.executeStep("settings",s,n)}))},e.finishTour=function(){return a.isOpen()&&a.toggleLeft(!1),m.isLogin()?t.go("app.view_wallet").then((function(){return e.showHelpTip("helptip-wallet-certifications",{bindings:{content:"HELP.TIP.END_LOGIN",hasNext:!1}})})):s.all([e.showHome(),d.default().then((function(e){n=e}))]).then((function(){return e.showHelpTip("helptip-home-logo",{bindings:{content:"HELP.TIP.END_NOT_LOGIN",contentParams:n,hasNext:!1}})}));var n}}function u(e){e.$on("$ionicView.enter",(function(n,t){e.startHelpTour()}))}function d(e,n,t,i,a,o,s,r,l,c,u,d){e.loading=!0,e.settings=u.data,e.likeData={views:{},likes:{},follows:{},abuses:{},stars:{}},e.$on("$ionicView.enter",(function(n,t){e.loading?e.loadWallet().then((function(n){e.formData=n,e.loading=!1,e.updateView(),o.loading.hide()})).catch((function(n){"CANCELLED"===n&&e.showHome()})):e.updateView(),e.$broadcast("$recordView.enter",t)})),e.updateView=function(){e.motion.show({selector:"#wallet .item"}),e.$broadcast("$$rebind::rebind")},e.$watchCollection("formData.events",(function(n,t){!t||e.loading||angular.equals(n,t)||e.updateView()})),e.setRegisterForm=function(n){e.registerForm=n},e.onWalletLogout=function(){delete e.qrcode,delete e.formData,e.loading=!0},s.api.data.on.logout(e,e.onWalletLogout),e.showUidPopup=function(){return n((function(n,i){r(["ACCOUNT.NEW.TITLE","ACCOUNT.POPUP_REGISTER.TITLE","ACCOUNT.POPUP_REGISTER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(i){e.formData.newUid=e.formData.uid?""+e.formData.uid:"",t.show({templateUrl:"templates/wallet/popup_register.html",title:i["ACCOUNT.POPUP_REGISTER.TITLE"],subTitle:i["ACCOUNT.POPUP_REGISTER.HELP"],scope:e,buttons:[{text:i["COMMON.BTN_CANCEL"]},{text:i["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.registerForm.$submitted=!0,e.registerForm.$valid&&e.formData.newUid)return e.formData.newUid;n.preventDefault()}}]}).then((function(t){if(!t)return delete e.formData.uid,void o.loading.hide();n(t)}))}))}))},e.self=function(){return e.hideActionsPopover(),e.showUidPopup().then((function(n){return o.loading.show(),s.self(n).then((function(){e.updateView(),o.loading.hide()})).catch((function(n){o.onError("ERROR.SEND_IDENTITY_FAILED")(n).then((function(){e.self()}))}))}))},e.doMembershipIn=function(n){return s.membership.inside().then((function(){e.updateView(),o.loading.hide()})).catch((function(t){!n||n<=2?i((function(){e.doMembershipIn(n?n+1:1)}),1e3):o.onError("ERROR.SEND_MEMBERSHIP_IN_FAILED")(t).then((function(){e.membershipIn()}))}))},e.membershipIn=function(){return e.hideActionsPopover(),e.formData.isMember?o.alert.info("INFO.NOT_NEED_MEMBERSHIP"):e.showUidPopup().then((function(n){o.loading.show(),e.formData.blockUid&&n==e.formData.uid?e.doMembershipIn():(e.formData.blockUid=null,e.formData.uid=n,s.self(n,!1).then((function(){e.doMembershipIn()})).catch((function(n){o.onError("ERROR.SEND_IDENTITY_FAILED")(n).then((function(){e.membershipIn()}))})))})).catch((function(n){o.loading.hide(),o.alert.info(n),e.membershipIn()}))},e.membershipOut=function(n,t){return e.hideActionsPopover(),n?t?(o.loading.show(),s.membership.out().then((function(){o.loading.hide(),o.toast.show("INFO.MEMBERSHIP_OUT_SENT")})).catch(o.onError("ERROR.SEND_MEMBERSHIP_OUT_FAILED"))):o.alert.confirm("CONFIRM.MEMBERSHIP_OUT_2","CONFIRM.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then((function(n){n&&e.membershipOut(!0,!0)})):o.alert.confirm("CONFIRM.MEMBERSHIP_OUT","CONFIRM.POPUP_WARNING_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then((function(n){n&&e.membershipOut(!0)}))},e.doUpdate=function(){return console.debug("[wallet] Updating wallet..."),o.loading.show().then((function(){return s.refreshData()})).then((function(){return o.loading.hide()})).then((function(){e.updateView()})).catch(o.onError("ERROR.REFRESH_WALLET_DATA"))},e.renewMembership=function(n){return e.formData.isMember?n||e.formData.requirements.needRenew?o.alert.confirm("CONFIRM.RENEW_MEMBERSHIP").then((function(n){if(n)return o.loading.show(),e.doMembershipIn()})).catch((function(n){o.loading.hide(),o.alert.error(n).then(e.renewMembership)})):r("CONFIRM.NOT_NEED_RENEW_MEMBERSHIP",{membershipExpiresIn:e.formData.requirements.membershipExpiresIn}).then((function(e){return o.alert.confirm(e)})).then((function(n){n&&e.renewMembership(!0)})):o.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")},e.fixIdentity=function(){if(e.formData.uid)return r("CONFIRM.FIX_IDENTITY",{uid:e.formData.uid}).then((function(e){return o.alert.confirm(e)})).then((function(n){if(n)return o.loading.show(),e.formData.blockUid=null,e.formData.sigDate=null,s.self(e.formData.uid)})).then((function(){return e.doMembershipIn()})).catch((function(n){o.loading.hide(),o.alert.error(n).then((function(){e.fixIdentity()}))}))},e.fixMembership=function(){if(e.formData.uid)return o.alert.confirm("CONFIRM.FIX_MEMBERSHIP").then((function(n){if(n)return o.loading.show(),e.formData.blockUid=null,e.formData.sigDate=null,Wallet.self(e.formData.uid,!1)})).then((function(){return e.doMembershipIn()})).catch((function(n){o.loading.hide(),o.alert.info(n),e.fixMembership()}))},e.doQuickFix=function(n){"renew"===n?e.renewMembership():"fixMembership"===n?e.fixMembership():"fixIdentity"===n&&e.fixIdentity()},e.showTransferModal=function(){e.walletData.balance&&e.walletData.balance>0?c.showTransfer().then((function(n){n&&(o.toast.show("INFO.TRANSFER_SENT"),e.$broadcast("$$rebind::balance"),e.motion.show({selector:".item-pending"}))})):o.alert.info("INFO.NOT_ENOUGH_CREDIT")},e.startWalletTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(n,t){if(n=angular.isDefined(n)?n:u.data.helptip.wallet,t=!!angular.isDefined(t)&&t,!(n<0)){var i=e.createHelptipScope(t);if(i)return i.tour=t,i.startWalletTour(n,!1).then((function(e){i.$destroy(),t||(u.data.helptip.wallet=e,u.store())}))}},e.showQRCode=function(n,t,i){e.qrcode||(e.qrcode=new QRCode(n,{text:t,width:200,height:200,correctLevel:QRCode.CorrectLevel.L}),o.motion.toggleOn({selector:"#wallet #"+n+".qrcode"},i||1100))},e.showCertifications=function(){a.go(o.screen.isSmall()?"app.wallet_cert":"app.wallet_cert_lg",{pubkey:e.formData.pubkey,uid:e.formData.name||e.formData.uid,type:"received"})},e.showGivenCertifications=function(){a.go(o.screen.isSmall()?"app.wallet_cert":"app.wallet_cert_lg",{pubkey:e.formData.pubkey,uid:e.formData.name||e.formData.uid,type:"given"})},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):l.fromTemplateUrl("templates/wallet/popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSharePopover=function(n){e.hideActionsPopover();var t=e.formData.name||e.formData.uid||e.formData.pubkey,i=d.getUrl("/user/profile/"+e.formData.pubkey+"/_share");o.screen.isSmall()&&(n=angular.element(document.querySelector("#wallet-share-anchor"))||n),o.popover.share(n,{bindings:{url:i,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},postMessage:t}})},e.showSecurityModal=function(){e.hideActionsPopover(),c.showAccountSecurity()}}function p(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E){e.search={text:"",loading:!0,type:null,results:[]},e._source=["issuer","title","city","time","avatar._content_type"],e.entered=!1,e.wotSearchTextId="wotSearchText",e.enableFilter=!0,e.allowMultiple=!1,e.selection=[],e.showResultLabel=!0,e.parameters={},e.enter=function(n,a){e.entered||(a.stateParams&&a.stateParams.q?(e.search.text=a.stateParams.q,t((function(){e.doSearch()}),100)):a.stateParams&&a.stateParams.hash?(e.search.text="#"+a.stateParams.hash,t((function(){e.doSearch()}),100)):t((function(){"newcomers"!==a.stateParams.type&&(r.initPhase||a.stateParams.type)||e.doGetNewcomers(0,void 0,!0)}),100),i(e.wotSearchTextId),e.entered=!0,t(s.ink,100),e.showHelpTip())},e.$on("$ionicView.enter",e.enter),e.resetWotSearch=function(){e.search={text:null,loading:!1,type:"newcomers",results:[]}},e.updateLocationHref=function(){var t={q:void 0,hash:void 0,type:void 0};if("text"===e.search.type){var i=e.search.text.trim();i.match(/^#[\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/)?t.hash=i.substr(1):t.q=i}else t.type=e.search.type;o.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),n.go("app.wot_lookup",t,{reload:!1,inherit:!0,notify:!1})},e.doSearchText=function(){e.doSearch(),e.updateLocationHref()},e.doSearch=function(n,t){var i=e.search.text.trim();if(s.screen.isSmall()&&i.length<3||!i.length)return e.search.results=[],e.search.type="none",$q.when();e.search.loading=!0;var a={from:n||0,size:t||10,_source:e._source};return e.search.type="text",E.searchText(i,a).then((function(a){"text"===e.search.type&&e.search.text.trim()===i&&(a&&a.length||!d.regexp.PUBKEY.test(i)?e.doDisplayResult(a,n,t):e.doDisplayResult([{pubkey:i}]))})).catch(s.onError("ERROR.WOT_LOOKUP_FAILED"))},e.doGetNewcomers=function(n,t,i){n=n||0,(t=t||10)<10&&(t=10),e.hideActionsPopover(),e.search.loading=0===n,e.search.type="newcomers",n||i||e.updateLocationHref();var a={index:"user",type:"profile",from:n,size:t,sort:{time:"desc"}};return E.search(a).then((function(i){return"newcomers"===e.search.type&&(e.doDisplayResult(i,n,t),!0)})).catch((function(t){e.search.loading=!1,e.search.results=n>0?e.search.results:[],e.search.hasMore=!1,s.onError("ERROR.LOAD_NEWCOMERS_FAILED")(t)}))},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,("newcomers"===e.search.type?e.doGetNewcomers:e.doGetPending)(n).then((function(n){n&&(e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete"))})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.select=function(e){p.isUserPubkey(e.pubkey)?n.go("app.view_wallet"):n.go("app.wot_identity",{pubkey:e.pubkey,uid:e.uid})},e.next=function(){alert("Selected identities:",e.selection)},e.toggleCheck=function(n,t){var i=e.search.results[n];i.checked?e.addToSelection(i):e.removeSelection(i,t)},e.toggleSelect=function(e){e.selected=!e.selected},e.addToSelection=function(n){var t=angular.copy(n);t.name&&(t.name=t.name.replace("<em>","").replace("</em>","")),e.selection.push(t)},e.removeSelection=function(n,t){var i=_.findWhere(e.selection,{id:n.id});if(i&&e.selection.splice(e.selection.indexOf(i),1),!e.search.loading){var a=_.findWhere(e.search.results,{id:n.id});a&&a.checked&&(a.checked=!1)}},e.scanQrCode=function(){u.barcode.enable&&u.barcode.scan().then((function(n){n&&d.uri.parse(n).then((function(t){t.pubkey?e.search.text=t.pubkey:n.uid?e.search.text=t.uid:e.search.text=n,e.doSearch()}))})).catch(s.onError("ERROR.SCAN_FAILED"))},e.showHelpTip=function(){if(e.isLogin()){var n=angular.isDefined(n)?n:c.data.helptip.wot;if(!(n<0)){0===n&&(n=1);var t=e.createHelptipScope();if(t)return t.startWotTour(n,!1).then((function(e){t.$destroy(),c.data.helptip.wot=e,c.store()}))}}},e.doDisplayResult=function(n,t,i){n=n||{},e.allowMultiple&&n.length&&e.selection.length&&_.forEach(e.selection,(function(e){var t=_.findWhere(n,{id:e.id});t&&(t.checked=!0)})),e.search.results=t?e.search.results.concat(n):n||[],e.search.loading=!1,e.search.hasMore=n.length&&e.search.results.length>=t+i,e.smallscreen=s.screen.isSmall(),e.search.results.length&&n.length>0&&e.motion&&e.motion.show({selector:".lookupForm .list .item",ink:!0})},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):a.fromTemplateUrl("templates/wot/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()}}function m(e,n,t,i){angular.extend(this,n("WotLookupCtrl",{$scope:e})),i=i||{},e.search.loading=!1,e.enableFilter=!!angular.isDefined(i.enableFilter)&&i.enableFilter,e.allowMultiple=!!angular.isDefined(i.allowMultiple)&&i.allowMultiple,e.parameters=i,e.showResultLabel=!1,e.wotSearchTextId="wotSearchTextModal",e.allowMultiple&&i.selection&&(e.selection=i.selection),e.cancel=function(){e.closeModal()},e.select=function(n){e.closeModal({pubkey:n.pubkey,uid:n.uid,name:n.name&&n.name.replace(/<\/?em>/gi,"")})},e.next=function(){e.closeModal(e.selection)},e.updateLocationHref=function(){},e.showHelpTip=function(){},t(e.wotSearchTextId)}function E(e,n,t,i,a,o,s,r,l,c,u){e.formData={hasSelf:!0},e.disableCertifyButton=!0,e.loading=!0,e.load=function(n,t,i){return c.load(n,t,i).then((function(t){if(!t)return o.onError("ERROR.IDENTITY_NOT_FOUND")().then(e.showHome);e.formData=t,e.revoked=t.requirements&&(t.requirements.revoked||t.requirements.pendingRevocation),e.canCertify=t.hasSelf&&(!u.isLogin()||!u.isUserPubkey(n))&&!e.revoked,e.canSelectAndCertify=t.hasSelf&&u.isUserPubkey(n),e.alreadyCertified=!(!e.canCertify||!u.isLogin()||!_.findWhere(t.received_cert,{pubkey:u.data.pubkey,valid:!0})&&!_.findWhere(t.received_cert_pending,{pubkey:u.data.pubkey,valid:!0})),e.disableCertifyButton=e.alreadyCertified||e.revoked,e.loading=!1})).catch((function(n){e.loading=!1,o.onError("ERROR.LOAD_IDENTITY_FAILED")(n)}))},e.removeActionParamInLocationHref=function(e){if(e&&e.stateParams&&e.stateParams.action){var n=angular.copy(e.stateParams);n.action=null,a.nextViewOptions({disableAnimate:!0,disableBack:!1,historyRoot:!1}),t.go(e.stateName,n,{reload:!1,inherit:!0,notify:!1})}},e.showSharePopover=function(n){var t=e.formData.name||e.formData.uid||e.formData.pubkey,i=r.getUrl("/user/profile/"+e.formData.pubkey+"/_share");o.screen.isSmall()&&(n=angular.element(document.querySelector("#wot-share-anchor-"+e.formData.pubkey))||n),o.popover.share(n,{bindings:{url:i,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},postMessage:t}})}}function g(e,n,t,i,a,o){angular.extend(this,t("WotIdentityAbstractCtrl",{$scope:e})),e.motion=a.motion.fadeSlideInRight,e.options=e.options||{},e.options.like={kinds:["VIEW","LIKE","ABUSE","FOLLOW","STAR"],index:"user",type:"profile"},e.likeData={views:{},likes:{},follows:{},abuses:{},stars:{}},e.$on("$ionicView.enter",(function(n,t){var a=function(){e.doMotion(),t.stateParams&&t.stateParams.action&&(i((function(){e.doAction(t.stateParams.action.trim())}),100),e.removeActionParamInLocationHref(t),e.likeData.id=e.formData.pubkey)};if(t.stateParams&&t.stateParams.pubkey&&t.stateParams.pubkey.trim().length>0){if(e.loading)return e.load(t.stateParams.pubkey.trim(),!0,t.stateParams.uid).then(a)}else if(t.stateParams&&t.stateParams.uid&&t.stateParams.uid.trim().length>0){if(e.loading)return e.load(null,!0,t.stateParams.uid).then(a)}else if(o.isLogin()){if(e.loading)return e.load(o.data.pubkey,!0,o.data.uid).then(a)}else e.showHome()})),e.doMotion=function(){e.motion.show({selector:".view-identity .list .item"}),e.$broadcast("$csExtension.motion")}}function h(e,n,t,i,a,o,s,r,l,c,u,d,p,m){e.formData=angular.copy(p.data),e.popupData={},e.loading=!0,e.nodePopup={},e.bma=c,e.$on("$ionicView.enter",(function(){p.ready().then(e.load)})),e.setPopupForm=function(n){e.popupForm=n},e.load=function(){return e.loading=!0,e.locales=angular.copy(p.locales),angular.merge(e.formData,p.data),e.formData.locale=p.data.locale&&p.data.locale.id&&_.findWhere(e.locales,{id:p.data.locale.id})||_.findWhere(e.locales,{id:p.defaultSettings.locale.id}),o((function(){e.loading=!1,r.ink({selector:".item"}),e.showHelpTip()}),100)},e.reset=function(){e.actionsPopover&&e.actionsPopover.hide(),e.pendingSaving=!0,p.reset().then(m.restart).then((function(){e.load(),e.pendingSaving=!1}))},e.changeLanguage=function(e){s.use(e)},e.changeNode=function(n){var t=e.formData.node.port&&80!=e.formData.node.port&&443!=e.formData.node.port?e.formData.node.port:void 0;n=n||{host:e.formData.node.host,port:t,useSsl:angular.isDefined(e.formData.node.useSsl)?e.formData.node.useSsl:443==e.formData.node.port},e.showNodePopup(n).then((function(n){if(n.host!==e.formData.node.host||n.port!==e.formData.node.port||n.useSsl!==e.formData.node.useSsl||e.formData.node.temporary){r.loading.show();var t=c.instance(n.host,n.port,n.useSsl,!0);t.isAlive().then((function(a){return a?(r.loading.hide(),angular.merge(e.formData.node,n),delete e.formData.node.temporary,c.copy(t),e.bma=c,m.restart(),i.clearCache()):(r.loading.hide(),r.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeNode(n)})))}))}}))},e.showNodeList=function(){var n=!!("true"===d.httpsMode||!0===d.httpsMode||"force"===d.httpsMode||t.location&&"https:"===t.location.protocol);return a._popupStack[0].responseDeferred.promise.close(),l.showNetworkLookup({enableFilter:!0,bma:!0,ssl:!!n||void 0}).then((function(e){if(e){var n=e.getBMA();return{host:n.dns?n.dns:e.hasValid4(n)?n.ipv4:n.ipv6,port:n.port||80,useSsl:n.useSsl||443==n.port}}})).then((function(n){e.changeNode(n)}))},e.showNodePopup=function(t){return n((function(n,i){e.popupData.newNode=t.port?[t.host,t.port].join(":"):t.host,e.popupData.useSsl=t.useSsl,e.popupForm&&e.popupForm.$setPristine(),s(["SETTINGS.POPUP_PEER.TITLE","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(t){a.show({templateUrl:"templates/settings/popup_node.html",title:t["SETTINGS.POPUP_PEER.TITLE"],scope:e,buttons:[{text:t["COMMON.BTN_CANCEL"]},{text:t["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};n.preventDefault()}}]}).then((function(e){if(e){var t=e.server.split(":");t[1]=t[1]?t[1]:e.useSsl?443:80,n({host:t[0],port:t[1],useSsl:e.useSsl})}else r.loading.hide()}))}))}))},e.save=function(){return e.loading||e.pendingSaving?n.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.save()}),500)):(e.saving=!0,o((function(){return e.cleanupHelpTip(),p.apply(e.formData),p.store()}),100).then((function(){e.saving=!1})))},e.onDataChanged=function(t,i,a){return e.loading||e.pendingSaving?n.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.onDataChanged(t,i,a)}),500)):void(a!==e||angular.equals(t,i)||e.save())},e.$watch("formData",e.onDataChanged,!0),e.getServer=function(){return e.formData.node&&e.formData.node.host?u.getServer(e.formData.node.host,e.formData.node.port):""},e.cleanupHelpTip=function(){if(e.formData.helptip.enable!==p.data.helptip.enable){var n=e.formData.helptip.enable;e.formData.helptip=angular.merge({},p.defaultSettings.helptip),e.formData.helptip.enable=n}},e.showActionsPopover=function(n){r.popover.show(n,{templateUrl:"templates/settings/popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.startSettingsTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(n,t){if((e.isLogin()||t)&&!((n=angular.isDefined(n)?n:p.data.helptip.settings)<0)){0===n&&(n=1);var i=e.createHelptipScope(t);if(i)return i.startSettingsTour(n,!1).then((function(e){i.$destroy(),p.data.helptip.settings=e,p.store()}))}}}function b(e){var n=this;Object.keys(e).forEach((function(t){n[t]=e[t]})),n.endpoints=n.endpoints||[]}function f(e,n){var t,i={user:"EVENT.USER.",page:"EVENT.PAGE.",market:"EVENT.MARKET."},a=this;function o(e){return e?e.substr(0,4)+e.substr(e.length-4):""}if(e=e||{},a.id=e.id||""+Date.now(),a.type=e.type&&e.type.toLowerCase(),a.time=e.time,a.hash=e.hash,a.read=!!e.read_signature,a.message=e.reference&&i[e.reference.index]?i[e.reference.index]+e.code:"EVENT."+e.code,a.params=e.params,n&&"function"==typeof n&&(a.markAsReadCallback=n),a.markAsRead=function(){a.markAsReadCallback&&a.markAsReadCallback(a)},e.code=e.code||"",e.code.startsWith("MEMBER_"))a.avatarIcon="ion-person",a.icon="ion-information-circled positive",a.state="app.view_wallet",a.medianTime=a.time;else if(e.code.startsWith("TX_"))a.avatarIcon="ion-card",a.icon="TX_SENT"===e.code?"ion-paper-airplane dark":"ion-archive balanced",a.medianTime=a.time,(t=e.params.length>0?e.params[0]:null)&&-1==t.indexOf(",")&&(a.pubkey=t),a.state="app.view_wallet_tx",a.stateParams={refresh:!0};else if(e.code.startsWith("CERT_"))a.avatarIcon="CERT_RECEIVED"===e.code?"ion-ribbon-b":"ion-ribbon-a",a.icon="CERT_RECEIVED"===e.code?"ion-ribbon-b balanced":"ion-ribbon-a gray",a.pubkey=e.params.length>0?e.params[0]:null,a.medianTime=a.time,a.state="app.wallet_cert",a.stateParams={type:"CERT_RECEIVED"===e.code?"received":"given"};else if(e.code.startsWith("MESSAGE_"))a.avatarIcon="ion-email",a.icon="ion-email dark",(t=e.params.length>0?e.params[0]:null)&&-1===t.indexOf(",")&&(a.pubkey=t),a.id=e.reference.id;else if(e.reference&&"user"===e.reference.index&&"profile"===e.reference.type)if(a.pubkey=e.params.length>0?e.params[0]:null,a.state="app.wot_identity",a.stateParams={pubkey:a.pubkey,uid:e.params&&e.params[3]},e.code.startsWith("LIKE_")?(a.avatarIcon="ion-person",a.icon="ion-ios-heart positive"):e.code.startsWith("STAR_")?(a.avatarIcon="ion-person",a.icon="ion-star gray"):e.code.startsWith("FOLLOW_")?(a.avatarIcon="ion-person",a.icon="ion-ios-people gray"):e.code.startsWith("ABUSE_")&&(a.avatarIcon="ion-person",a.icon="ion-android-warning assertive"),e.code.startsWith("MODERATION_")){a.state="app.wot_identity",a.stateParams={pubkey:e.reference.id,uid:e.params&&e.params[3]},a.avatarIcon="ion-alert-circled",a.icon="ion-alert-circled energized";var s=e.params&&e.params[4]||0;"MODERATION_RECEIVED"===e.code&&5==s&&(a.message="EVENT.USER.DELETION_RECEIVED",a.icon="ion-trash-a assertive")}else a.icon="ion-person dark",a.state="app.view_wallet";else e.reference&&"page"===e.reference.index?(a.pubkey=e.params.length>0?e.params[0]:null,a.avatarIcon="ion-social-buffer",e.reference.anchor?(a.icon="ion-ios-chatbubble-outline dark",a.state="app.view_page_anchor",a.stateParams={id:e.reference.id,title:e.params[1],anchor:o(e.reference.anchor)}):(a.icon="ion-social-buffer dark",a.state="app.view_page",a.stateParams={id:e.reference.id,title:e.params[1]}),e.code.startsWith("LIKE_")?(a.icon="ion-ios-heart positive",a.state="app.wot_identity",a.stateParams={pubkey:a.pubkey,uid:e.params&&e.params[3]}):e.code.startsWith("FOLLOW_")?(a.avatarIcon="ion-person",a.state="app.wot_identity",a.stateParams={pubkey:a.pubkey,uid:e.params&&e.params[3]}):e.code.startsWith("ABUSE_")?(a.icon="ion-alert-circled energized",a.state="app.wot_identity",a.stateParams={pubkey:a.pubkey,uid:e.params&&e.params[3]}):e.code.startsWith("MODERATION_")&&(a.avatarIcon="ion-alert-circled",a.icon="ion-alert-circled energized",s=e.params&&e.params[4]||0,"MODERATION_RECEIVED"===e.code&&5==s&&(a.message="EVENT.PAGE.DELETION_RECEIVED",a.icon="ion-trash-a assertive"))):e.reference&&"market"===e.reference.index?(a.avatarIcon="ion-speakerphone",a.pubkey=e.params.length>0?e.params[0]:null,e.reference.anchor?(a.icon="ion-ios-chatbubble-outline dark",a.state="app.market_view_record_anchor",a.stateParams={id:e.reference.id,title:e.params[2],anchor:o(e.reference.anchor)}):(a.icon="ion-speakerphone dark",a.state="app.market_view_record",a.stateParams={id:e.reference.id,title:e.params[2]}),e.code.startsWith("LIKE_")?a.icon="ion-ios-heart positive":e.code.startsWith("FOLLOW_")?a.avatarIcon="ion-person":e.code.startsWith("ABUSE_")?a.icon="ion-alert-circled energized":e.code.startsWith("MODERATION_")&&(a.avatarIcon="ion-alert-circled",a.icon="ion-alert-circled energized","MODERATION_RECEIVED"===e.code&&5==s&&(a.message="EVENT.MARKET.DELETION_RECEIVED",a.icon="ion-trash-a assertive"))):"INFO"===e.type?(a.avatarIcon="ion-information",a.icon="ion-information-circled positive"):"WARN"===e.type?(a.avatarIcon="ion-alert-circled",a.icon="ion-alert-circled energized"):"ERROR"===e.type&&(a.avatarIcon="ion-close",a.icon="ion-close-circled assertive");return a}function T(e,n){var t=this;t.id=e,t.message=null,t.html=null,t.issuer=null,t.time=null,t.creationTime=null,t.reply_to=null,t.replyCount=0,t.parent=null,t.replies=[],t.onRemoveListeners=[],t.copy=function(e){t.message=e.message,t.html=e.html,t.issuer=e.issuer,t.time=e.time,t.creationTime=e.creationTime||t.time,t.id=e.id||t.id,t.reply_to=e.reply_to||t.reply_to,t.uid=e.uid||t.uid,t.name=e.name||t.name,t.avatarStyle=e.avatarStyle||t.avatarStyle,e.parent&&(t.parent=e.parent),e.replies&&t.setReplies(e.replies)},t.copyFromJson=function(e){t.message=e.message,t.issuer=e.issuer,t.time=e.time,t.creationTime=e.creationTime||t.time,t.reply_to=e.reply_to},t.addOnRemoveListener=function(e){e&&"function"==typeof e&&t.onRemoveListeners.push(e)},t.cleanAllListeners=function(){t.onRemoveListeners=[]},t.setReplies=function(e){t.removeAllReplies(),t.addReplies(e)},t.addReplies=function(e){e&&e.length&&(e=e.sort((function(e,n){return e.time-n.time})),_.forEach(e,(function(e){e.parent=t,t.replies.push(e)})),t.replyCount+=e.length)},t.containsReply=function(e){return-1!=t.replies.indexOf(e)},t.addReply=function(e){t.replyCount+=1,t.replies.push(e),t.replies=t.replies.sort((function(e,n){return e.time-n.time})),e.parent=t},t.removeAllReplies=function(){if(t.replyCount){var e=t.replies.splice(0,t.replies.length);t.replyCount=0,_.forEach(e,(function(e){e.remove()}))}},t.removeReply=function(e){var n=_.findIndex(t.replies,{id:e});-1!=n&&(t.replyCount--,delete t.replies.splice(n,1)[0].parent)},t.remove=function(){t.parent&&(t.parent.removeReply(t.id),delete t.parent),t.onRemoveListeners.length&&(_.forEach(t.onRemoveListeners,(function(e){e(t)})),t.issuer=null,t.message=null,t.cleanAllListeners())},n&&"object"==typeof n&&t.copyFromJson(n)}function v(e,n,t,i){e.selectNewPicture=function(n){if(i.enable)e.openPicturePopup();else{var t=angular.element(document.querySelector(n||"#pictureFile"));t&&t.length>0&&t[0].click()}},e.openPicturePopup=function(){i.camera.getPicture().then((function(n){e.pictures.push({src:"data:image/png;base64,"+n,isnew:!0})})).catch(n.onError("ERROR.TAKE_PICTURE_FAILED"))},e.fileChanged=function(t){if(t.target.files&&t.target.files.length){n.loading.show();var i=t.target.files[0];return n.image.resizeFile(i).then((function(i){e.pictures.push({src:i,isnew:!0}),t.target.value="",n.loading.hide(100)})).catch((function(e){console.error(e),t.target.value="",n.loading.hide()}))}},e.removePicture=function(n){e.pictures.splice(n,1)},e.favoritePicture=function(n){if(n>0){var t=e.pictures[n];e.pictures.splice(n,1),e.pictures.splice(0,0,t)}},e.rotatePicture=function(t){var i=e.pictures[t];n.image.rotateSrc(i.src).then((function(e){i.src=e}))}}function O(e,n,t,i){e.loading=!0,e.allCategories=[],e.categories=[],this.searchText="",this.title=i&&i.title,e.afterLoad=function(i){e.categories=i,e.allCategories=i,e.loading=!1,t((function(){n.ink()}),10)},this.doSearch=function(){var n=this.searchText.toLowerCase().trim();n.length>1?(e.loading=!0,e.categories=e.allCategories.reduce((function(e,t){return t.parent&&-1!=t.name.toLowerCase().search(n)?e.concat(t):e}),[]),e.loading=!1):e.categories=e.allCategories},i&&i.categories?e.afterLoad(i.categories):i&&i.load&&i.load().then((function(n){e.afterLoad(n)}))}function R(e,n,t,i,a,o,s){e.loading=!0,e.defaultCommentSize=5,e.formData={},e.comments={},e.$on("$recordView.enter",(function(n,t){e.loading?e.anchor=t&&t.stateParams.anchor:e.id&&e.load(e.id,{animate:!1})})),e.$on("$recordView.load",(function(n,t,i){e.id=t||e.id,e.service=i.comment||e.service,console.debug("[ES] [comment] Will use {"+e.service.index+"} service"),e.id&&e.load(e.id).then((function(){return a((function(){e.scrollToAnchor()}),500)}))})),e.load=function(n,t){return(t=t||{}).from=t.from||0,t.size=t.size||e.anchor&&-1,t.size=t.size||e.defaultCommentSize,t.animate=!angular.isDefined(t.animate)||t.animate,t.loadAvatarAllParent=!angular.isDefined(t.loadAvatarAllParent)||t.loadAvatarAllParent,e.loading=!0,e.service.load(n,t).then((function(i){!t.animate&&i.result.length&&_.forEach(i.result,(function(e){e.isnew=!0})),e.comments=i,e.comments.hasMore=i.total>i.result.length,e.loading=!1,e.service.changes.start(n,i,e),e.motion.show({selector:".comments .item",ink:!1})}))},e.$on("$recordView.beforeLeave",(function(){if(e.comments){if(!e.service)return void console.error("[comment] Comment controller has no service ! Unable to listen changes...");e.service.changes.stop(e.comments)}})),e.scrollToAnchor=function(){if(e.anchor){var n=document.getElementsByName(e.anchor);if(!n||!n.length)return a(e.scrollToAnchor,500);for(var t=0;t<n.length-1;t++)angular.element(n[t]).remove();o(e.anchor),a((function(){e.anchor=null}),1500)}},e.showMore=function(){e.load(e.id,{from:0,size:-1,loadAvatarAllParent:!1}).then((function(){e.motion.show({selector:".card-avatar"})}))},e.onKeypress=function(n){n&&10==n.charCode&&n.ctrlKey&&(e.save(),n.preventDefault())},e.save=function(){e.formData.message&&e.formData.message.length&&e.loadWallet({minData:!0,auth:!0}).then((function(){s.loading.hide();var n=e.formData;return e.formData={},e.focusNewComment(),e.service.save(e.id,e.comments,n)})).then((function(){e.comments.total++})).catch(s.onError("COMMENTS.ERROR.FAILED_SAVE_COMMENT"))},e.share=function(i,a){var o,r=angular.copy(t.params);r.anchor?(r.anchor=n("formatHash")(a.id),o=t.href(t.current.name,r,{absolute:!0})):o=t.href(t.current.name,r,{absolute:!0})+"/"+n("formatHash")(a.id);var l=_.findIndex(e.comments.result,{id:a.id}),c=o+"?u="+(a.uid||n("formatPubkey")(a.issuer));s.popover.show(i,{templateUrl:"templates/common/popover_share.html",scope:e,bindings:{titleKey:"COMMENTS.POPOVER_SHARE_TITLE",titleValues:{number:l?l+1:1},date:a.creationTime,value:c,postUrl:o,postMessage:a.message},autoselect:".popover-share input"})},e.edit=function(n){var t=new T;t.copy(n),e.formData=t},e.remove=function(n){n&&(n.remove(),e.comments.total--)},e.reply=function(n){n&&n.id&&(e.formData={parent:n},e.focusNewComment(!0))},e.cancel=function(){e.formData={},e.focusNewComment()},e.focusNewComment=function(e){s.screen.isSmall()?e&&i("comment-form-input"):i("comment-form-textarea")},e.removeParentLink=function(){delete e.formData.parent,delete e.formData.reply_to,e.focusNewComment()},e.toggleExpandedReplies=function(e,n){e.expandedReplies=e.expandedReplies||{},e.expandedReplies[n]=!e.expandedReplies[n]},e.toggleExpandedParent=function(e,n){e.expandedParent=e.expandedParent||{},e.expandedParent[n]=!e.expandedParent[n]}}function N(e,n,t,i,a){e.socialData={url:null,reorder:!1},e.addSocialNetwork=function(){if(e.socialData.url&&0!==e.socialData.url.trim().length){e.formData.socials=e.formData.socials||[];var o=e.socialData.url.trim();if(_.findWhere(e.formData.socials,{url:o}))e.socialData.url="";else{var s=a.get(o);if(!s)return i.alert.error("PROFILE.ERROR.INVALID_SOCIAL_NETWORK_FORMAT"),void n("socialUrl");e.formData.socials.push(s),e.socialData.url="",e.motion.show({selector:"#social-"+t("formatSlug")(s.url),startVelocity:1e4})}}},e.editSocialNetwork=function(t){var i=e.formData.socials[t];e.formData.socials.splice(t,1),e.socialData.url=i.url,n("socialUrl")},e.reorderSocialNetwork=function(n,t,i){n&&t!=i&&(e.formData.socials.splice(t,1),e.formData.socials.splice(i,0,n))},e.filterFn=function(e){return!e.recipient||e.valid}}function I(e){e.openSocial=function(n,t){return n.stopPropagation(),e.openLink(n,t.url,{type:t.type})},e.filterFn=function(e){return!e.recipient||e.valid}}function S(e){e.formData={initCrop:!1,imageCropStep:0,imgSrc:void 0,result:void 0,resultBlob:void 0},e.openFileSelector=function(){var e=angular.element(document.querySelector(".modal-avatar #fileInput"));e&&e.length>0&&e[0].click()},e.fileChanged=function(n){var t=n.target.files,i=new FileReader;i.readAsDataURL(t[0]),i.onload=function(n){var t=this.result;e.$applyAsync((function(){e.formData.imgSrc=t}))}},e.doNext=function(){2==e.formData.imageCropStep?e.doCrop():3==e.formData.imageCropStep&&e.closeModal(e.formData.result)},e.doCrop=function(){e.formData.initCrop=!0},e.clear=function(){e.formData={initCrop:!1,imageCropStep:1,imgSrc:void 0,result:void 0,resultBlob:void 0}}}function A(e,n,t,i){var a=n.plugins&&n.plugins.es&&n.plugins.es.defaultCountry,o=!1;e.options=e.options||{},e.options.position=e.options.position||{showCheckbox:!0,required:!1},e.formPosition={loading:!1,enable:!!angular.isDefined(e.options.position.required)&&e.options.position.required},e.tryToLocalize=function(){if(!e.formPosition.loading&&!o){var n=e.getAddressToSearch();return n?(e.formPosition.loading=!0,t.point.searchByAddress(n).then((function(t){return t&&1==t.length?e.updateGeoPoint(t[0]):e.openSearchLocationModal({text:n,results:t||[],forceFallback:!t||!t.length})})).then((function(){e.formPosition.loading=!1})).catch((function(n){console.error(n),e.formPosition.loading=!1}))):(o=!0,t.point.current().then(e.updateGeoPoint).then((function(){o=!1})).catch((function(e){console.error(e),o=!1})))}},e.onCityChanged=function(){if(!e.loading)return e.formPosition.enable?(e.formData.geoPoint&&(e.formData.geoPoint.lat=void 0,e.formData.geoPoint.lon=void 0),e.tryToLocalize()):void 0},e.onUseGeopointChanged=function(){e.loading||(e.formPosition.enable?e.tryToLocalize():e.formData.geoPoint&&(e.formData.geoPoint.lat=void 0,e.formData.geoPoint.lon=void 0,e.dirty=!0))},e.onGeopointChanged=function(){e.loading&&(e.formPosition.enable=e.formData.geoPoint&&!!e.formData.geoPoint.lat&&!!e.formData.geoPoint.lon)},e.$watch("formData.geoPoint",e.onGeopointChanged),e.getAddressToSearch=function(){return e.formData.address&&e.formData.city?[e.formData.address.trim(),e.formData.city.trim()].join(", "):e.formData.city||e.formData.address||e.formData.location},e.updateGeoPoint=function(n){if(n&&n.lat&&n.lon&&(e.dirty=!0,e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=parseFloat(n.lat),e.formData.geoPoint.lon=parseFloat(n.lon),n.address&&n.address.city)){var t=[n.address.city];n.address.postcode&&t.push(n.address.postcode),n.address.country!=a&&t.push(n.address.country),e.formData.city=t.join(", ")}},e.openSearchLocationModal=function(n){var t={text:(n=n||{}).text||e.getAddressToSearch(),results:n.results,fallbackText:n.fallbackText||e.formData.city,forceFallback:angular.isDefined(n.forceFallback)?n.forceFallback:void 0};return i.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0}).then(e.updateGeoPoint)}}function C(e,n,t,i,a){var o=t.plugins&&t.plugins.es&&t.plugins.es.defaultCountry,s=!1;e.geoDistanceLabels=[5,10,20,50,100,250,500].reduce((function(e,n){return e[n]={labelKey:"LOCATION.DISTANCE_OPTION",labelParams:{value:n}},e}),{}),e.geoDistances=_.keys(e.geoDistanceLabels),e.searchPosition=function(t){if(s)return n.when();s=!0;var a=t?i.point.searchByAddress(t).then((function(n){return n&&1==n.length?(n[0].exact=!0,n[0]):e.openSearchLocationModal({text:t,results:n||[],forceFallback:!n||!n.length}).then((function(e){if(e&&e.address&&e.address.city){var n=[e.address.city];e.address.postcode&&n.push(e.address.postcode),e.address.country!=o&&n.push(e.address.country),e.shortName=n.join(", ")}return e}))})):i.point.current();return a.then((function(e){if(s=!1,e&&e.lat&&e.lon)return{lat:parseFloat(e.lat),lon:parseFloat(e.lon),name:e.shortName,exact:e.exact}})).catch((function(e){console.error(e),s=!1})),a},e.openSearchLocationModal=function(n){var t={text:(n=n||{}).text||e.getAddressToSearch(),results:n.results,fallbackText:n.fallbackText||e.search.location,forceFallback:angular.isDefined(n.forceFallback)?n.forceFallback:void 0};return a.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0})}}function D(e,n,t,i,a,o){var s=a.plugins&&a.plugins.es&&a.plugins.es.defaultCountry,r=!1;e.locations=void 0,e.selectLocationIndex=-1,e.onKeydown=function(n){switch(n.keyCode){case 27:e.hideDropdown();break;case 13:e.locations&&e.locations.length&&e.onEnter();break;case 38:e.onArrowUpOrDown(-1),n.preventDefault();break;case 40:e.onArrowUpOrDown(1),n.preventDefault();break;case 8:case 45:case 46:break;case 37:case 39:case 16:case 17:case 35:case 36:break;default:e.showDropdown()}},e.onEnter=function(){e.selectLocationIndex>-1?e.selectLocation(e.locations[e.selectLocationIndex]):e.selectLocation(e.locations[0])},e.onArrowUpOrDown=function(n){e.locations&&(e.selectLocationIndex+=n,e.selectLocationIndex>=e.locations.length&&(e.selectLocationIndex=0),e.selectLocationIndex<0&&(e.selectLocationIndex=e.locations.length-1),_.forEach(e.locations||[],(function(n,t){n.selected=t==e.selectLocationIndex})))},e.onLocationChanged=function(){r||e.search.loading||(e.search.geoPoint=void 0,e.showDropdown())},e.showDropdown=function(){var n=e.search.location&&e.search.location.trim();if(!n||n.length<3)return e.hideDropdown(!0);var t=e.requestId&&e.requestId+1||1;return e.requestId=t,r=!0,o.point.searchByAddress(n).then((function(n){e.requestId==t&&(r=!1,e.locations=n||[],e.license=n&&n.length&&n[0].license)})).catch((function(n){throw e.hideDropdown(),n}))},e.hideDropdown=function(t){return t?(e.locations=void 0,e.selectLocationIndex=-1,e.license=void 0,void(r=!1)):n((function(){r||(e.locations=void 0,e.license=void 0,r=!1)}),500)},e.selectLocation=function(n,t){if(r=!0,n)if(e.search.geoPoint=e.search.geoPoint||{},e.search.geoPoint.lat=parseFloat(n.lat),e.search.geoPoint.lon=parseFloat(n.lon),t)e.search.geoPoint.exact=!0;else if(n&&n.address&&n.address.city){var i=[n.address.city];n.address.postcode&&i.push(n.address.postcode),n.address.country!=s&&i.push(n.address.country),e.search.location=i.join(", ")}e.hideDropdown(!0)},e.openSearchLocationModal=function(n){var t={text:(n=n||{text:e.search.location}).text||e.search.location};return i.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0}).then(e.selectLocation)},e.showDistancePopover=function(n){t.popover.show(n,{templateUrl:"plugins/es/templates/common/popover_distances.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.selectDistance=function(n){e.search.geoDistance=n,e.actionsPopover&&e.actionsPopover.hide()}}function y(e,n,t,i,a){e.search={text:a.text||"",fallbackText:a.fallbackText||void 0,forceFallback:!!angular.isDefined(a.forceFallback)&&a.forceFallback,loading:!1,results:a.results||void 0},e.$on("modal.shown",(function(){e.doSearch(!0)})),e.doSearch=function(a){var o=e.search.text&&e.search.text.trim();if(!o)return n.when();e.search.loading=!0;var s=a&&e.search.fallbackText&&e.search.fallbackText.trim();return s=s&&s!=o?s:void 0,(a&&e.search.forceFallback&&e.search.results?n.when(e.search.results):i.point.searchByAddress(o)).then((function(e){return e&&e.length||!s?e:n.all([t("LOCATION.MODAL.ALTERNATIVE_RESULT_DIVIDER",{address:s}),i.point.searchByAddress(s)]).then((function(e){var n=e[0];return(e=e[1])&&e.length?[{name:n}].concat(e):e}))})).then((function(n){e.search.loading=!1,e.search.results=n||[],e.license=n&&n.length&&n[0].license})).catch((function(n){throw e.search.loading=!1,e.search.results=[],e.license=void 0,n}))}}function k(e,n,t,i,a,o,s,r){e.entered=!1,e.abuseData={},e.abuseLevels=[{value:1,label:"LOW"},{value:2,label:"LOW"}],e.staring=!1,e.options=e.options||{},e.options.like=e.options.like||{kinds:r.constants.like.KINDS,index:void 0,type:void 0,id:void 0},e.$on("$recordView.enter",(function(n,t){e.entered?e.id&&e.loadLikes(e.id):e.entered=!1})),e.$on("$recordView.load",(function(n,t){e.id=t||e.id,e.id&&e.loadLikes(e.id)})),e.initLikes=function(){if(!e.likeData)throw Error("Missing 'likeData' in scope. Cannot load likes counter");if(!e.options.like.service){if(!e.options.like.index||!e.options.like.type)throw Error("Missing 'options.like.index' or 'options.like.type' in scope. Cannot load likes counter");e.options.like.service={count:r.like.count(e.options.like.index,e.options.like.type),add:r.like.add(e.options.like.index,e.options.like.type),remove:r.like.remove(e.options.like.index,e.options.like.type),toggle:r.like.toggle(e.options.like.index,e.options.like.type)}}e.options.like.kinds||(e.options.like.kinds=_.filter(r.constants.like.KINDS,(function(n){var t=n.toLowerCase()+"s";return angular.isDefined(e.likeData[t])})))},e.loadLikes=function(t){if(!e.likeData.loading){t=t||e.likeData.id,e.initLikes();var i=e.options.like.kinds||[];if(i.length){e.likeData.loading=!0;var a=Date.now();return console.debug("[ES] Loading counter of {0}... ({1})".format(t.substring(0,8),i)),n.all(_.map(i,(function(n){var i=n.toLowerCase()+"s";return e.options.like.service.count(t,{issuer:s.isLogin()?s.data.pubkey:void 0,kind:n}).then((function(n){e.likeData[i]&&angular.merge(e.likeData[i],n)}))}))).then((function(){e.likeData.id=t,console.debug("[ES] Loading counter of {0} [OK] in {1}ms".format(t.substring(0,8),Date.now()-a)),_.contains(i,"VIEW")&&!e.canEdit&&e.markAsView(),e.$parent&&(console.debug("[ES] [likes] Adding data and functions to parent scope"),e.$parent.toggleLike=e.toggleLike,e.$parent.reportAbuse=e.reportAbuse),e.likeData.loading=!1})).catch((function(n){console.error(n&&n.message||n),e.likeData.loading=!1}))}}},e.markAsView=function(){if(e.likeData&&e.likeData.views&&!e.likeData.views.wasHit&&!(e.canEdit||e.formData&&s.isUserPubkey(e.formData.issuer))){var n=t((function(){s.isLogin()&&e.options.like.service.add(e.likeData.id,{kind:"view"}).then((function(){e.likeData.views.total=(e.likeData.views.total||0)+1})),n=null}),3e3);e.$on("$destroy",(function(){n&&t.cancel(n)}))}},e.toggleLike=function(i,a){if(e.initLikes(),!e.likeData.id)throw Error("Missing 'likeData.id' in scope. Cannot apply toggle");(a=a||{}).kind=a.kind&&a.kind.toUpperCase()||"LIKE";var r=a.kind.toLowerCase()+"s";return e.likeData[r]=e.likeData[r]||{},!0===e.likeData[r].loading||e.likeData.loading?(i.preventDefault(),n.reject()):"LIKE"===a.kind&&e.dislikes&&e.dislikes.wasHit?e.toggleLike(i,{kind:"dislike"}).then((function(){e.toggleLike(i,a)})):"DISLIKE"===a.kind&&e.likes&&e.likes.wasHit?e.toggleLike(i,{kind:"LIKE"}).then((function(){e.toggleLike(i,a)})):(e.likeData[r].loading=!0,(s.isLogin()?n.when():e.loadWallet({minData:!0})).then((function(){return e.options.like.service.toggle(e.likeData.id,a)})).then((function(n){o.loading.hide(),0!==n&&(e.likeData[r].total=(e.likeData[r].total||0)+n,e.likeData[r].wasHit=n>0),t((function(){e.likeData[r].loading=!1}),1e3)})).catch((function(n){console.error(n),e.likeData[r].loading=!1,o.loading.hide(),i.preventDefault()})))},e.setAbuseForm=function(n){e.abuseForm=n},e.showAbuseCommentPopover=function(n){return i(["COMMON.REPORT_ABUSE.TITLE","COMMON.REPORT_ABUSE.SUB_TITLE","COMMON.BTN_SEND","COMMON.BTN_CANCEL"]).then((function(n){return o.loading.hide(),a.show({templateUrl:"plugins/es/templates/common/popup_report_abuse.html",title:n["COMMON.REPORT_ABUSE.TITLE"],subTitle:n["COMMON.REPORT_ABUSE.SUB_TITLE"],cssClass:"popup-report-abuse",scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"],type:"button-stable button-clear gray"},{text:n["COMMON.BTN_SEND"],type:"button button-positive ink",onTap:function(n){if(e.abuseForm.$submitted=!0,e.abuseForm.$valid&&e.abuseData.comment)return e.abuseData;n.preventDefault()}}]})})).then((function(n){if(e.abuseData={},n&&n.comment)return n;o.loading.hide()}))},e.reportAbuse=function(t,i){if(!(e.likeData&&e.likeData.abuses&&e.likeData.abuses.wasHit))return(i=i||{}).comment?(i.kind="ABUSE",e.toggleLike(t,i).then((function(){o.toast.show("COMMON.REPORT_ABUSE.CONFIRM.SENT")}))):(s.isLogin()?n.when():e.loadData({minData:!0})).then((function(){return e.showAbuseCommentPopover(t)})).then((function(n){if(n&&n.comment)return i.comment=n.comment,i.level=n.level||n.delete&&5||void 0,e.reportAbuse(t,i)}))},e.addStar=function(n){if(e.starsPopover)return e.starsPopover.hide().then((function(){e.starsPopover=null,e.addStar(n)}));if(!e.likeData.loading&&e.likeData.stars&&!e.likeData.stars.loading){if(!s.isLogin())return e.loadWallet({minData:!0}).then((function(t){if(t)return o.loading.show(),e.options.like.service.count(e.likeData.id,{issuer:t.pubkey,kind:"STAR"}).then((function(t){angular.merge(e.stars,t),e.addStar(n)}))})).catch((function(e){}));e.likeData.stars.loading=!0;var i=angular.merge({total:0,levelAvg:0,levelSum:0,level:0,wasHit:!1,wasHitId:void 0},e.likeData.stars),a=function(){i.wasHit=!0,i.level=n,i.levelAvg=Math.floor(10*(i.levelSum/i.total+.5))/10-.5,angular.merge(e.likeData.stars,i),o.loading.hide()};return i.wasHitId?(console.debug("[ES] Deleting previous star level... "+i.wasHitId),e.options.like.service.remove(i.wasHitId).catch((function(e){if(!e||404!==e.ucode)throw e})).then((function(){return console.debug("[ES] Deleting previous star level [OK]"),i.levelSum=i.levelSum-i.level+n,a(),t((function(){return console.debug("[ES] Sending new star level..."),e.options.like.service.add(e.likeData.id,{kind:"star",level:n||1})}),2e3)})).then((function(n){return i.wasHitId=n,console.debug("[ES] Star level successfully sent... "+n),o.loading.hide(),t((function(){e.likeData.stars.loading=!1}),1e3)})).catch((function(n){console.error(n&&n.message||n),e.likeData.stars.loading=!1,o.onError("MARKET.WOT.ERROR.FAILED_STAR_PROFILE")(n),e.loadLikes()}))):e.options.like.service.add(e.likeData.id,{kind:"star",level:n||1}).then((function(t){i.levelSum+=n,i.wasHitId=t,i.total+=1,a(),console.debug("[ES] Star level successfully sent... "+t),e.likeData.stars.loading=!1,o.loading.hide()})).catch((function(n){console.error(n&&n.message||n),e.likeData.stars.loading=!1,o.onError("MARKET.WOT.ERROR.FAILED_STAR_PROFILE")(n)}))}},e.removeStar=function(n){e.starsPopover&&e.starsPopover.hide(),e.likeData.loading||(e.likeData.stars.level=void 0,e.toggleLike(n,{kind:"star"}).then((function(){return t((function(){e.loadLikes()}),1e3)})))},e.showStarPopover=function(n){e.initLikes(),e.likeData.stars.loading||(angular.isUndefined(e.likeData.stars.level)&&(e.likeData.stars.level=0),o.popover.show(n,{templateUrl:"plugins/es/templates/common/popover_star.html",scope:e,autoremove:!0,afterShow:function(n){e.starsPopover=n}}))},s.api.data.on.reset(e,(function(){_.forEach(e.options.like.kinds||[],(function(n){var t=n.toLowerCase()+"s";e.likeData[t]&&(e.likeData[t].wasHit=!1,e.likeData[t].wasHitId=void 0,e.likeData[t].level=void 0)}))}),this)}function P(e,n,t){e.extensionPoint=t.extensions.points.current.get(),e.enable=n.isEnable(),n.api.state.on.changed(e,(function(n){e.enable=n,e.$broadcast("$$rebind::state")}))}function M(e,n,t){e.extensionPoint=t.extensions.points.current.get(),e.enable=n.isEnable(),n.api.state.on.changed(e,(function(n){e.enable=n}))}function w(e,n,t,i,a){e.extensionPoint=t.extensions.points.current.get(),e.enable=i.isEnable(),e.showRegistryLookupView=function(){n.go(a.screen.isSmall()?"app.registry_lookup":"app.registry_lookup_lg")},e.showNotificationsPopover=function(n){return a.popover.show(n,{templateUrl:"plugins/es/templates/notification/popover_notification.html",scope:e,autoremove:!1})},e.showMessagesPopover=function(n){return a.popover.show(n,{templateUrl:"plugins/es/templates/message/popover_message.html",scope:e,autoremove:!1})},e.showInvitationsPopover=function(n){return a.popover.show(n,{templateUrl:"plugins/es/templates/invitation/popover_invitation.html",scope:e,autoremove:!1})},i.api.state.on.changed(e,(function(n){e.enable=n}))}function U(e,n,t,i){e.updateView=function(){e.enable=i.isLogin()&&(t.data.plugins&&t.data.plugins.es?t.data.plugins.es.enable:!!t.data.plugins.host)},e.showEditUserProfile=function(){e.closeProfilePopover(),n.go("app.user_edit_profile")},t.api.data.on.changed(e,e.updateView),t.api.data.on.ready(e,e.updateView),i.api.data.on.login(e,(function(n,t){return t=t||$q.defer(),e.updateView(),t.resolve(),t.promise})),i.api.data.on.logout(e,e.updateView),e.updateView()}function x(e,n,t,i,a,o,s,r,l,c,u,d,p){e.hasWindowNotification=!!("Notification"in window),e.formData={},e.popupData={},e.loading=!0,e.enter=function(n,t){e.load()},e.$on("$ionicView.enter",e.enter),e.load=function(n){e.loading=!0;var t=e.formData.enable;e.formData=c.data.plugins&&c.data.plugins.es?angular.copy(c.data.plugins.es):{enable:!1,host:void 0,port:void 0},n&&t&&(e.formData.enable=t),e.isFallbackNode=e.formData.enable&&u.node.isFallback(),e.server=e.getServer(u),e.loading=!1},d.api.state.on.changed(e,(function(n){e.load(!0)})),e.setPopupForm=function(n){e.popupForm=n},e.changeEsNode=function(n){n=n||{host:e.formData.host,port:e.formData.port&&80!=e.formData.port&&443!=e.formData.port?e.formData.port:void 0,useSsl:angular.isDefined(e.formData.useSsl)?e.formData.useSsl:443==e.formData.port},e.showNodePopup(n).then((function(n){if(n.host!=e.formData.host||n.port!=e.formData.port||n.useSsl!=e.formData.useSsl){o.loading.show();var t=u.instance(n.host,n.port,n.useSsl);return t.isAlive().then((function(i){return i?(e.formData.host=t.host,e.formData.port=t.port,e.formData.useSsl=t.useSsl,u.copy(t)):(o.loading.hide(),o.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeEsNode(n)})))})).then((function(){e.server=e.getServer(u),e.isFallbackNode=!1,o.loading.hide()}))}o.loading.hide()}))},e.showNodePopup=function(n){return t((function(t,s){var r=[n.host];n.port&&80!=n.port&&r.push(n.port),e.popupData.newNode=r.join(":"),e.popupData.useSsl=angular.isDefined(n.useSsl)?n.useSsl:443==n.port,e.popupForm&&e.popupForm.$setPristine(),i(["ES_SETTINGS.POPUP_PEER.TITLE","ES_SETTINGS.POPUP_PEER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(n){a.show({templateUrl:"templates/settings/popup_node.html",title:n["ES_SETTINGS.POPUP_PEER.TITLE"],subTitle:n["ES_SETTINGS.POPUP_PEER.HELP"],scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"]},{text:n["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};n.preventDefault()}}]}).then((function(e){if(e){var n=e.server.split(":");n[1]=n[1]?n[1]:e.useSsl?443:80,t({host:n[0],port:n[1],useSsl:e.useSsl})}else o.loading.hide()}))}))}))},e.showNodeList=function(){var t=!!("true"===l.httpsMode||!0===l.httpsMode||"force"===l.httpsMode||n.location&&"https:"===n.location.protocol);return a._popupStack[0].responseDeferred.promise.close(),p.showNetworkLookup({enableFilter:!0,endpoint:u.constants.ES_GCHANGE_API,ssl:!!t||void 0}).then((function(e){if(e){var n=e.getEndpoints().reduce((function(e,n){var t=u.node.parseEndPoint(n);return t?e.concat(t):e}),[]);if(n.length){var t=n[0];return{host:t.dns?t.dns:e.hasValid4(t)?t.ipv4:t.ipv6,port:t.port||80,useSsl:t.useSsl||443==t.port}}}})).then((function(n){e.changeEsNode(n)}))},e.onFormChanged=function(){e.loading||(e.formData.notifications=e.formData.notifications||{},e.hasWindowNotification&&e.formData.notifications.emitHtml5!==("granted"===window.Notification.permission)?window.Notification.requestPermission((function(n){e.formData.notifications.emitHtml5="granted"===n,e.onFormChanged()})):(e.loading=!0,c.data.plugins=c.data.plugins||{},c.data.plugins.es=c.data.plugins.es?angular.merge(c.data.plugins.es,e.formData):e.formData,delete c.data.plugins.es.newNode,c.store().then((function(){e.loading=!1}))))},e.$watch("formData",e.onFormChanged,!0),e.getServer=function(n){if((n=n||e.formData).host)return r.getServer(n.host,n.port)}}function B(e,n,t,i,a){angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.showNewPageModal=function(e){return a.showNewPage(e)}}function F(e,n,t,i,a){e.options=e.options||{},e.options.like=e.options.like||{index:"user",type:"profile",service:a.like},e.canEdit=!0,angular.extend(this,n("ESLikesCtrl",{$scope:e})),angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.$watch("formData.pubkey",(function(n){n&&e.loadLikes(n)}))}function H(e,n,t,i,a,o,s,r){e.options=e.options||{},e.options.like=e.options.like||{kinds:o.constants.like.KINDS,index:"user",type:"profile",service:s.like},e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:i.screen.isSmall(),angular.extend(this,n("ESLikesCtrl",{$scope:e})),angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.showNewMessageModal=function(n){return e.loadWallet({minData:!0}).then((function(){return i.loading.hide(),!(!n&&!e.formData.profile)||i.alert.confirm("MESSAGE.CONFIRM.USER_HAS_NO_PROFILE").then((function(e){if(e)return!0}))})).then((function(n){return!!n&&r.showMessageCompose({destPub:e.formData.pubkey,destUid:e.formData.name||e.formData.uid}).then((function(e){e&&i.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.$watch("formData.pubkey",(function(n){n&&e.loadLikes(n)})),e.showActionsPopover=function(n){i.popover.show(n,{templateUrl:"plugins/es/templates/wot/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},"buttons-top-fab"===e.extensionPoint&&e.$on("$csExtension.motion",(function(n){e.formData.profile&&e.showFab("fab-compose-"+e.formData.pubkey)}))}function W(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E){e.formData={title:null,description:null,socials:[],geoPoint:{}},e.loading=!0,e.dirty=!1,e.walletData=null,e.avatar=null,e.existing=!1,e.socialData={url:null},e.pubkeyPattern=u.regexp.PUBKEY,e.$on("$ionicView.enter",(function(n){e.loadWallet().then((function(n){return e.load(n)})).catch((function(n){if("CANCELLED"==n)return e.close().then(c.loading.hide);c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(n)}))})),e.$on("$stateChangeStart",(function(n,t,i,o){if(e.dirty&&!e.saving&&(n.preventDefault(),!e.loading))return e.loading=!0,c.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){return e.loading=!1,n?(e.form.$submitted=!0,e.save(!1,!0).then((function(n){return n&&(e.dirty=!1),n}))):(e.dirty=!1,!0)})).then((function(e){e&&(l.nextViewOptions({historyRoot:!0}),a.go(t.name,i))})).catch((function(e){}))})),e.load=function(n){return e.loading=!0,p.get(n.pubkey,{raw:!0}).then((function(t){t?(e.avatar=d.image.fromAttachment(t.source.avatar),e.existing=!0,e.updateView(n,t.source)):(e.avatar=void 0,e.existing=!1,e.updateView(n,{})),o("profile-name")})).catch((function(e){c.loading.hide(10),c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(e)}))},e.setForm=function(n){e.form=n},e.updateView=function(n,t){e.walletData=n,e.formData=t,t.avatar&&(e.avatarStyle={"background-image":'url("'+e.avatar.src+'")'}),e.formData.geoPoint=e.formData.geoPoint||{},e.motion.show(),c.loading.hide(),i((function(){e.loading=!1}),1e3)},e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.save=function(a,o){if(!e.form.$valid||!n.walletData||e.saving)return t.reject();if(!o)return console.debug("[ES] [profile] Waiting debounce end, before saving..."),i((function(){return e.save(a,!0)}),650);e.saving=!0,console.debug("[ES] [profile] Saving user profile...");var r=function(n){return function(t){e.saving=!1,c.onError(n)(t)}},l=function(n){n&&(e.walletData.name=n.title,e.avatar?e.walletData.avatar=e.avatar:delete e.walletData.avatar,e.walletData.profile=angular.copy(n),e.walletData.profile.description=d.util.parseAsHtml(n.description))},u=function(){if(!a)return s("PROFILE.INFO.PROFILE_SAVED").then((function(e){c.toast.show(e)}))},m=function(t){return t.socials&&t.socials.length&&(t.socials=_.uniq(t.socials,!1,(function(e){return e.url}))),t.position&&delete t.position,t.geoPoint&&t.geoPoint.lat&&t.geoPoint.lon?(t.geoPoint.lat=parseFloat(t.geoPoint.lat),t.geoPoint.lon=parseFloat(t.geoPoint.lon)):t.geoPoint=null,e.existing?p.update(t,{id:n.walletData.pubkey}).then((function(){return console.info("[ES] Profile successfully updated."),e.saving=!1,e.dirty=!1,l(t),u(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED")):p.add(t).then((function(){return console.info("[ES] [profile] successfully created."),e.existing=!0,e.saving=!1,e.dirty=!1,l(t),u(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED"))};return e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(n){return e.formData.avatar=d.image.toAttachment({src:n}),m(e.formData)})):(delete e.formData.avatar,m(e.formData))},e.saveAndClose=function(){return e.save().then((function(n){n&&e.close()}))},e.submitAndSaveAndClose=function(){e.form.$submitted=!0,e.saveAndClose()},e.cancel=function(){e.dirty=!1,e.close()},e.close=function(){return a.go("app.view_wallet",{refresh:!0})},e.showAvatarModal=function(){return E.camera.enable?E.camera.getPicture().then((function(n){n&&(e.avatar={src:"data:image/png;base64,"+n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0)})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):m.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(n){n&&(e.avatar={src:n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0)}))},e.rotateAvatar=function(){if(e.avatar&&e.avatar.src&&!e.rotating)return e.rotating=!0,c.image.rotateSrc(e.avatar.src).then((function(n){e.avatar.src=n,e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.rotating=!1})).catch((function(n){console.error(n),e.rotating=!1}))}}function V(e,n,t,i,a,o,s,r,l,c){e.loading=!0,e.messages=[],e.$on("$ionicView.enter",(function(t,a){e.loadWallet({minData:!0}).then((function(){e.entered||(e.entered=!0,e.type=a.stateParams&&a.stateParams.type||"inbox",e.load()),e.showFab("fab-add-message-record")})).catch((function(e){"CANCELLED"===e&&(i.nextViewOptions({historyRoot:!0}),n.go("app.home"))}))})),e.refresh=function(n){return e.load(void 0,void 0,n)},e.load=function(n,t,i){var a={};return a.from=t||0,a.size=n||20,a.type=e.type,e.loading=!i,c.load(a).then((function(n){e.messages=n,r.loading.hide(),e.loading=!1,n.length>0&&e.motion.show({selector:".view-messages .list .item"})})).catch((function(n){r.onError("MESSAGE.ERROR.LOAD_MESSAGES_FAILED")(n),e.messages=[],e.loading=!1}))},e.setType=function(n){e.type=n,e.load()},e.markAllAsRead=function(){e.hideActionsPopover(),e.messages&&e.messages.length&&r.alert.confirm("MESSAGE.CONFIRM.MARK_ALL_AS_READ").then((function(n){n&&c.markAllAsRead().then((function(){_.forEach(e.messages,(function(e){e.read=!0}))})).catch(r.onError("MESSAGE.ERROR.MARK_ALL_AS_READ_FAILED"))}))},e.delete=function(n){var t=e.messages[n];t&&r.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(i){i&&c.remove(t.id,e.type).then((function(){e.messages.splice(n,1),r.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))},e.deleteAll=function(){e.hideActionsPopover(),e.messages&&e.messages.length&&r.alert.confirm("MESSAGE.CONFIRM.REMOVE_ALL").then((function(n){n&&c.removeAll(e.type).then((function(){e.messages.splice(0,e.messages.length),r.toast.show("MESSAGE.INFO.All_MESSAGE_REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED"))}))},e.showNewMessageModal=function(n){return e.loadWallet({minData:!0}).then((function(){return r.loading.hide(),s.showMessageCompose(n).then((function(e){e&&r.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.showReplyModal=function(n){var i=e.messages[n];i&&t("MESSAGE.REPLY_TITLE_PREFIX").then((function(e){var n=i.content?i.content.replace(/^/g," > "):null;return n=(n=n?n.replace(/\n/g,"\n > "):null)?n+"\n":null,s.showMessageCompose({destPub:i.issuer,destUid:i.name,title:e+i.title,content:n,isReply:!0})})).then((function(e){e&&r.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):a.fromTemplateUrl("plugins/es/templates/message/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.onMessageDelete=function(n){var t=_.findIndex(e.messages,(function(e){return e.id==n}));t&&e.messages.splice(t,1)},c.api.data.on.delete(e,e.onMessageDelete),e.onNewOutboxMessage=function(n){if("outbox"==e.type)return e.loading=!0,o((function(){return c.get(n,{type:e.type,summary:!0})}),500).then((function(n){e.messages.splice(0,0,n),e.loading=!1,e.motion.show({selector:".view-messages .list .item"})})).catch((function(){e.loading=!1}))},c.api.data.on.sent(e,e.onNewOutboxMessage),e.onNewInboxMessage=function(n){if("inbox"==e.type&&e.entered)return e.loading=!0,c.get(n.id,{type:e.type,summary:!0}).then((function(n){e.messages.splice(0,0,n),e.loading=!1,e.motion.show({selector:".view-messages .list .item"})})).catch((function(){e.loading=!1}))},c.api.data.on.new(e,e.onNewInboxMessage),e.onUnauth=function(){e.messages=void 0,e.loading=!1,e.entered=!1},l.api.data.on.unauth(e,e.onUnauth)}function G(e,n,t){angular.extend(this,n("ESMessageComposeModalCtrl",{$scope:e,parameters:{}})),e.$on("$ionicView.enter",(function(n,i){i.stateParams&&(i.stateParams.pubkey&&(e.formData.destPub=i.stateParams.pubkey,i.stateParams.name?(e.destUid=i.stateParams.name,e.destPub=""):(e.destUid="",e.destPub=e.formData.destPub)),i.stateParams.title&&(e.formData.title=i.stateParams.title),i.stateParams.content&&(e.formData.content=i.stateParams.content)),e.loadWallet({minData:!0}).then((function(){t.loading.hide()})).catch((function(n){"CANCELLED"===n&&e.showHome()}))})),e.cancel=function(){e.showHome()},e.setForm=function(n){e.form=n},e.closeModal=function(){e.showHome()}}function Y(e,n,t,i,a,o,s){e.formData={title:s?s.title:null,content:s?s.content:null,destPub:s?s.destPub:null},e.destUid=s?s.destUid:null,e.destPub=s&&!s.destUid?s.destPub:null,e.isResponse=!!s&&s.isResponse,e.doSend=function(n){if(e.form.$submitted=!0,e.form.$valid){if(!(n||e.formData.content&&e.formData.content.trim().length))return t.alert.confirm("MESSAGE.COMPOSE.CONTENT_CONFIRMATION").then((function(n){n&&e.doSend(!0)}));t.loading.show();var s={issuer:i.data.pubkey,recipient:e.formData.destPub,title:e.formData.title,content:e.formData.content,time:a.date.now()};o.send(s).then((function(n){e.id=n,t.loading.hide(),e.closeModal(n)})).catch(t.onError("MESSAGE.ERROR.SEND_MSG_FAILED"))}},e.showWotLookupModal=function(){n.showWotLookup().then((function(n){n&&(n.name?(e.destUid=n.name,e.destPub=""):(e.destUid="",e.destPub=n.pubkey),e.formData.destPub=n.pubkey)}))},e.cancel=function(){e.closeModal()}}function j(e,n,t,i,a,o,s,r,l){e.formData={},e.id=null,e.loading=!0,e.$on("$ionicView.enter",(function(i,a){a.stateParams&&a.stateParams.id?(e.loading&&(e.type=a.stateParams.type||"inbox",e.load(a.stateParams.id,e.type).then((function(n){e.loading=!1,s.loading.hide(),n&&(e.id=n.id,e.formData=n,e.canDelete=!0,e.motion.show({selector:".view-message .list .item"}),n.read||t((function(){e.id===n.id&&l.markAsRead(n,e.type).then((function(){console.debug("[message] marked as read")})).catch(s.onError("MESSAGE.ERROR.MARK_AS_READ_FAILED"))}),2e3))}))),e.showFab("fab-view-message-reply")):n.go("app.user_message")})),e.load=function(t,i){return i=i||"inbox",e.loadWallet({minData:!0}).then((function(){return l.get(t,{type:i})})).catch(s.onError("MESSAGE.ERROR.LOAD_MESSAGE_FAILED")).then((function(t){return t.valid?t:s.alert.error(e.isUserPubkey(t.recipient)?"MESSAGE.ERROR.NOT_AUTHENTICATED_MESSAGE":"MESSAGE.ERROR.USER_NOT_RECIPIENT","MESSAGE.ERROR.MESSAGE_NOT_READABLE").then((function(){n.go("app.user_message",{type:i})}))}))},e.delete=function(){e.actionsPopover&&e.actionsPopover.hide(),s.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(t){if(t)return l.remove(e.id,e.type).then((function(){a.nextViewOptions({historyRoot:!0}),n.go("app.user_message",{type:e.type}),s.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(s.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl("plugins/es/templates/message/view_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showReplyModal=function(){var n="inbox"==e.type?"issuer":"recipient";i("MESSAGE.REPLY_TITLE_PREFIX").then((function(t){var i=e.formData.content?e.formData.content.replace(/^/g," > "):null;return i=(i=i?i.replace(/\n/g,"\n > "):null)?i+"\n":null,r.showMessageCompose({destPub:e.formData[n],destUid:e.formData.name||e.formData.uid,title:t+e.formData.title,content:i,isReply:!0})})).then((function(e){e&&s.toast.show("MESSAGE.INFO.MESSAGE_SENT").then((function(){a.goBack()}))}))}}function $(e,n,t,i,a,o,s,r){e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40},e.$on("popover.shown",(function(){e.search.loading&&e.load()})),e.load=function(t,i){var a={};return a.from=t||0,a.size=i||40,s.notifications.load(a).then((function(n){e.search.results=t?e.search.results.concat(n):n,e.search.loading=!1,e.search.hasMore=e.search.results&&e.search.results.length>=e.search.limit,e.updateView()})).catch((function(i){e.search.loading=!1,t||(e.search.results=[]),e.search.hasMore=!1,n.onError("MESSAGE.ERROR.LOAD_NOTIFICATIONS_FAILED")(i)}))},e.updateView=function(){e.motion&&e.search.results&&e.search.results.length&&e.motion.show({selector:".popover-notification .item"})},e.showMore=function(){e.search.limit=e.search.limit||40,e.search.limit=2*e.search.limit,e.search.limit<40&&(e.search.limit=40),e.search.loadingMore=!0,e.load(e.search.results.length,e.search.limit).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.onNewMessageNotification=function(n){e.search.loading||e.search.loadingMore||(e.search.results.splice(0,0,n),e.updateView())},e.select=function(n){n.read||(n.read=!0),t.go("app.user_view_message",{id:n.id,type:"inbox"}),e.closePopover(n)},e.resetData=function(){e.search.loading||(console.debug("[ES] [messages] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},e.showNewMessageModal=function(t){e.closePopover(),i((function(){r.showMessageCompose(t).then((function(e){e&&n.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}),500)},a.api.data.on.logout(e,e.resetData),o.api.node.on.stop(e,e.resetData),o.api.node.on.start(e,e.load),s.api.data.on.new(e,e.onNewMessageNotification)}function K(e,n,t,i,a,o,s,r,l,c){e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40,options:{codes:{excludes:c.constants.EXCLUDED_CODES}}},e.$on("$ionicView.enter",(function(){e.search.loading&&(e.load(),a((function(){e.resetUnreadCount()}),1e3))})),e.load=function(n,t){var i=angular.copy(e.search.options);return i.from=i.from||n||0,i.size=i.size||t||40,e.search.loading=!0,c.load(l.data.pubkey,i).then((function(t){n?t&&(e.search.results=e.search.results.concat(t)):e.search.results=t||[],e.search.loading=!1,e.search.hasMore=e.search.results.length>=e.search.limit,e.updateView()})).catch((function(t){e.search.loading=!1,n||(e.search.results=[]),e.search.hasMore=!1,o.onError("COMMON.NOTIFICATIONS.LOAD_NOTIFICATIONS_FAILED")(t)}))},e.updateView=function(){e.motion&&e.motion.ionListClass&&e.search.results.length&&e.motion.show({selector:".view-notification .item"})},e.markAllAsRead=function(){e.hideActionsPopover(),e.search.results.length&&o.loading.show().then((function(){n.walletData.notifications.unreadCount=0;var t=e.search.results[0];return n.walletData.notifications.readTime=t?t.time:0,_.forEach(e.search.results,(function(e){e.markAsRead&&"function"==typeof e.markAsRead&&e.markAsRead()})),o.loading.hide()}))},e.resetUnreadCount=function(){if(l.data.notifications.unreadCount&&e.search.results&&e.search.results.length){l.data.notifications.unreadCount=0;var n=e.search.results[0],t=n.time?n.time:0;!t||r.data.wallet&&r.data.wallet.notificationReadTime==t||(r.data.wallet=r.data.wallet||{},r.data.wallet.notificationReadTime=t,r.store())}},e.select=function(e){e.markAsRead&&"function"==typeof e.markAsRead&&e.markAsRead(),e.state&&i.go(e.state,e.stateParams)},e.showMore=function(){e.search.limit=e.search.limit||40,e.search.limit+=40,e.search.limit<40&&(e.search.limit=40),e.search.loadingMore=!0,e.load(e.search.results.length,e.search.limit).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.onNewNotification=function(n){if(!e.search.loading&&!e.search.loadingMore){var t=_.findIndex(e.search.results,(function(e){return n.time>e.time}));t<0&&(t=0),e.search.results.splice(t,0,n),e.updateView()}},e.resetData=function(){e.search.loading||(console.debug("[ES] [notifications] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):t.fromTemplateUrl("plugins/es/templates/notification/popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},l.api.data.on.logout(e,e.resetData),s.api.node.on.stop(e,e.resetData),s.api.node.on.start(e,e.load),c.api.data.on.new(e,e.onNewNotification)}function q(e,n,t,i,a){angular.extend(this,t("NotificationsCtrl",{$scope:e})),e.motion=null,e.$on("popover.shown",(function(){e.search.loading&&e.load()})),e.updateView=function(){e.search.results.length&&n((function(){i.ink({selector:".popover-notification .item.ink"})}),100)},e.$on("popover.hidden",e.resetUnreadCount),e.select=function(n){n&&(n.markAsRead&&"function"==typeof n.markAsRead&&n.markAsRead(),n.state&&a.go(n.state,n.stateParams),e.closePopover(n))}}function z(e,n,t,i,a,o,s,r){var l;e.loading=!0,e.popupData={},e.search={results:[],loading:!0},e.emailFrequencies=[{id:"daily",label:"daily"},{id:"weekly",label:"weekly"}],e.enter=function(n,i){if(e.loading){if(!(l=i.stateParams&&i.stateParams.id?a.children.get(i.stateParams.id):a))return o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome();e.loadWallet({wallet:l,auth:!0,minData:!0}).then((function(){return o.loading.hide(),e.load()})).then((function(){e.showFab("fab-add-subscription-record")})).catch((function(n){if("CANCELLED"===n)return o.loading.hide(10),e.loading=!0,void t.goBack();o.onError("SUBSCRIPTION.ERROR.LOAD_SUBSCRIPTIONS_FAILED")(n)}))}},e.$on("$ionicView.enter",e.enter),e.load=function(){return e.loading=!0,r.record.load(l.data.pubkey,l.data.keypair).then((function(e){var n=_.groupBy(e||[],(function(e){return[e.type,e.recipient].join("|")}));return _.keys(n).reduce((function(e,t){var i=t.split("|");return e.concat({type:i[0],recipient:i[1],items:n[t]})}),[])})).then((function(e){return i.extendAll(e,"recipient")})).then(e.updateView).catch((function(n){o.loading.hide(10),n&&404==n.ucode?(e.updateView([]),e.existing=!1):o.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(n)}))},e.updateView=function(n){n&&(e.search.results=n),e.search.results&&e.search.results.length&&e.motion.show(),e.search.loading=!1},e.addSubscription=function(){e.showCategoryModal().then((function(n){if(n){if("email"===n.id)return e.showEmailModal();o.alert.notImplemented()}})).then((function(n){n&&(o.loading.show(),r.record.add(n,l).then(e.addToUI).then((function(){l.data.subscriptions=l.data.subscriptions||{count:0},l.data.subscriptions.count++,o.loading.hide(),e.updateView()})).catch(o.onError("SUBSCRIPTION.ERROR.ADD_SUBSCRIPTION_FAILED")))}))},e.editSubscription=function(n){var t,i=angular.copy(n);if("email"===n.type&&(t=e.showEmailModal(n)),t)return t.then((function(t){if(t)return o.loading.show(),n.id=i.id,r.record.update(n,l).then((function(){if(i.type!==n.type||i.recipient!==n.recipient)return e.removeFromUI(i),e.addToUI(n)})).then((function(){o.loading.hide(),e.updateView()})).catch(o.onError("SUBSCRIPTION.ERROR.UPDATE_SUBSCRIPTION_FAILED"))}))},e.deleteSubscription=function(n,t){if(n&&n.id){if(!t)return o.alert.confirm("SUBSCRIPTION.CONFIRM.DELETE_SUBSCRIPTION").then((function(t){if(t)return e.deleteSubscription(n,t)}));o.loading.show(),r.record.remove(n.id,{wallet:l}).then((function(){l.data.subscriptions=l.data.subscriptions||{count:1},l.data.subscriptions.count--,e.removeFromUI(n),o.loading.hide()})).catch(o.onError("SUBSCRIPTION.ERROR.DELETE_SUBSCRIPTION_FAILED"))}},e.removeFromUI=function(n){var t=_.findWhere(e.search.results,{type:n.type,recipient:n.recipient}),i=_.findIndex(t.items,n);i>=0&&t.items.splice(i,1),t.items.length||(i=_.findIndex(e.search.results,t),e.search.results.splice(i,1))},e.addToUI=function(t){e.search.results=e.search.results||[];var a=_.findWhere(e.search.results,{type:t.type,recipient:t.recipient});return a?(a.items.push(t),n.when(t)):(a={type:t.type,recipient:t.recipient,items:[]},i.extendAll([a],"recipient").then((function(){return a.items.push(t),e.search.results.push(a),t})))},e.showCategoryModal=function(){return r.category.all().then((function(e){return s.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(e){if(e&&e.parent)return e}))},e.showEmailModal=function(e){return s.show("plugins/es/templates/subscription/modal_email.html","ModalEmailSubscriptionsCtrl",e,{focusFirstInput:!0})}}function X(e,n,t,i,a,o,s){e.frequencies=[{id:"daily",label:"daily"},{id:"weekly",label:"weekly"}],e.formData=s||{},e.formData.content=e.formData.content||{},e.formData.content.frequency=e.formData.content.frequency||e.frequencies[0].id,e.recipient={},e.$on("modal.shown",(function(){return e.formData.recipient?(e.recipient={pubkey:e.formData.recipient},a.extendAll([e.recipient])):i.network.peering.self().then((function(n){if(n)return e.formData.recipient=n.pubkey,e.recipient={pubkey:e.formData.recipient},a.extendAll([e.recipient])}))})),e.doSubmit=function(){if(e.form.$submitted=!0,e.form.$valid&&e.formData.content.email&&e.formData.content.frequency){var n={type:"email",recipient:e.formData.recipient,content:{email:e.formData.content.email,locale:t.data.locale.id,frequency:e.formData.content.frequency}};e.closeModal(n)}},e.cancel=function(){e.closeModal()},e.subscriptionForm&&e.subscriptionForm.$setPristine(),e.showNetworkLookup=function(){return o.showNetworkLookup({enableFilter:!0,endpointFilter:i.constants.ES_SUBSCRIPTION_API}).then((function(n){n&&(e.recipient=n,e.formData.recipient=n.pubkey)}))}}function Q(e,n,t,i,a,o,s,r,l){e.search=e.search||{loading:!0,hasMore:!1,text:void 0,index:"invitation",type:"certification",results:[],sort:"time",asc:!1,loadingMore:!1},e.entered=!1,e.searchTextId="documentSearchText",e.ionItemClass="item-border-large",e.defaultSizeLimit=e.defaultSizeLimit||(s.screen.isSmall()?50:100),e.helptipPrefix="helptip-document",e.compactMode=!angular.isDefined(e.compactMode)||e.compactMode,e._source=e._source||["issuer","hash","time","creationTime","title","message"],e.enter=function(n,t){e.entered||(e.entered=!0,e.search.index=t.stateParams&&t.stateParams.index||e.search.index,e.search.type=t.stateParams&&t.stateParams.type||e.search.type,e.search.text=t.stateParams&&t.stateParams.q||e.search.text,e.search.last=!e.search.text,e.load()),e.expertMode=angular.isDefined(e.expertMode)?e.expertMode:!s.screen.isSmall()&&a.data.expertMode},e.$on("$ionicView.enter",e.enter),e.computeOptions=function(n,t){var i={index:e.search.index,type:e.search.type,from:n||0,size:t||e.defaultSizeLimit};return e.search.sort?(i.sort={},i.sort[e.search.sort]=e.search.asc?"asc":"desc"):i.sort={time:"desc"},i._source=i._source||e._source,i},e.load=function(n,t,i){if(!e.search.error){var a=e.computeOptions(n,t);return e.search.loading=!i,(e.search.last?l.search(a):l.searchText(e.search.text||"",a)).then((function(t){n?e.search.results=e.search.results.concat(t.hits):(e.search.results=t.hits,e.search.took=t.took),e.search.total=t.total,s.loading.hide(),e.search.loading=!1,e.search.hasMore=t.hits&&t.hits.length>0&&t.total>e.search.results.length,e.updateView()})).catch((function(n){e.search.results=[],e.search.loading=!1,e.search.error=!0,e.search.hasMore=!1,s.onError("DOCUMENT.ERROR.LOAD_DOCUMENTS_FAILED")(n).then((function(){e.search.error=!1}))}))}},e.updateView=function(){e.motion&&e.search.results&&e.search.results.length&&e.motion.show({selector:".list .item.item-document"}),e.$broadcast("$$rebind::rebind")},e.doSearchText=function(){return e.search.last=!e.search.text,e.load().then((function(){t.search({q:e.search.text}).replace()}))},e.doSearchLast=function(){return e.search.last=!0,e.search.text=void 0,e.load()},e.removeAll=function(){if(e.hideActionsPopover(),e.search.results&&e.search.results.length)return s.alert.confirm("DOCUMENT.CONFIRM.REMOVE_ALL").then((function(n){if(n)return s.loading.show(),l.removeAll(e.search.results).then((function(){return e.search.loading=!1,i((function(){return s.toast.show("DOCUMENT.INFO.REMOVED"),e.load()}),1e3)})).catch(s.onError("DOCUMENT.ERROR.REMOVE_ALL_FAILED"))}))},e.remove=function(n,t){var i=e.search.results[t];i&&!n.defaultPrevented&&(n.stopPropagation(),s.alert.confirm("DOCUMENT.CONFIRM.REMOVE").then((function(n){if(n)return l.remove(i).then((function(){e.search.results.splice(t,1),e.$broadcast("$$rebind::rebind"),s.toast.show("DOCUMENT.INFO.REMOVED")})).catch(s.onError("MESSAGE.ERROR.REMOVE_FAILED"))})))},e.selectDocument=function(n,t){console.debug("Selected document: ",t,r);var i=r.getUrl("/{0}/{1}/_search?pretty&q=_id:{2}".format(t.index,t.type,t.id));return e.openLink(n,i)},e.toggleCompactMode=function(){e.compactMode=!e.compactMode,e.updateView(),!e.search.hasMore&&e.search.results.length&&"last"==e.search.type&&i((function(){e.search.hasMore=!0}),500)},e.toggleSort=function(n){e.search.sort!==n||e.search.asc?(e.search.asc=e.search.sort!==n||!e.search.asc,e.search.sort=n):(e.search.asc=void 0,e.search.sort=void 0),e.load()},e.showMore=function(){e.search.loading||(e.search.loadingMore=!0,e.load(e.search.results.length,e.defaultSizeLimit,!0).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})))},e.startListenChanges=function(){var n=Date.now(),t=e.search.index+"/"+e.search.type,i=r.websocket.changes(t);return i.open().then((function(){console.debug("[ES] [document] Websocket opened in {0} ms".format(Date.now()-n)),i.on((function(n){e.search.last&&n&&l.fromHit(n).then((function(t){"DELETE"===n._operation?e.onDeleteDocument(t):e.onNewDocument(t)}))}))}))},e.onNewDocument=function(n){if(e.search.last&&!e.search.loading){console.debug("[ES] [document] Detected new document: ",n);var t=_.findIndex(e.search.results,{id:n.id,index:n.index,type:n.type});t<0?(e.search.total++,e.search.results.splice(0,0,n)):(n.updated=!0,i((function(){n.updated=!1}),2e3),e.search.results.splice(t,1,n)),e.updateView()}},e.onDeleteDocument=function(n){e.search.last&&!e.search.loading&&i((function(){var t=_.findIndex(e.search.results,{id:n.id,index:n.index,type:n.type});t<0||(console.debug("[ES] [document] Detected document deletion: ",n),e.search.results.splice(t,1),e.search.total--,e.updateView())}),750)},e.showActionsPopover=function(n){s.popover.show(n,{templateUrl:"plugins/es/templates/document/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.resetData=function(){e.search.loading||(console.debug("[ES] [document] Resetting data (settings or account may have changed)"),e.search.results=[],e.search.loading=!1,e.search.total=void 0,e.search.loadingMore=!1,e.entered=!1,delete e.search.limit)},o.api.data.on.logout(e,e.resetData)}function J(e,n,t,i){e.search={loading:!0,hasMore:!0,text:void 0,index:"user,page,group",type:"profile,record,comment",results:void 0,sort:"time",asc:!1},e.expertMode=!1,e.defaultSizeLimit=20,e._source=["issuer","hash","time","creationTime","title","avatar._content_type","city","message","record"],angular.extend(this,n("ESDocumentLookupCtrl",{$scope:e})),e.$on("$ionicParentView.enter",e.enter),e.selectDocument=function(e,n){if(n&&e&&!e.defaultPrevented)if(e.stopPropagation(),"user"===n.index&&"profile"===n.type)i.go("app.wot_identity",{pubkey:n.pubkey,uid:n.name});else if("page"===n.index&&"record"===n.type)i.go("app.view_page",{title:n.title,id:n.id});else if("page"===n.index&&"comment"===n.type){var t=$filter("formatHash")(n.id);i.go("app.view_page_anchor",{title:n.title,id:n.record,anchor:t})}else"group"===n.index&&"record"===n.type?i.go("app.view_group",{title:n.title,id:n.id}):"group"===n.index&&"comment"===n.type?(t=$filter("formatHash")(n.id),i.go("app.view_group_anchor",{title:n.title,id:n.record,anchor:t})):console.warn("Click on this kind of document not implement yet!",n)};var a=e.computeOptions;e.computeOptions=function(n,t){var i=a(n,t);if(!i.sort||i.sort.time){var o=i.sort&&i.sort.time||o;i.sort=[{time:o}]}return i._source=i._source||e._source,i.getTimeFunction=function(e){return e.time=e.creationTime||e.time,e.time},i},t((function(){e.startListenChanges()}),1e3)}function Z(e,n,t,i,a,o,s,r,l,c,u,d,p){e.networkStarted=!1,e.ionItemClass="",e.expertMode=c.data.expertMode&&!r.screen.isSmall(),e.isHttps="https:"===a.location.protocol,e.search={text:"",loading:!0,online:!0,results:[],endpointFilter:s.constants.GCHANGE_API,sort:void 0,asc:!0},e.listeners=[],e.helptipPrefix="helptip-network",e.enableLocationHref=!0,e.removeListeners=function(){e.listeners.length&&(console.debug("[ES] [network] Closing listeners"),_.forEach(e.listeners,(function(e){e()})),e.listeners=[])},e.enter=function(n,t){e.networkStarted||(e.networkStarted=!0,e.search.loading=!0,u.get().then((function(n){n&&(e.node=s.node.same(n.node.host,n.node.port)?s:s.instance(n.node.host,n.node.port),t&&t.stateParams&&("true"==t.stateParams.online&&(e.search.online=!0),t.stateParams.expert&&(e.expertMode="true"==t.stateParams.expert)),e.load())})).catch((function(n){r.onError("ERROR.GET_CURRENCY_FAILED")(n),e.networkStarted=!1})))},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.networkStarted&&(e.removeListeners(),d.close(),e.networkStarted=!1,e.search.loading=!0)},e.$on("$ionicView.beforeLeave",e.leave),e.$on("$ionicParentView.beforeLeave",e.leave),e.$on("$destroy",e.leave),e.computeOptions=function(){return{filter:{member:!e.search.type||"member"===e.search.type,mirror:!e.search.type||"mirror"===e.search.type,endpointFilter:angular.isDefined(e.search.endpointFilter)?e.search.endpointFilter:null,online:e.search.online&&!0},sort:{type:e.search.sort,asc:e.search.asc},expertMode:e.expertMode,timeout:l.timeout&&(e.expertMode?l.timeout/10:l.timeout/100)}},e.load=function(){e.search.loading&&(d.start(e.node,e.computeOptions()),e.refreshing=!1,e.listeners.push(d.api.data.on.changed(e,(function(n){e.refreshing||(e.refreshing=!0,p.extendAll(n.peers).then((function(){e.networkStarted&&e.updateView(n),e.refreshing=!1})))}))))},e.updateView=function(n){console.debug("[peers] Updating UI"),e.search.results=n.peers,e.search.memberPeersCount=n.memberPeersCount,e.search.loading=!e.networkStarted||d.isBusy(),e.motion&&e.search.results&&e.search.results.length>0&&e.motion.show({selector:".item-peer"}),e.loading||e.$broadcast("$$rebind::rebind")},e.refresh=function(){e.search.loading=!0,d.loadPeers()},e.sort=function(){e.search.loading=!0,e.refreshing=!0,d.sort(e.computeOptions()),e.updateView(d.data)},e.toggleOnline=function(n){e.hideActionsPopover(),e.search.online=!1!==n,d.close(),e.search.loading=!0,e.load(),e.enableLocationHref&&t.search({online:e.search.online}).replace()},e.toggleSearchEndpoint=function(n){e.hideActionsPopover(),e.search.endpointFilter===n||null===n?e.search.endpointFilter=null:e.search.endpointFilter=n,e.sort()},e.toggleSort=function(n){e.search.sort!==n||e.search.asc?(e.search.asc=e.search.sort!==n||!e.search.asc,e.search.sort=n):(e.search.asc=void 0,e.search.sort=void 0),e.sort()},e.selectPeer=function(e){if(e.online){var t={server:e.getServer()};e.isSsl()&&(t.ssl=!0),e.isTor()&&(t.tor=!0),n.go("app.view_es_peer",t)}},e.$on("csView.action.refresh",(function(n,t){"peers"===t&&e.refresh()})),e.$on("csView.action.showActionsPopover",(function(n,t){e.showActionsPopover(t)})),e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):i.fromTemplateUrl("templates/network/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showEndpointsPopover=function(e,n,t){var i=n.getEndpoints(t);(i=(i||[]).reduce((function(e,t){var i=s.node.parseEndPoint(t);return e.concat({label:"NETWORK.VIEW.NODE_ADDRESS",value:n.getServer()+(i.path||"")})}),[])).length&&(r.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS."+t,items:i}}),e.stopPropagation())},e.showWs2pPopover=function(e,n){return e.stopPropagation(),o("NETWORK.VIEW.PRIVATE_ACCESS").then((function(t){r.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS.WS2P",valueKey:"NETWORK.VIEW.NODE_ADDRESS",items:[{label:"NETWORK.VIEW.NODE_ADDRESS",value:n.bma.private?t:n.getServer()+(n.bma.path||"")},{label:"NETWORK.VIEW.WS2PID",value:n.bma.ws2pid},{label:"NETWORK.VIEW.POW_PREFIX",value:n.powPrefix}]}})}))}}function ee(e,n,t){angular.extend(this,n("ESNetworkLookupCtrl",{$scope:e})),t=t||{},e.enableFilter=!angular.isDefined(t.enableFilter)||t.enableFilter,e.search.type=angular.isDefined(t.type)?t.type:e.search.type,e.search.endpointFilter=angular.isDefined(t.endpointFilter)?t.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(t.expertMode)?t.expertMode:e.expertMode,e.ionItemClass=t.ionItemClass||"item-border-large",e.enableLocationHref=!1,e.helptipPrefix="",e.selectPeer=function(n){e.closeModal(n)},e.$on("modal.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function ne(e,n){angular.extend(this,n("NetworkLookupCtrl",{$scope:e}));var t=t||{};e.enableFilter=!angular.isDefined(t.enableFilter)||t.enableFilter,e.search.type=angular.isDefined(t.type)?t.type:e.search.type,e.search.endpointFilter=angular.isDefined(t.endpointFilter)?t.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(t.expertMode)?t.expertMode:e.expertMode,e.ionItemClass=t.ionItemClass||"item-border-large",e.helptipPrefix="",e.selectPeer=function(n){e.closePopover(n)},e.$on("popover.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function te(e,n,t,i,a,o){e.loading=!0,e.formData={},e.load=function(){return e.loading=!0,e.formData={},n.all([i.blockchain.current().then((function(n){e.formData.number=n.number,e.formData.medianTime=n.medianTime,e.formData.powMin=n.powMin,e.formData.useSsl=o.useSsl})).catch((function(){delete e.formData.number,delete e.formData.medianTime,delete e.formData.powMin,delete e.formData.useSsl})),o.node.summary().then((function(n){e.formData.version=n&&n.duniter&&n.duniter.version,e.formData.software=n&&n.duniter&&n.duniter.software})).catch((function(){delete e.formData.version,delete e.formData.software})),o.version.latest().then((function(n){e.formData.latestRelease=n})).catch((function(){delete e.formData.latestRelease}))]).then((function(){if(e.formData.latestRelease&&"duniter"==e.formData.software){var n=a.version.compare(e.formData.version,e.formData.latestRelease.version);e.formData.isPreRelease=n>0,e.formData.hasNewRelease=n<0}else e.formData.isPreRelease=!1,e.formData.hasNewRelease=!1;e.loading=!1,e.$broadcast("$$rebind::rebind")}))},i.api.data.on.newBlock(e,(function(n){e.loading||(console.debug("[peer info] Received new block. Reload content"),e.load())})),t.api.data.on.changed(e,(function(n){e.loading||(console.debug("[peer info] Peer settings changed. Reload content"),e.load())})),e.load()}function ie(e,n,t,i,a,o,s,r,l){e.node={},e.loading=!0,e.isHttps="https:"===t.location.protocol,e.isReachable=!0,e.options={document:{index:l.data.plugins.es&&l.data.plugins.es.document&&l.data.plugins.es.document.index||"user",type:l.data.plugins.es&&l.data.plugins.es.document&&l.data.plugins.es.document.type||"profile"}},e.$on("$ionicView.beforeEnter",(function(e,n){n.enableBack=!!a.screen.isSmall()||n.enableBack})),e.$on("$ionicView.enter",(function(n,t){var i=!t.stateParams||!t.stateParams.server,a=t.stateParams&&t.stateParams.server||s.server,o=t.stateParams&&"true"==t.stateParams.ssl||!!i&&s.useSsl,r="true"==t.stateParams.tor||!!i&&s.useTor;return e.load(a,o,r).then((function(){return e.$broadcast("$csExtension.enter",n,t)})).then((function(){e.loading=!1}))})),e.load=function(t,i,l){var c={server:t,host:t,useSsl:i,useTor:l},u=t.split(":");return 2==u.length&&(c.host=u[0],c.port=u[1]),c.url=r.getUrl(c.host,c.port,void 0,c.useSsl),angular.merge(e.node,l?s.lightInstance(c.host+".to",443,443,!0,6e4):s.lightInstance(c.host,c.port,c.useSsl),c),e.isReachable=!e.isHttps||i,e.isReachable?n.all([e.node.network.peering.self().then((function(n){e.node.pubkey=n.pubkey,e.node.currency=n.currency})),e.node.record.count(e.options.document.index,e.options.document.type).then((function(n){e.node.docCount=n})),e.node.network.peers().then((function(n){var t=n.peers.reduce((function(e,n){var t=new b(n);return t.hasEndpoint("GCHANGE_API")?(t.online="UP"===n.status,t.blockNumber=t.block.replace(/-.+$/,""),t.ep=s.node.parseEndPoint(t.getEndpoints("GCHANGE_API")[0]),t.dns=t.getDns(),t.id=t.keyID(),t.server=t.getServer(),e.concat(t)):e}),[]);return o.extendAll([e.node].concat(t)).then((function(){e.peers=_.sortBy(t,(function(e){var n=1;return n+=1e4*(e.online?1:0),n+=1e3*(e.hasMainConsensusBlock?1:0),-(n+=100*(e.name?1:0))})),e.motion.show({selector:".item-peer"})}))})),e.node.blockchain.current().then((function(n){e.current=n}))]).catch(a.onError(l?"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR":"PEER.VIEW.ERROR.LOADING_NODE_ERROR")):s.network.peers().then((function(n){var t=(n&&n.peers||[]).reduce((function(e,n){var t=new b(n);if(!t.hasEndpoint("GCHANGE_API"))return e;var i=s.node.parseEndPoint(t.getEndpoints("GCHANGE_API")[0]);return i.dns!=c.host&&i.ipv4!=c.host&&i.ipv6!=c.host||i.port!=c.port?e:(t.ep=i,e.concat(t))}),[]),i=t.length&&t[0];if(i)return e.node.pubkey=i.pubkey,e.node.currency=i.currency,o.extend(e.node);console.warn("Could not get peer from /network/peers")}))},e.selectPeer=function(e){if(e.online){var n={server:e.getServer()};e.isSsl()&&(n.ssl=!0),e.isTor()&&(n.tor=!0),i.go("app.view_es_peer",n)}},e.openRawPeering=function(n){return e.openLink(n,e.node.url+"/network/peering?pretty")},e.openRawCurrentBlock=function(n){return e.openLink(n,e.node.url+"/network/peering?pretty")}}function ae(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g,h){angular.extend(this,a("ESLookupPositionCtrl",{$scope:e})),e.search={text:"",results:[],loading:!0,lastRecords:!0,type:null,category:null,location:null,advanced:null,issuer:null,geoDistance:isNaN(p.data.plugins.es.geoDistance)?20:p.data.plugins.es.geoDistance},e.searchTextId="registrySearchText",e.enableFilter=!0,e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:c.screen.isSmall(),e.options=angular.merge(e.options||{},{location:{show:!0,help:"REGISTRY.SEARCH.LOCATION_HELP"}}),e.enter=function(t,i){if(!e.entered||!e.search.results||0===e.search.results.length){if(!e.geoUnit)return s("LOCATION.DISTANCE_UNIT").then((function(n){return e.geoUnit=n,e.enter(t,i)}));var a=function(){e.searchTextId&&n(e.searchTextId),e.entered=!0,e.doSearch()};if(i.stateParams&&i.stateParams.q&&"string"==typeof i.stateParams.q&&(e.search.text=i.stateParams.q),i.stateParams&&i.stateParams.hash&&(e.search.text="#"+i.stateParams.hash),i.stateParams&&i.stateParams.location)e.search.location=i.stateParams.location,i.stateParams.lat&&i.stateParams.lon&&(e.search.geoPoint={lat:parseFloat(i.stateParams.lat),lon:parseFloat(i.stateParams.lon)}),i.stateParams.d&&(e.search.geoDistance=i.stateParams.d);else{var o=p.data.plugins.es.registry&&p.data.plugins.es.registry.defaultSearch;if(o&&(o.location?angular.merge(e.search,p.data.plugins.es.registry.defaultSearch):o=void 0),!o&&m.isLogin()&&m.data.profile){if(!m.isDataLoaded())return c.loading.show(),m.loadData().then((function(){return c.loading.hide(),e.enter(t,i)}));e.search.geoPoint=m.data.profile.geoPoint,e.search.location=m.data.profile.city||(m.data.profile.geoPoint?s.instant("LOCATION.PROFILE_POSITION"):void 0)}}i.stateParams&&(i.stateParams.type||i.stateParams.last)?i.stateParams.last||"last"==i.stateParams.type?(e.search.lastRecords=!0,e.search.type=void 0):e.search.type=i.stateParams.type:e.search.lastRecords=!1,i.stateParams&&i.stateParams.issuer&&(e.search.issuer=i.stateParams.issuer),i.stateParams&&i.stateParams.category?g.category.get({id:i.stateParams.category}).then((function(n){e.search.category=n,a()})).catch(c.onError("REGISTRY.ERROR.LOAD_CATEGORY_FAILED")):a()}e.showFab("fab-add-registry-record")},e.$on("$ionicView.enter",(function(n,t){return e.enter(n,t)})),e.leave=function(){var n=!1;p.data.plugins.es.registry=p.data.plugins.es.registry||{},p.data.plugins.es.registry.defaultSearch=p.data.plugins.es.registry.defaultSearch||{};var i=e.search.location&&e.search.location.trim(),a=p.data.plugins.es.registry.defaultSearch.location;a&&a===i||(p.data.plugins.es.registry.defaultSearch={location:i,geoPoint:i&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0},n=!0);var o=p.data.plugins.es.geoDistance;o&&o===e.search.geoDistance||(p.data.plugins.es.geoDistance=e.search.geoDistance,n=!0),n&&t((function(){p.store()}))},e.$on("$ionicView.leave",(function(){return e.leave()})),e.onGeoPointChanged=function(){e.search.loading||e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon&&!e.search.geoPoint.exact&&(e.doSearch(),e.updateLocationHref())},e.$watch("search.geoPoint",e.onGeoPointChanged,!0),e.resolveLocationPosition=function(){if(!e.search.loadingPosition)return e.search.loadingPosition=!0,e.searchPosition(e.search.location).then((function(n){if(!n)throw e.search.loading=!1,e.search.results=void 0,e.search.total=0,e.search.loadingPosition=!1,e.search.geoPoint=void 0,"CANCELLED";e.search.geoPoint=n,n.shortName&&!n.exact&&(e.search.location=n.shortName),e.search.loadingPosition=!1}))},e.doGetLastRecords=function(n){return e.hidePopovers(),e.search.text=void 0,e.doSearch(n)},e.doSearchText=function(){e.doSearch()},e.doSearch=function(n){if(e.search.loading=!n,e.search.location&&e.search.location.length>=3&&!e.search.geoPoint)return e.resolveLocationPosition().then((function(){return e.doSearch(n)}));var t=e.search.text&&e.search.text.trim()||"";e.search.lastRecords=!t||!t.length;var i=[],a=[];if(t&&t.length)if(d.regexp.PUBKEY.test(t))a.push({term:{pubkey:t}});else{var o=(t=t.toLowerCase())?h.util.parseTags(t):void 0;i.push({multi_match:{query:t,fields:["title","description","city","address"],type:"phrase_prefix"}}),i.push({match:{title:{query:t,boost:2}}}),i.push({prefix:{title:t}}),i.push({match:{description:t}}),i.push({nested:{path:"category",query:{bool:{filter:{match:{"category.name":t}}}}}}),o&&o.length&&a.push({terms:{tags:o}})}else e.search.issuer&&a.push({term:{issuer:e.search.issuer}});e.search.type&&a.push({term:{type:e.search.type}}),e.search.category&&a.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.search.category.id}}}}}});var s=e.search.location&&e.search.location.trim().toLowerCase();if(e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon)if(s&&s.length){var r=s.split(",")[0];a.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{match_phrase:{city:r}}]},{geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}}]})}else a.push({geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}});var l={highlight:{fields:{title:{},description:{},tags:{}}},from:n};i.length>0&&(l.query=l.query||{bool:{}},l.query.bool.should=i,l.query.bool.minimum_should_match=1),a.length>0&&(l.query=l.query||{bool:{}},l.query.bool.filter=a),e.search.lastRecords&&(l.sort={creationTime:"desc"});var c=e.queryId&&e.queryId+1||0;return e.queryId=c,e.updateLocationHref(),e.doRequest(l,(function(){return e.queryId==c}))},e.doRequest=function(n,t){return(n=n||{}).from=n.from||0,n.size=n.size||10,n.size<10&&(n.size=10),e.search.loading=0===n.from,g.record.search(n).then((function(a){if(!t||t()){if(!a||!a.hits||!a.hits.length)return e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.loading=!1,void(e.search.hasMore=!1);var o=i("formatSlug");_.forEach(a.hits,(function(e){e.urlTitle=o(e.title)})),n.from?e.search.results=e.search.results.concat(a.hits):(e.search.results=a.hits,e.search.total=a.total),e.search.hasMore=e.search.results.length<a.total,e.search.loading=!1,e.motion.show({selector:".list .item",ink:!0})}})).catch((function(t){e.search.loading=!1,
|
||
e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.hasMore=!1,c.onError("REGISTRY.ERROR.LOOKUP_RECORDS_FAILED")(t)}))},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,(e.search.lastRecords?e.doGetLastRecords:e.doSearch)(n).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.removeType=function(){e.search.type=null,e.doSearch(),e.updateLocationHref()},e.removeCategory=function(){e.search.category=null,e.category=null,e.doSearch(),e.updateLocationHref()},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.doSearch(),e.updateLocationHref()},e.updateLocationHref=function(n){n||t((function(){var n=e.search.text&&e.search.text.trim(),t=e.search.location&&e.search.location.trim(),i={location:t&&t.length?t:void 0,category:e.search.category?e.search.category.id:void 0,last:!!e.search.lastRecords||void 0,type:e.search.type?e.search.type:void 0,lat:e.search.geoPoint&&e.search.geoPoint.lat||void 0,lon:e.search.geoPoint&&e.search.geoPoint.lon||void 0,d:e.search.geoPoint&&e.search.geoDistance||void 0};n&&n.match(/^#\w+$/)?i.hash=n.substr(1):n&&n.length&&(i.q=n),o.search(i).replace()}))},e.onToggleAdvanced=function(){e.search.entered&&!e.search.lastRecords&&(e.doSearch(),e.updateLocationHref())},e.$watch("search.advanced",e.onToggleAdvanced,!0),e.toggleAdvanced=function(){e.search.advanced=!e.search.advanced,t(e.hidePopovers,200)},e.showRecordTypeModal=function(n){e.hidePopovers(),t((function(){n.isDefaultPrevented()||u.show("plugins/es/templates/registry/modal_record_type.html").then((function(n){n&&(e.search.type=n,e.doSearch(),e.updateLocationHref())}))}),350)},e.showCategoryModal=function(n){t((function(){n.isDefaultPrevented()||g.category.all().then((function(e){return u.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.search.category=n,e.doSearch(),e.updateLocationHref())}))}),350)},e.showNewPageModal=function(){return e.hidePopovers(),e.loadWallet().then((function(e){if(c.loading.hide(),e)return E.showNewPage()}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):r.fromTemplateUrl("plugins/es/templates/registry/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showFiltersPopover=function(n){e.filtersPopover?e.filtersPopover.show(n):r.fromTemplateUrl("plugins/es/templates/registry/lookup_popover_filters.html",{scope:e}).then((function(t){e.filtersPopover=t,e.$on("$destroy",(function(){e.filtersPopover.remove()})),e.filtersPopover.show(n)}))},e.hideFiltersPopover=function(){e.filtersPopover&&e.filtersPopover.hide()},e.hidePopovers=function(){e.hideActionsPopover(),e.hideFiltersPopover()}}function oe(e,n,t,i,a){angular.extend(this,n("ESRegistryLookupCtrl",{$scope:e})),e.searchTextId=void 0,e.enter=function(n,a){return e.entered?a.stateParams&&a.stateParams.refresh?t(e.doSearch,2e3):void 0:e.loadWallet({minData:!0}).then((function(n){i.loading.hide(),e.search.issuer=n.pubkey,e.search.advanced=!0,t(e.doSearch,100),e.showFab("fab-wallet-add-registry-record")}))},e.doUpdate=function(){if(a.isLogin())return e.search.issuer=a.data.pubkey,e.search.advanced=!0,e.doSearch()}}function se(e,n,t,i,a,o,s,r,l,c,u,d,p,m){e.formData={},e.id=null,e.category={},e.pictures=[],e.canEdit=!1,e.loading=!0,e.motion=p.motion.fadeSlideIn,e.$on("$ionicView.beforeEnter",(function(e,n){n.enableBack=!!p.screen.isSmall()||n.enableBack})),e.$on("$ionicView.enter",(function(n,i){i.stateParams&&i.stateParams.id?((e.loading||i.stateParams.refresh)&&e.load(i.stateParams.id,i.stateParams.anchor),e.$broadcast("$recordView.enter",i)):t.go("app.registry_lookup")})),e.$on("$ionicView.beforeLeave",(function(n,t){e.$broadcast("$recordView.beforeLeave",t)})),e.load=function(n,o){return n=n||e.id,e.loading=!0,i.all([d.record.load(n).then((function(n){e.id=n.id,e.formData=n.record,e.canEdit=u.isUserPubkey(e.formData.issuer),e.issuer=n.issuer,e.avatar=e.formData.avatar,e.avatarStyle=e.formData.avatar&&{"background-image":'url("'+e.avatar.src+'")'},p.loading.hide(),e.loading=!1,e.motion.show({selector:".list > .item, .list > ng-if > .item"})})).catch((function(a){e.secondTry?(e.loading=!1,a&&404===a.ucode?(p.toast.show("REGISTRY.ERROR.RECORD_NOT_EXISTS"),t.go("app.registry_lookup")):p.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(a)):(e.secondTry=!0,i((function(){e.load(n)}),100))})),d.record.picture.all({id:n}).then((function(n){e.pictures=n._source.pictures&&n._source.pictures.reduce((function(e,n){return e.concat(m.image.fromAttachment(n.file))}),[]),e.pictures.length>0&&e.motion.show({selector:".lazy-load .item.card-gallery",startVelocity:3e3})})).catch((function(){e.pictures=[]})),a((function(){return e.$broadcast("$recordView.load",n,d.record)}))]).then((function(){e.motion.show({selector:".lazy-load .item",startVelocity:3e3}),o&&a((function(){l(o)}),1e3)}))},e.edit=function(){p.loading.show(),t.go("app.registry_edit_record",{id:e.id})},e.delete=function(){var n;e.hideActionsPopover(),r(["REGISTRY.VIEW.REMOVE_CONFIRMATION","REGISTRY.INFO.RECORD_REMOVED"]).then((function(e){return n=e,p.alert.confirm(e["REGISTRY.VIEW.REMOVE_CONFIRMATION"])})).then((function(i){i&&d.record.remove(e.id).then((function(){u.data.pages&&u.data.pages.count&&u.data.pages.count--,s.nextViewOptions({historyRoot:!0}),t.go("app.wallet_pages",{refresh:!0}),p.toast.show(n["REGISTRY.INFO.RECORD_REMOVED"])})).catch(p.onError("REGISTRY.ERROR.REMOVE_RECORD_FAILED"))}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl("plugins/es/templates/registry/view_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSharePopover=function(n){e.hideActionsPopover();var t=e.formData.title,i=m.getUrl("/page/record/"+e.id+"/_share");p.screen.isSmall()&&(n=angular.element(document.querySelector("#registry-share-anchor-"+e.id))||n),p.popover.share(n,{bindings:{url:i,titleKey:"REGISTRY.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},time:e.formData.time,postMessage:t}})}}function re(e,n,t,i,a,o,s,r,l,c,u,d,p,m){angular.extend(this,r("ESPositionEditCtrl",{$scope:e})),e.formData={title:null,description:null,socials:[],geoPoint:null},e.loading=!0,e.dirty=!1,e.walletData=null,e.id=null,e.avatar=null,e.pictures=[],e.setForm=function(n){e.form=n},e.$on("$ionicView.enter",(function(n,t){e.loadWallet({minData:!0}).then((function(n){e.walletData=n,t.stateParams&&t.stateParams.id?e.load(t.stateParams.id):t.stateParams&&t.stateParams.type&&e.updateView({record:{type:t.stateParams.type}}),o("registry-record-title")}))})),e.$on("$stateChangeStart",(function(n,i,o,s){if(e.dirty&&!e.saving&&(n.preventDefault(),!e.loading))return e.loading=!0,c.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){return e.loading=!1,n?(e.form.$submitted=!0,e.save(!1,!0).then((function(n){return n&&(e.dirty=!1),n}))):(e.dirty=!1,!0)})).then((function(e){e&&(a.nextViewOptions({historyRoot:!0}),t.go(i.name,o))})).catch((function(e){}))})),e.load=function(n){e.loading=!0,m.record.load(n,{raw:!0}).then((function(n){n&&n.record?e.updateView(n):e.updateView({record:{}})})).catch((function(n){c.loading.hide(10),e.loading=!1,c.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(n)}))},e.updateView=function(t){e.formData=t.record||{},e.id=t.id,e.avatar=e.formData.avatar,e.avatar?(e.avatarStyle=e.avatar&&{"background-image":'url("'+e.avatar.src+'")'},e.avatarClass={}):(e.avatarStyle=void 0,e.avatarClass={},e.avatarClass["cion-page-"+e.formData.type]=!e.avatar),e.pictures=t.record&&t.record.pictures||[],delete t.record.pictures,e.motion.show({selector:".animate-ripple .item, .card-gallery",startVelocity:3e3}),c.loading.hide(),n((function(){e.loading=!1}),1e3)},e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.needCategory=function(){return e.formData.type&&("company"==e.formData.type||"shop"==e.formData.type)},e.save=function(o,r){return e.form.$submitted=!0,!e.saving&&e.form.$valid&&("shop"!==e.formData.type&&"company"!==e.formData.type||e.formData.category&&e.formData.category.id)?r?(e.saving=!0,console.debug("[ES] [page] Saving record..."),i.when().then((function(){var n=e.formData;return e.needCategory()||delete n.category,n.time=p.date.now(),n.geoPoint&&n.geoPoint.lat&&n.geoPoint.lon?(n.geoPoint.lat=parseFloat(n.geoPoint.lat),n.geoPoint.lon=parseFloat(n.geoPoint.lon)):n.geoPoint=null,n.socials&&n.socials.length&&(n.socials=_.uniq(n.socials,!1,(function(e){return e.url}))),n.picturesCount=e.pictures.length,n.picturesCount>0?n.pictures=e.pictures.reduce((function(e,n){return e.concat({file:p.image.toAttachment(n)})}),[]):n.pictures=[],e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(e){return n.avatar=p.image.toAttachment({src:e}),n})):(n.avatar={_content:"",_content_type:""},n)})).then((function(n){return e.id?m.record.update(n,{id:e.id}):m.record.add(n)})).then((function(n){return console.info("[ES] [page] Record successfully saved."),!e.id&&d.data.pages&&d.data.pages.count&&d.data.pages.count++,e.id=e.id||n,e.saving=!1,e.dirty=!1,o||s("REGISTRY.INFO.RECORD_SAVED").then((function(e){c.toast.show(e)})),a.clearCache(a.currentView().stateId),a.nextViewOptions({historyRoot:!0}),t.go("app.view_page",{id:e.id,refresh:!0})})).catch((function(n){e.saving=!1,c.onError("REGISTRY.ERROR.SAVE_RECORD_FAILED")(n)}))):(console.debug("[ES] [page] Waiting debounce end, before saving..."),n((function(){return e.save(o,!0)}),650)):i.reject()},e.openPicturePopup=function(){l.camera.getPicture().then((function(n){n&&e.pictures.push({src:"data:image/png;base64,"+n})})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED"))},e.rotateAvatar=function(){if(e.avatar&&e.avatar.src&&!e.rotating)return e.rotating=!0,c.image.rotateSrc(e.avatar.src).then((function(n){e.avatar.src=n,e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.rotating=!1})).catch((function(n){console.error(n),e.rotating=!1}))},e.fileChanged=function(n){return c.loading.show(),i((function(t,i){var a=n.target.files[0];c.image.resizeFile(a).then((function(n){e.pictures.push({src:n}),c.loading.hide(),t()}))}))},e.removePicture=function(n){e.pictures.splice(n,1)},e.favoritePicture=function(n){if(n>0){var t=e.pictures[n];e.pictures.splice(n,1),e.pictures.splice(0,0,t)}},e.cancel=function(){a.goBack()},e.showAvatarModal=function(){return l.camera.enable?l.camera.getPicture().then((function(n){n&&(e.avatar={src:"data:image/png;base64,"+n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.avatarClass={})})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):u.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(n){n&&(e.avatar={src:n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.avatarClass={})}))},e.showRecordTypeModal=function(){u.show("plugins/es/templates/registry/modal_record_type.html").then((function(n){n&&(e.formData.type=n,e.avatar||(e.avatarClass["cion-page-"+n]=!0))}))},e.showCategoryModal=function(n){m.category.all().then((function(e){return u.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.formData.category=n)}))}}function le(e,n,t){e.extensionPoint=t.extensions.points.current.get(),e.enable=n.isEnable(),n.api.state.on.changed(e,(function(n){e.enable=n}))}function ce(e,n,t,i,a,o,s,r,l,c,u,d){angular.extend(this,i("ESLookupPositionCtrl",{$scope:e})),e.enable=u.isEnable(),e.search={location:void 0},e.options=e.options||angular.merge({type:{show:!0},location:{show:!0,prefix:void 0}},c.plugins&&c.plugins.market&&c.plugins.market.record||{}),u.api.state.on.changed(e,(function(n){e.enable=n})),e.onGeoPointChanged=function(){e.search.loading||e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon&&!e.search.geoPoint.exact&&e.doSearch()},e.$watch("search.geoPoint",e.onGeoPointChanged,!0),e.resolveLocationPosition=function(){if(!e.search.loadingPosition)return e.search.loadingPosition=!0,e.searchPosition(e.search.location).then((function(n){if(!n)throw e.search.loadingPosition=!1,e.search.geoPoint=void 0,"CANCELLED";e.search.geoPoint=n,n.shortName&&!n.exact&&(e.search.location=n.shortName),e.search.loadingPosition=!1}))},e.doSearch=function(i){if(!e.search.geoPoint)return e.searchPosition(e.search.location).then((function(n){if(n)return e.search.geoPoint=n,e.search.location?e.doSearch():(e.search.geoPoint.exact=!0,s("MARKET.COMMON.AROUND_ME").then((function(n){return e.doSearch(n)})))})).catch((function(e){return console.error(e),t.go("app.market_lookup")}));var a=i||e.search.location&&e.search.location.split(", ")[0];if(a&&e.search.geoPoint){n.geoPoints=n.geoPoints||{},n.geoPoints[a]=e.search.geoPoint;var o={lat:e.search.geoPoint&&e.search.geoPoint.lat,lon:e.search.geoPoint&&e.search.geoPoint.lon,location:a};return l.screen.isSmall()?t.go("app.market_lookup",o):t.go("app.market_lookup_lg",o)}e.search.geoPoint=void 0},e.showNewRecordModal=function(){return e.loadWallet({minData:!0}).then((function(){return l.loading.hide()})).then((function(){return!e.options.type.show&&e.options.type.default?e.options.type.default:r.show("plugins/market/templates/record/modal_record_type.html")})).then((function(e){e&&t.go("app.market_add_record",{type:e})}))},e.$parent.showJoinModal=d.showJoin,e.$parent.showLoginModal=d.showLogin,e.$parent.showHelpModal=d.showHelp,l.screen.isSmall()||o((function(){a("searchLocationInput")}),500)}function ue(e,n){angular.extend(this,n("LoginModalCtrl",{$scope:e}))}function de(e,n,t,i,a,o){angular.extend(this,n("LoginModalCtrl",{$scope:e}));var s="^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,6}$";e.usernamePattern=s+"|^[0-9]{9,10}$",e.onWalletLogin=function(n,a){a=a||t.defer();var r=i.plugins&&i.plugins.market&&i.plugins.market.defaultAdminPubkeys;if(r&&r.length){console.error("[market] [login] Storing username into user profile socials");var l=new RegExp(s).test(e.formData.username),c={url:e.formData.username,type:l?"email":"phone"},u=[angular.merge({recipient:n.pubkey},c)];u=(r||[]).reduce((function(e,n){return e.concat(angular.merge({recipient:n},c))}),u),o.setDefaultProfile({socials:u})}return a.resolve(n),a.promise},a.api.data.on.login(e,e.onWalletLogin,this)}function pe(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g,h){angular.extend(this,s("ESLookupPositionCtrl",{$scope:e})),e.search={text:"",type:null,lastRecords:!0,results:[],loading:!0,category:null,location:null,geoPoint:null,options:null,loadingMore:!1,showClosed:!1,showOld:!1,geoDistance:isNaN(p.data.plugins.es.geoDistance)?20:p.data.plugins.es.geoDistance,sortAttribute:null,sortDirection:"desc"},e.options=e.options||angular.merge({type:{show:!0},category:{show:!0},description:{show:!0},location:{show:!0,prefix:void 0},fees:{show:!0}},d.plugins&&d.plugins.market&&d.plugins.market.record||{}),e.$watch("search.showClosed",(function(){e.options.showClosed=e.search.showClosed}),!0),e.$watch("search.showOld",(function(){e.options.showOld=e.search.showOld}),!0),e.init=function(){return i.all([g.currencies().then((function(n){e.currencies=n})),o("LOCATION.DISTANCE_UNIT").then((function(n){e.geoUnit=n}))]).then((function(){r((function(){l.ink({selector:".item"})}),200)}))},e.toggleAdType=function(n){n===e.search.type?e.search.type=void 0:e.search.type=n,e.search.lastRecords?e.doGetLastRecords():e.doSearch()},e.doSearch=function(n){if(e.search.loading=!n,e.search.lastRecords=!1,e.search.advanced||(e.search.advanced=!1),e.search.location&&!e.search.geoPoint)return e.searchPosition(e.search.location).then((function(t){return t?(e.search.geoPoint=t,e.search.location=t.name&&t.name.split(",")[0]||e.search.location,e.doSearch(n)):(e.search.loading=!1,l.alert.error("MARKET.ERROR.GEO_LOCATION_NOT_FOUND"))}));var t=e.search.text.trim(),i=[],o=[],s=t?c.util.parseTags(t):void 0;if(t.length>1&&(E.regexp.PUBKEY.test(t)?(i=[],o.push({term:{issuer:t}})):(t=t.toLowerCase(),i.push({multi_match:{query:t,fields:["title","description"],type:"phrase_prefix"}}),i.push({match:{title:{query:t,boost:2}}}),i.push({prefix:{title:t}}),i.push({match:{description:t}}),i.push({nested:{path:"category",query:{bool:{filter:{match:{"category.name":t}}}}}}))),e.search.category&&o.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.search.category.id}}}}}}),s&&o.push({terms:{tags:s}}),!i.length&&!o.length)return e.doGetLastRecords();var r={},u=e.search.location&&e.search.location.trim().toLowerCase();if(e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon){if(u&&u.length){var d=u.split(",")[0];o.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{multi_match:{query:d,fields:["city^3","location"]}}]},{geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}}]}),r.location=e.search.location.trim()}else o.push({geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}});r.lat=e.search.geoPoint.lat,r.lon=e.search.geoPoint.lon}if(e.search.showClosed?r.closed=!0:o.push({range:{stock:{gt:0}}}),e.search.showOld)r.old=!0;else{var p=Date.now()/1e3-31536e3;o.push({range:{time:{gt:p}}})}e.search.type&&(o.push({term:{type:e.search.type}}),r.type=e.search.type),e.currencies&&o.push({terms:{currency:e.currencies}}),r.q=e.search.text;var m={bool:{}};i.length>0&&(m.bool.should=i,m.bool.minimum_should_match=1),o.length>0&&(m.bool.filter=o),n||a.search(r).replace();var g={query:m,from:n};return e.search.sortAttribute&&(g.sort=g.sort||{},g.sort[e.search.sortAttribute]="asc"==e.search.sortDirection?"asc":"desc"),e.doRequest(g)},e.doGetLastRecords=function(n){e.hideActionsPopover(),e.search.lastRecords=!0;var t={sort:{creationTime:"desc"},from:n},i=[],o=[];if(e.search.showClosed||i.push({range:{stock:{gt:0}}}),!e.search.showOld){var s=Date.now()/1e3-31536e3;i.push({range:{time:{gt:s}}})}e.search.type&&i.push({term:{type:e.search.type}}),e.currencies&&i.push({terms:{currency:e.currencies}}),e.search.category&&i.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.search.category.id}}}}}});var r=e.search.location&&e.search.location.trim().toLowerCase();if(e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon)if(r&&r.length){var l=r.split(",")[0];i.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{multi_match:{query:l,fields:["city^3","location"]}}]},{geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}}]})}else i.push({geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}});return o.length&&(t.query={bool:{}},t.query.bool.should=o,t.query.bool.minimum_should_match=1),i.length&&(t.query=t.query||{bool:{}},t.query.bool.filter=i),n||a.search({last:!0,category:e.search.category&&e.search.category.id,type:e.search.type,location:e.search.location,lat:e.search.geoPoint&&e.search.geoPoint.lat,lon:e.search.geoPoint&&e.search.geoPoint.lon}).replace(),e.doRequest(t)},e.doRefresh=function(){return(e.search.lastRecords?e.doGetLastRecords:e.doSearch)()},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,(e.search.lastRecords?e.doGetLastRecords:e.doSearch)(n).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.doRequest=function(n){return(n=n||{}).from=n.from||0,n.size=n.size||10,n.size<10&&(n.size=10),e.search.loading=0===n.from,m.record.search(n).then((function(i){if(!i||!i.hits||!i.hits.length)return e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.hasMore=!1,void(e.search.loading=!1);var a=t("formatSlug");return _.forEach(i.hits,(function(e){e.urlTitle=a(e.title)})),h.fillAvatars(i.hits,"issuer").then((function(t){n.from?e.search.results=e.search.results.concat(t):(e.search.results=t,e.search.total=i.total),e.search.hasMore=e.search.results.length<e.search.total}))})).then((function(){e.search.loading=!1,e.motion.show()})).catch((function(t){e.search.loading=!1,e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.hasMore=!1,l.onError("MARKET.ERROR.LOOKUP_RECORDS_FAILED")(t)}))},e.showCategoryModal=function(){return m.category.all().then((function(e){return u.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.search.category=n,e.doSearch())}))},e.showNewRecordModal=function(){return e.loadWallet({minData:!0}).then((function(){return l.loading.hide()})).then((function(){return!e.options.type.show&&e.options.type.default?e.options.type.default:u.show("plugins/market/templates/record/modal_record_type.html")})).then((function(e){e&&n.go("app.market_add_record",{type:e})}))},e.showRecord=function(t,i){if(!t.defaultPrevented){var a=e.search.results[i];a&&n.go("app.market_view_record",{id:a.id,title:a.title})}}}function me(e,n,t,i,a,o,s,r){angular.extend(this,t("MkLookupAbstractCtrl",{$scope:e})),e.enter=function(t,i){if(!e.entered||!e.search.results||0===e.search.results.length){var a=!1;if(i.stateParams){if(i.stateParams.q?(e.search.text=i.stateParams.q,e.search.lastRecords=!1):i.stateParams.last&&(e.search.lastRecords=!0),i.stateParams.type&&(e.search.type=i.stateParams.type),i.stateParams.location&&(e.search.location=i.stateParams.location),i.stateParams.lat&&i.stateParams.lon)e.search.geoPoint={lat:parseFloat(i.stateParams.lat),lon:parseFloat(i.stateParams.lon)};else if(i.stateParams.location)e.search.geoPoint=n.geoPoints&&n.geoPoints[i.stateParams.location]||null;else{var o=r.data.plugins.es.market&&r.data.plugins.es.market.defaultSearch;o&&o.location&&angular.merge(e.search,o)}i.stateParams.hash&&(e.search.text?e.search.text="#"+i.stateParams.hash+" "+e.search.text:e.search.text="#"+i.stateParams.hash),angular.isDefined(i.stateParams.closed)&&(e.search.showClosed=!0,a=!0),angular.isDefined(i.stateParams.old)&&(e.search.showOld=!0,a=!0)}i.stateParams&&(i.stateParams.category||i.stateParams.cat)?s.category.get({id:i.stateParams.category||i.stateParams.cat}).then((function(n){return e.search.category=n,e.init()})).then((function(){return e.finishEnter(a)})):e.init().then((function(){return e.finishEnter(a)}))}},e.$on("$ionicView.enter",e.enter),e.finishEnter=function(n){e.search.advanced=!!n||e.search.advanced,e.search.lastRecords?e.doGetLastRecords().then((function(){e.showFab("fab-add-market-record")})):e.doSearch().then((function(){e.showFab("fab-add-market-record")})),i("marketSearchText"),e.entered=!0},e.updateSettings=function(){var n=!1;r.data.plugins.es.market=r.data.plugins.es.market||{},r.data.plugins.es.market.defaultSearch=r.data.plugins.es.market.defaultSearch||{};var t=e.search.location&&e.search.location.trim(),i=r.data.plugins.es.market.defaultSearch.location;i&&i===t||(r.data.plugins.es.market.defaultSearch={location:t,geoPoint:t&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0},n=!0);var o=r.data.plugins.es.geoDistance;o&&o===e.search.geoDistance||(r.data.plugins.es.geoDistance=e.search.geoDistance,n=!0),n&&a((function(){r.store()}))},e.leave=function(){e.updateSettings()},e.$on("$ionicView.leave",(function(){return e.leave()})),e.onGeoPointChanged=function(){e.search.loading||e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon&&!e.search.geoPoint.exact&&e.doSearch()},e.$watch("search.geoPoint",e.onGeoPointChanged,!0),e.onLocationChanged=function(){e.search.loading||e.search.location||e.removeLocation()},e.$watch("search.location",e.onLocationChanged,!0),e.onToggleShowClosedAdChanged=function(n){!e.search.loading&&e.entered&&e.doRefresh()},e.$watch("search.showClosed",e.onToggleShowClosedAdChanged,!0),e.onGeoDistanceChanged=function(){!e.search.loading&&e.entered&&e.search.location&&e.doRefresh()},e.$watch("search.geoDistance",e.onGeoDistanceChanged,!0),e.onCategoryClick=function(n){n&&n.parent&&(e.search.category=n,e.options.category.show=!0,e.search.showCategories=!1,e.doSearch())},e.removeCategory=function(){e.search.category=null,e.category=null,e.doSearch()},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.updateSettings(),e.doSearch()},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl("plugins/market/templates/search/lookup_actions_popover.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.toggleShowClosed=function(){e.hideActionsPopover(),e.search.showClosed=!e.search.showClosed}}function Ee(e,n,t,i,a,o,s,r){e.zoomMin=1,e.categories=[],e.pictures=[],e.activeSlide=0,e.activeCategory=null,e.activeCategoryIndex=0,e.started=!1,e.options=e.options||angular.merge({category:{filter:void 0},slideDuration:5e3,showClosed:!1},n.plugins&&n.plugins.market&&n.plugins.market.record||{}),e.slideDurationLabels={3e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:3}},5e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:5}},1e4:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:10}},15e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:15}},2e4:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:20}}},e.slideDurations=_.keys(e.slideDurationLabels),e.resetSlideShow=function(){delete e.activeCategory,delete e.activeCategoryIndex,delete e.activeSlide,delete e.categories},e.startSlideShow=function(n){return e.activeCategory&&e.activeCategory.pictures&&e.activeCategory.pictures.length?e.showPicturesModal(e.activeCategoryIndex,e.activeSlide):((n=n||{}).filter=n.filter||e.options&&e.options.category&&e.options.category.filter,n.withStock=!e.options||!e.options.showClosed,n.withOld=e.options&&e.options.showOld,e.stop(),e.loading=!0,delete e.activeCategory,delete e.activeCategoryIndex,delete e.activeSlide,r.category.stats(n).then((function(n){return e.categories=_.filter(n,(function(e){return e.count>0&&e.children&&e.children.length})),e.nextCategory()})).then((function(){e.loading=!1})).catch((function(n){console.error(n),e.loading=!1})).then((function(){if(e.categories&&e.categories.length)return e.showPicturesModal(0,0)})))},e.showPicturesModal=function(n,t,i){return e.activeCategoryIndex=n,e.activeSlide=t,e.activeCategory=e.categories[n],e.modal?(a.slide(t),a.update(),e.modal.show().then((function(){i||e.start()}))):o.fromTemplateUrl("plugins/market/templates/gallery/modal_slideshow.html",{scope:e}).then((function(n){return e.modal=n,e.modal.scope.closeModal=e.hidePictureModal,e.$on("$destroy",(function(){e.modal&&(e.modal.remove(),delete e.modal)})),e.modal.show().then((function(){i||e.start()}))}))},e.hidePictureModal=function(){return e.stop(),e.modal&&e.modal.isShown()?e.modal.hide():t.when()},e.start=function(){e.interval&&s.cancel(e.interval),console.debug("[market] [gallery] Start slideshow"),e.interval=s((function(){e.nextSlide()}),e.options.slideDuration)},e.stop=function(){e.interval&&(console.debug("[market] [gallery] Stop slideshow"),s.cancel(e.interval),delete e.interval)},e.nextCategory=function(n){if(!e.categories||!e.categories.length)return t.when();if((n=n||!!e.interval)&&e.modal.isShown())return e.hidePictureModal().then((function(){return e.nextCategory(n)}));if(e.activeCategoryIndex=e.loading?0:e.activeCategoryIndex+1,e.activeCategoryIndex===e.categories.length)return e.resetSlideShow(),n?e.startSlideShow():t.when();var i=e.categories[e.activeCategoryIndex];return r.record.pictures({categories:_.pluck(i.children,"id"),size:1e3,withStock:!e.options||!e.options.showClosed}).then((function(t){if(i.pictures=t,n)return e.showPicturesModal(e.activeCategoryIndex,0)}))},e.nextSlide=function(){e.activeCategory&&e.activeCategory.pictures&&e.activeCategory.pictures.length&&a.currentIndex()!=e.activeCategory.pictures.length-1?a.next():e.nextCategory()},e.updateSlideStatus=function(n){i.$getByHandle("scrollHandle"+n).getScrollPosition().zoom==e.zoomMin?a.enableSlide(!0):a.enableSlide(!1)},e.isLoadedCategory=function(e){return e.pictures&&e.pictures.length>0},e.slideChanged=function(n){e.activeSlide=n}}function ge(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g,h,b,f,_){function T(n,t){return t=t||s.defer(),e.updateButtons(),e.loadLikes(),t.resolve(),t.promise}e.formData={},e.id=null,e.category={},e.pictures=[],e.canEdit=!1,e.maxCommentSize=10,e.loading=!0,e.motion=d.motion.fadeSlideInRight,e.smallscreen=d.screen.isSmall(),e.moreAdMotion=d.motion.default,e.smallpictures=!1,e.options=e.options||angular.merge({type:{show:!0},category:{show:!0},description:{show:!0},location:{show:!0,prefix:void 0},like:{kinds:["VIEW","LIKE","FOLLOW","ABUSE"],index:"market",type:"record",service:_.record.like}},m.plugins&&m.plugins.market&&m.plugins.market.record||{}),e.likeData={views:{},likes:{},follows:{},abuses:{}},e.search={type:null,results:[],total:0,loading:!0},angular.extend(this,r("ESLikesCtrl",{$scope:e})),e.enter=function(n,t){t.stateParams&&t.stateParams.id?(e.loading||t.stateParams.refresh?e.load(t.stateParams.id):(d.loading.hide(),e.updateButtons()),e.$broadcast("$recordView.enter",t)):a.go("app.market_lookup")},e.$on("$ionicView.enter",e.enter),e.$on("$ionicView.beforeLeave",(function(n,t){e.$broadcast("$recordView.beforeLeave",t)})),e.load=function(n){e.loading=!0,e.formData={};var t=_.record.load(n,{fetchPictures:!1,convertPrice:!0,html:!0}).then((function(n){e.formData=n.record,e.formData.feesCurrency=n.record.feesCurrency||n.record.currency,delete e.formData.useRelative,e.id=n.id,e.issuer=n.issuer,e.loadIssuerStars(e.issuer.pubkey),e.smallscreen||e.loadMoreLikeThis(n),e.updateView(),d.loading.hide(),e.loading=!1})).catch((function(t){e.secondTry?(e.loading=!1,d.loading.hide(),t&&404===t.ucode?(d.toast.show("MARKET.ERROR.RECORD_NOT_EXISTS"),a.go("app.market_lookup")):d.onError("MARKET.ERROR.LOAD_RECORD_FAILED")(t)):(e.secondTry=!0,s((function(){e.load(n)}),100))}));return l((function(){e.loadPictures(n),e.$broadcast("$recordView.load",n,_.record)})),t},e.loadPictures=function(n){return n=n||e.id,_.record.picture.all({id:n}).then((function(n){n._source.pictures&&(e.pictures=n._source.pictures.reduce((function(e,n){return e.concat(f.image.fromAttachment(n.file))}),[]),e.pictures.length&&e.motion.show({selector:".lazy-load .item.card-gallery",ink:!1}))})).catch((function(){e.pictures=[]}))},e.loadMoreLikeThis=function(n){return _.record.moreLikeThis(n.id,{category:n.record.category.id,type:n.record.type,city:n.record.city}).then((function(n){n&&n.total&&(e.search.results=n.hits,e.search.total=n.total,e.search.loading=!1,e.motion.show({selector:".list.list-more-record .item",ink:!0}))}))},e.loadIssuerStars=function(n){this.canEdit||g.isLogin()&&g.isUserPubkey(n)||b.like.count(n,{kind:"star",issuer:g.isLogin()?g.data.pubkey:void 0}).then((function(n){e.issuer.stars=n}))},e.updateView=function(){e.updateButtons(),e.motion.show({selector:".list > .item",ink:!0}),e.canEdit||e.showFab("fab-like-market-record-"+e.id)},e.updateButtons=function(){e.canEdit=e.formData&&g.isUserPubkey(e.formData.issuer),e.canSold=e.canEdit&&e.formData.stock>0,e.canReopen=e.canEdit&&0===e.formData.stock,e.canReopen&&(e.canEdit=!1)},e.markAsView=function(){if(e.likeData&&e.likeData.views&&!e.likeData.views.wasHit&&!e.canEdit&&!g.isUserPubkey(e.formData.issuer)){var n=l((function(){g.isLogin()&&e.options.like.service.add(e.id,{kind:"view"}).then((function(){e.likeData.views.total=(e.likeData.views.total||0)+1})),n=null}),3e3);e.$on("$destroy",(function(){n&&l.cancel(n)}))}},e.refreshConvertedPrice=function(){e.loading=!0},e.$watch("$root.settings.useRelative",e.refreshConvertedPrice,!0),e.edit=function(){a.go("app.market_edit_record",{id:e.id,title:c("formatSlug")(e.formData.title)}),e.loading=!0},e.delete=function(){e.hideActionsPopover(),d.alert.confirm("MARKET.VIEW.REMOVE_CONFIRMATION").then((function(n){n&&_.record.remove(e.id).then((function(){o.nextViewOptions({historyRoot:!0}),a.go("app.market_lookup"),d.toast.show("MARKET.INFO.RECORD_REMOVED")})).catch(d.onError("MARKET.ERROR.REMOVE_RECORD_FAILED"))}))},e.sold=function(){e.hideActionsPopover(),d.alert.confirm("MARKET.VIEW.SOLD_CONFIRMATION").then((function(n){if(n)return d.loading.show(),_.record.setStock(e.id,0).then((function(){e.canSold=!1,e.canReopen=!0,e.canEdit=!1})).catch(d.onError("MARKET.ERROR.SOLD_RECORD_FAILED")).then((function(){o.nextViewOptions({disableBack:!0,disableAnimate:!1,historyRoot:!0}),l((function(){d.toast.show("MARKET.INFO.RECORD_SOLD")}),500),a.go("app.market_lookup")}))}))},e.reopen=function(){e.hideActionsPopover(),d.alert.confirm("MARKET.VIEW.REOPEN_CONFIRMATION").then((function(n){if(n)return d.loading.show().then((function(){return _.record.setStock(e.id,1).then((function(){return e.canSold=!0,e.canReopen=!1,e.canEdit=!0,d.loading.hide()})).then((function(){d.toast.show("MARKET.INFO.RECORD_REOPEN")})).catch(d.onError("MARKET.ERROR.REOPEN_RECORD_FAILED"))}))}))},e.showActionsPopover=function(n){d.popover.show(n,{templateUrl:"plugins/market/templates/record/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},e.showSharePopover=function(n){e.hideActionsPopover();var t=e.formData.title,i=f.getUrl("/market/record/"+e.id+"/_share");d.screen.isSmall()&&(n=angular.element(document.querySelector("#record-share-anchor-"+e.id))||n),d.popover.share(n,{bindings:{url:i,titleKey:"MARKET.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},time:e.formData.time,postMessage:t,postImage:e.pictures.length>0?e.pictures[0]:null}})},e.showNewMessageModal=function(){return s.all([u("MARKET.VIEW.NEW_MESSAGE_TITLE",e.formData),e.loadWallet({minData:!0})]).then((function(n){var t=n[0];return d.loading.hide(),h.showMessageCompose({title:t,destPub:e.issuer.pubkey,destUid:e.issuer.name||e.issuer.uid})})).then((function(e){e&&d.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))},e.buy=function(){return e.hideActionsPopover(),e.loadWallet().then((function(n){if(d.loading.hide(),n)return p.showTransfer({pubkey:e.issuer.pubkey,uid:e.issuer.name||e.issuer.uid,amount:e.formData.price}).then((function(e){if(e)return d.toast.show("INFO.TRANSFER_SENT")}))}))},e.showRecord=function(n,t){if(!n.defaultPrevented){var i=e.search.results[t];i&&a.go("app.market_view_record",{id:i.id,title:i.title})}},g.api.data.on.login(e,T,this),g.api.data.on.logout(e,T,this)}function he(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g,h){e.options=e.options||angular.merge({recordType:{show:!0,canEdit:!0},category:{show:!0,filter:void 0},description:{show:!0},location:{show:!0,required:!0},position:{showCheckbox:!0,required:!0},unit:{canEdit:!0},login:{type:"full"}},p.plugins&&p.plugins.market&&p.plugins.market.record||{}),angular.extend(this,c("ESPositionEditCtrl",{$scope:e})),e.formData={price:null,category:{},geoPoint:null,useRelative:E.data.useRelative},e.id=null,e.pictures=[],e.loading=!0,e.motion=u.motion.ripple,e.setForm=function(n){e.form=n},e.$on("$ionicView.enter",(function(n,i){return t.all([h.currencies(),e.loadWallet({minData:!0})]).then((function(n){e.currencies=n[0],i.stateParams&&i.stateParams.id?e.load(i.stateParams.id):(i.stateParams&&i.stateParams.type&&(e.formData.type=i.stateParams.type),e.formData.type=e.formData.type||e.options.type&&e.options.type.default||"offer",e.formData.currency=e.currencies&&e.currencies[0],e.loading=!1,u.loading.hide(),e.motion.show()),e.options.focus&&!u.screen.isSmall()&&l("market-record-title")})).catch((function(n){"CANCELLED"===n&&(e.motion.hide(),e.showHome())}))})),e.showUnitPopover=function(n){u.popover.show(n,{templateUrl:"templates/wallet/popover_unit.html",scope:e,autoremove:!0}).then((function(n){e.formData.useRelative=n}))},e.cancel=function(){e.closeModal()},e.load=function(n){return u.loading.show(),s.record.load(n,{fetchPictures:!0,convertPrice:!1}).then((function(n){angular.merge(e.formData,n.record),e.formData.useRelative="UD"===n.record.unit,e.formData.useRelative||(e.formData.price=e.formData.price?e.formData.price/100:void 0,e.formData.fees=e.formData.fees?e.formData.fees/100:void 0),e.formData.currency||(e.formData.currency=e.currency),!e.formData.city&&e.formData.location&&(e.formData.city=e.formData.location),e.formData.location&&(e.formData.location=null),e.id=n.id,e.pictures=n.record.pictures||[],delete e.formData.pictures,e.dirty=!1,e.motion.show({selector:".animate-ripple .item, .card-gallery"}),u.loading.hide(),o((function(){e.loading=!1}),1e3)})).catch(u.onError("MARKET.ERROR.LOAD_RECORD_FAILED"))},e.save=function(a,l){return e.form.$submitted=!0,!e.saving&&e.form.$valid&&e.formData.category.id?l?(e.saving=!0,console.debug("[ES] [market] Saving record..."),u.loading.show({delay:0}).then((function(){var n=angular.copy(e.formData);delete n.useRelative;var t=e.formData.useRelative?"UD":"unit";return angular.isDefined(n.price)&&null!=n.price?("string"==typeof n.price&&(n.price=parseFloat(n.price.replace(new RegExp("[.,]"),"."))),n.unit=t,"unit"===t&&(n.price=100*n.price),n.currency||(n.currency=e.currency)):(n.unit=null,n.price=null,n.currency||(n.currency=e.currency)),n.fees?("string"==typeof n.fees&&(n.fees=parseFloat(n.fees.replace(new RegExp("[.,]"),"."))),"unit"===t&&(n.fees=100*n.fees),n.feesCurrency||(n.feesCurrency=n.currency||e.currency),n.unit=n.unit||t):(n.fees=null,n.feesCurrency=null),n.time=m.date.now(),n.geoPoint&&n.geoPoint.lat&&n.geoPoint.lon?(n.geoPoint.lat=parseFloat(n.geoPoint.lat),n.geoPoint.lon=parseFloat(n.geoPoint.lon)):n.geoPoint=null,angular.isDefined(n.location)&&(n.location=null),n.picturesCount=e.pictures.length,n.picturesCount?u.image.resizeSrc(e.pictures[0].src,!0).then((function(t){return n.thumbnail=m.image.toAttachment({src:t}),n.pictures=e.pictures.reduce((function(e,n){return e.concat({file:m.image.toAttachment({src:n.src})})}),[]),n})):(e.formData.thumbnail&&(n.thumbnail={_content:"",_content_type:""}),n.pictures=[],n)})).then((function(n){return e.id?s.record.update(n,{id:e.id}):(n.creationTime=m.date.now(),n.stock=angular.isDefined(n.stock)?n.stock:1,s.record.add(n))})).then((function(t){var a=!e.id;if(e.id=e.id||t,e.saving=!1,e.dirty=!1,r.backView()){var o=n.$on("$stateChangeSuccess",(function(n,t,a,s,r){n.preventDefault(),i.go("app.market_view_record",{id:e.id},{location:"replace",reload:!0}),o()}));r.goBack(a?-1:-2)}else r.nextViewOptions({historyRoot:!0}),i.go("app.market_view_record",{id:e.id})})).catch((function(n){e.saving=!1,n&&"ES_HTTP.ERROR.MAX_UPLOAD_BODY_SIZE"===n.message&&(n.message="MARKET.ERROR.RECORD_EXCEED_UPLOAD_SIZE"),u.onError("MARKET.ERROR.FAILED_SAVE_RECORD")(n)}))):(console.debug("[ES] [market] Waiting debounce end, before saving..."),o((function(){return e.save(a,!0)}),650)):t.reject()},e.openCurrencyLookup=function(){alert("Not implemented yet. Please submit an issue if occur again.")},e.cancel=function(){e.dirty=!1,r.goBack()},e.$on("$stateChangeStart",(function(n,t,a,o){if(e.dirty&&!e.saving&&(n.preventDefault(),!e.loading))return u.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){if(n)return e.save()})).then((function(){e.dirty=!1,r.nextViewOptions({historyRoot:!0}),i.go(t.name,a),u.loading.hide()}))})),e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.showRecordTypeModal=function(){d.show("plugins/market/templates/record/modal_record_type.html").then((function(n){n&&(e.formData.type=n)}))},e.showCategoryModal=function(){(e.options&&e.options.category&&e.options.category.filter?s.category.filtered({filter:e.options.category.filter}):s.category.all()).then((function(e){return d.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.formData.category=n)}))}}function be(e,n,t){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.search.showClosed=!0,e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){e.loadWallet().then((function(n){e.search.text=n.pubkey,e.search.lastRecords=!1,e.search.sortAttribute="creationTime",e.search.sortDirection="desc",e.entered&&e.search.results&&0!==e.search.results.length||e.doSearch().then((function(){e.showFab("fab-wallet-add-market-record")}))})).catch((function(n){if("CANCELLED"==n)return e.showHome();console.error(n)})),e.entered=!0},e.$on("$ionicView.enter",e.enter)}function fe(e,n,t,i){e.loading=!0,e.motion=n.motion.ripple,e.options=e.options||angular.merge({category:{filter:void 0},showClosed:!1},t.plugins&&t.plugins.market&&t.plugins.market.record||{}),e.load=function(n){return e.loading=!0,(n=n||{}).filter=n.filter||e.options&&e.options.category&&e.options.category.filter,n.withStock=!e.options||!e.options.showClosed,i.category.stats(n).then((function(n){e.categories=n,e.totalCount=e.categories.reduce((function(e,n){return e+n.count}),0),e.loading=!1,e.motion.show&&e.motion.show()}))},e.refresh=function(){if(!e.loading)return e.load()},e.$watch("options.showClosed",e.refresh,!0)}function _e(e,n,t){angular.extend(this,n("MkListCategoriesCtrl",{$scope:e})),e.enter=function(n,t){return e.load().then((function(){e.loading=!1,e.entered||e.motion.show(),e.entered=!0}))},e.$on("$ionicView.enter",e.enter),e.onCategoryClick=function(e){return t.go("app.market_lookup",{category:e&&e.id})}}function Te(e,n,t){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){if(e.pubkey=t&&t.stateParams&&t.stateParams.pubkey,!e.pubkey)return e.showHome();e.search.text=e.pubkey,e.search.lastRecords=!1,e.doSearch(),e.entered=!0},e.$on("$ionicView.enter",e.enter)}function ve(e,n,t,i,a){angular.extend(this,n("ESLastDocumentsCtrl",{$scope:e})),e.search.index="user,page,group,market",e.search.type="profile,record,comment",e._source=["issuer","hash","time","creationTime","title","price","unit","currency","picturesCount","thumbnail._content_type","city","message","record"],e.inheritedSelectDocument=e.selectDocument,e.selectDocument=function(n,t){if("market"===t.index){if(t&&n&&!n.defaultPrevented)if(n.stopPropagation(),"market"===t.index&&"record"===t.type)i.go("app.market_view_record",{id:t.id,title:t.title});else if("market"===t.index&&"comment"===t.type){var o=a("formatHash")(t.id);i.go("app.market_view_record_anchor",{id:t.record,anchor:o})}}else e.inheritedSelectDocument(n,t)}}function Oe(e,n,t,i,a,o,s,r){function l(n){return moment.unix(n).utc().startOf(e.formData.rangeDuration).unix()}e.loading=!0,e.formData=e.formData||{useRelative:o.data.useRelative,timePct:100,rangeDuration:"day",firstBlockTime:0,scale:"linear",hide:[],beginAtZero:!0},e.formData.useRelative=!1,e.scale="linear",e.height=void 0,e.width=void 0,e.maintainAspectRatio=!0,e.times=[],e.enter=function(n,t){if(e.loading){if(t&&t.stateParams&&(e.stateName=t&&t.stateName,e.stateParams=angular.copy(t&&t.stateParams||{}),!e.formData.currency&&t&&t.stateParams&&t.stateParams.currency&&(e.formData.currency=t.stateParams.currency),t.stateParams.t?e.formData.timePct=t.stateParams.t:t.stateParams.timePct&&(e.formData.timePct=t.stateParams.timePct),t.stateParams.stepUnit&&(e.formData.rangeDuration=t.stateParams.stepUnit),t.stateParams.scale&&(e.formData.scale=t.stateParams.scale),t.stateParams.hide&&(e.formData.hide=t.stateParams.hide.split(",").reduce((function(e,n){return e.concat(parseInt(n))}),[]))),e.init(n,t),!e.formData.currency)return s.get().then((function(i){return e.formData.currency=i?i.name:null,e.formData.firstBlockTime=i?l(i.firstBlockTime):0,e.formData.firstBlockTime||console.warn("[graph] currency.firstBlockTime not loaded ! Should have been loaded by currrency service!"),e.formData.currencyAge=l(moment().utc().unix())-e.formData.firstBlockTime,e.enter(n,t)}));e.load().then((function(){e.setScale(e.formData.scale),e.updateHiddenDataset(),e.loading=!1}))}},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.updateLocation=function(){e.stateName&&(i.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),e.stateParams=e.stateParams||{},e.stateParams.t=e.formData.timePct>=0&&e.formData.timePct<100?e.formData.timePct:void 0,e.stateParams.stepUnit="day"!=e.formData.rangeDuration?e.formData.rangeDuration:void 0,e.stateParams.hide=e.formData.hide&&e.formData.hide.length?e.formData.hide.join(","):void 0,e.stateParams.scale="linear"!=e.formData.scale?e.formData.scale:void 0,a.go(e.stateName,e.stateParams,{reload:!1,inherit:!0,notify:!1}))},e.setSize=function(n,t,i){e.height=n,e.width=t,e.maintainAspectRatio=angular.isDefined(i)?i:e.maintainAspectRatio},e.$on("csView.action.refresh",(function(n,t){if(!t||"currency"==t)return e.load()})),e.init=function(e,n){},e.load=function(){},e.toggleScale=function(){e.setScale("linear"===e.formData.scale?"logarithmic":"linear"),e.updateLocation()},e.setScale=function(t){if(e.hideActionsPopover(),e.formData.scale=t,e.options&&e.options.scales&&e.options.scales.yAxes){var i=n("formatInteger");_.forEach(e.options.scales.yAxes,(function(n,a){n.type=t,n.ticks=n.ticks||{},"linear"==t?(n.ticks.beginAtZero=!angular.isDefined(e.formData.beginAtZero)||e.formData.beginAtZero,delete n.ticks.min,n.ticks.callback=function(e){return i(e)}):(delete n.ticks.beginAtZero,delete n.ticks.callback,n.ticks.callback=function(e,n){if(e)return Math.log10(e)%1==0||Math.log10(e/3)%1==0?i(e):""})}))}},e.setRangeDuration=function(n){e.hideActionsPopover(),e.formData&&n==e.formData.rangeDuration||(e.formData.rangeDuration=n,delete e.formData.startTime,delete e.formData.endTime,delete e.formData.rangeDurationSec,e.load(),e.updateLocation())},e.updateHiddenDataset=function(n){n=n||e.datasetOverride||{},_.forEach(e.formData.hide||[],(function(t){if(n[t]){n[t].hidden=!0;var i=n[t].yAxisID,a=i&&e.options&&e.options.scales&&_.findWhere(e.options.scales.yAxes||[],{id:i});i&&a&&1==_.filter(n,(function(e){return e.yAxisID===i})).length&&(a.display=!1)}}))},e.onLegendClick=function(n,t){var i=t.datasetIndex,a=this.chart,o=a.getDatasetMeta(i);o.hidden=null===o.hidden?!a.data.datasets[i].hidden:null,a.config&&a.config.data&&a.config.data.datasets&&1===_.filter(a.config.data.datasets,(function(e){return e.yAxisID&&e.yAxisID===o.yAxisID})).length&&(a.scales[o.yAxisID].options.display=!(!0===o.hidden)),a.update(),e.formData.hide=e.formData.hide||[],e.formData.hide=o.hidden?_.union(e.formData.hide,[i]):_.difference(e.formData.hide,[i]),e.updateLocation()},e.goPreviousRange=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime-=e.times.length*e.formData.rangeDurationSec,e.formData.startTime<e.formData.firstBlockTime&&(e.formData.startTime=e.formData.firstBlockTime),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.goNextRange=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime+=e.times.length*e.formData.rangeDurationSec,e.formData.startTime>e.formData.firstBlockTime+e.formData.currencyAge-e.formData.timeWindow&&(e.formData.startTime=e.formData.firstBlockTime+e.formData.currencyAge-e.formData.timeWindow),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.onRangeChanged=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime=e.formData.firstBlockTime+parseFloat(e.formData.timePct)/100*(e.formData.currencyAge-e.formData.timeWindow),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.updateRange=function(n,t,i){i=!angular.isDefined(i)||i,e.formData.startTime=n,e.formData.endTime=t,e.formData.timeWindow=e.formData.timeWindow||e.formData.endTime-e.formData.startTime,e.formData.rangeDurationSec=e.formData.rangeDurationSec||e.formData.timeWindow/(e.times.length-1),i&&(e.formData.timePct=Math.ceil(100*(e.formData.startTime-e.formData.firstBlockTime)/(e.formData.currencyAge-e.formData.timeWindow)))},e.showActionsPopover=function(n){r.popover.show(n,{templateUrl:"plugins/graph/templates/common/popover_range_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function Re(e,n,t,i,a,o,s,r){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.rangeDuration="month",e.displayRightAxis=!0,e.hiddenDatasets=[],e.chartIdPrefix="docstats-chart-",e.charts=[{id:"market",title:"GRAPH.DOC_STATS.MARKET.TITLE",series:[{key:"market_record",label:"GRAPH.DOC_STATS.MARKET.AD",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"market",type:"record"}}},{key:"market_comment",label:"GRAPH.DOC_STATS.MARKET.COMMENT",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"market",type:"comment"}}}]},{id:"user_delta",title:"GRAPH.DOC_STATS.MARKET_DELTA.TITLE",series:[{key:"market_record_delta",label:"GRAPH.DOC_STATS.MARKET_DELTA.AD",type:"line",yAxisID:"y-axis-delta",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal()},{key:"market_comment_delta",label:"GRAPH.DOC_STATS.MARKET_DELTA.COMMENT",type:"line",yAxisID:"y-axis-delta",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray()}]},{id:"user",title:"GRAPH.DOC_STATS.USER.TITLE",series:[{key:"user_profile",label:"GRAPH.DOC_STATS.USER.USER_PROFILE",color:o.rgba.royal(.7),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"user",type:"profile"}}},{key:"user_settings",label:"GRAPH.DOC_STATS.USER.USER_SETTINGS",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"user",type:"settings"}}}]},{id:"user_delta",title:"GRAPH.DOC_STATS.USER_DELTA.TITLE",series:[{key:"user_profile_delta",label:"GRAPH.DOC_STATS.USER_DELTA.USER_PROFILE",type:"line",yAxisID:"y-axis-delta",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal()},{key:"user_settings_delta",label:"GRAPH.DOC_STATS.USER_DELTA.USER_SETTINGS",type:"line",yAxisID:"y-axis-delta",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray()}]},{id:"message",title:"GRAPH.DOC_STATS.MESSAGE.TITLE",series:[{key:"message_inbox",label:"GRAPH.DOC_STATS.MESSAGE.MESSAGE_INBOX",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"message",type:"inbox"}}},{key:"message_outbox",label:"GRAPH.DOC_STATS.MESSAGE.MESSAGE_OUTBOX",color:o.rgba.calm(),pointHoverBackgroundColor:o.rgba.calm(),clickState:{name:"app.document_search",params:{index:"message",type:"outbox"}}}]},{id:"social",title:"GRAPH.DOC_STATS.SOCIAL.TITLE",series:[{key:"page_record",label:"GRAPH.DOC_STATS.SOCIAL.PAGE_RECORD",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"page",type:"record"}}},{key:"group_record",label:"GRAPH.DOC_STATS.SOCIAL.GROUP_RECORD",color:o.rgba.calm(),pointHoverBackgroundColor:o.rgba.calm(),clickState:{name:"app.document_search",params:{index:"group",type:"record"}}},{key:"page_comment",label:"GRAPH.DOC_STATS.SOCIAL.PAGE_COMMENT",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"page",type:"comment"}}}]},{id:"subscription",title:"GRAPH.DOC_STATS.SUBSCRIPTION.TITLE",series:[{key:"subscription_record",label:"GRAPH.DOC_STATS.SUBSCRIPTION.EMAIL",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"subscription",type:"record"}}}]},{id:"other",title:"GRAPH.DOC_STATS.OTHER.TITLE",series:[{key:"history_delete",label:"GRAPH.DOC_STATS.OTHER.HISTORY_DELETE",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"history",type:"delete"}}}]}];var l=r("formatInteger");e.defaultChartOptions={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0},legend:{display:!0,onClick:e.onLegendClick},scales:{xAxes:[{stacked:!0}],yAxes:[{id:"y-axis",stacked:!0},{id:"y-axis-delta",stacked:!1},{id:"y-axis-delta-right",stacked:!1,display:e.displayRightAxis,position:"right",gridLines:{drawOnChartArea:!1}}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(e,n){return n.datasets[e.datasetIndex].label+": "+l(e.yLabel)}}}},e.init=function(e,n){n&&n.stateParams},e.load=function(n){return i.all([a(e.charts.reduce((function(e,n){return e.concat(n.series.reduce((function(e,n){return e.concat(n.label)}),[n.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),s.docstat.get(e.formData)]).then((function(t){var i=t[0],a={hour:i["COMMON.DATE_PATTERN"],day:i["COMMON.DATE_SHORT_PATTERN"],month:i["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((t=t[1])&&t.times){e.times=t.times;var s=a[e.formData.rangeDuration];e.labels=_.map(t.times,(function(e){return moment.unix(e).local().format(s)})),e.updateRange(t.times[0],t.times[t.times.length-1],n),e.setScale(e.scale),_.forEach(e.charts,(function(n){var a={};n.data=_.map(n.series,(function(e){if(a[e.yAxisID||"y-axis"]=!0,e.key.endsWith("_delta")){var n=e.key.substring(0,e.key.length-"_delta".length);return((i=t[n])?_.map(i,(function(e){var n=void 0!==e&&void 0!==o?e-(o||e):void 0;return o=e,n})):void 0)||[]}var i,o;return t[e.key]||[]})),n.options=angular.copy(e.defaultChartOptions),n.options.title.text=i[n.title],n.options.scales.yAxes=n.options.scales.yAxes.reduce((function(e,n){return a[n.id]?e.concat(n):e}),[]),n.datasetOverride=_.map(n.series,(function(e){return{yAxisID:e.yAxisID||"y-axis",type:e.type||"line",label:i[e.label],fill:"line"!==e.type,borderWidth:2,pointRadius:"line"!==e.type?0:2,pointHitRadius:4,pointHoverRadius:3,borderColor:e.color,backgroundColor:e.color,pointBackgroundColor:e.color,pointBorderColor:e.color,pointHoverBackgroundColor:e.pointHoverBackgroundColor||e.color,pointHoverBorderColor:e.pointHoverBorderColor||o.rgba.white()}}))}))}}))},e.onChartClick=function(t,i,a){if(a){var o=_.find(e.charts,(function(n){return e.chartIdPrefix+n.id==a._chart.canvas.id})).series[a._datasetIndex];if(o&&o.clickState&&o.clickState.name){var s=o.clickState.params?angular.copy(o.clickState.params):{},r=e.times[a._index],l=moment.unix(r).utc().add(1,e.formData.rangeDuration).unix();return s.q="time:>={0} AND time:<{1}".format(r,l),n.go(o.clickState.name,s)}console.debug("Click on item index={0} on range [{1},{2}]".format(a._index,r,l))}}}function Ne(e,n,t,i,a,o,s){angular.extend(this,n("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.rangeDuration="month",e.hiddenDatasets=[],e.charts=[{id:"count",title:"GRAPH.SYNCHRO.COUNT.TITLE",series:[{key:"inserts",type:"bar",label:"GRAPH.SYNCHRO.COUNT.INSERTS",color:a.rgba.royal(),pointHoverBackgroundColor:a.rgba.royal()},{key:"updates",type:"bar",label:"GRAPH.SYNCHRO.COUNT.UPDATES",color:a.rgba.calm(),pointHoverBackgroundColor:a.rgba.calm()},{key:"deletes",type:"bar",label:"GRAPH.SYNCHRO.COUNT.DELETES",color:a.rgba.assertive(.5),pointHoverBackgroundColor:a.rgba.assertive()}]},{id:"peer",title:"GRAPH.SYNCHRO.PEER.TITLE",series:[{key:"ES_USER_API",label:"GRAPH.SYNCHRO.PEER.ES_USER_API",color:a.rgba.royal(),pointHoverBackgroundColor:a.rgba.royal()},{key:"ES_SUBSCRIPTION_API",label:"GRAPH.SYNCHRO.PEER.ES_SUBSCRIPTION_API",color:a.rgba.gray(.5),pointHoverBackgroundColor:a.rgba.gray()}]},{id:"performance",title:"GRAPH.SYNCHRO.PERFORMANCE.TITLE",series:[{key:"duration",type:"bar",label:"GRAPH.SYNCHRO.PERFORMANCE.DURATION",color:a.rgba.gray(.5),pointHoverBackgroundColor:a.rgba.gray()}]}];var r=s("formatInteger");e.defaultChartOptions={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0},legend:{display:!0,onClick:e.onLegendClick},scales:{xAxes:[{stacked:!0}],yAxes:[{stacked:!0,id:"y-axis"}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(e,n){return n.datasets[e.datasetIndex].label+": "+r(e.yLabel)}}}},e.init=function(e,n){n&&n.stateParams},e.load=function(n){return t.all([i(e.charts.reduce((function(e,n){return e.concat(n.series.reduce((function(e,n){return e.concat(n.label)}),[n.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),o.synchro.execution.get(e.formData)]).then((function(t){var i=t[0],o={hour:i["COMMON.DATE_PATTERN"],day:i["COMMON.DATE_SHORT_PATTERN"],month:i["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((t=t[1])&&t.times){e.times=t.times;var s=o[e.formData.rangeDuration];e.labels=t.times.reduce((function(e,n){return e.concat(moment.unix(n).local().format(s))}),[]),e.updateRange(t.times[0],t.times[t.times.length-1],n),e.setScale(e.scale),_.forEach(e.charts,(function(n){n.data=[],_.forEach(n.series,(function(e){n.data.push(t[e.key]||[])})),n.options=angular.copy(e.defaultChartOptions),n.options.title.text=i[n.title],n.datasetOverride=n.series.reduce((function(e,n){return e.concat({yAxisID:"y-axis",type:n.type||"line",label:i[n.label],fill:!0,borderWidth:2,pointRadius:0,pointHitRadius:4,pointHoverRadius:3,borderColor:n.color,backgroundColor:n.color,pointBackgroundColor:n.color,pointBorderColor:n.color,pointHoverBackgroundColor:n.pointHoverBackgroundColor||n.color,pointHoverBorderColor:n.pointHoverBorderColor||a.rgba.white()})}),[])}))}}))}}function Ie(e,n,t){e.extensionPoint=n.extensions.points.current.get(),e.enable=t.isEnable(),t.api.state.on.changed(e,(function(n){e.enable=n}))}function Se(e,n,t,i,a,o){e.extensionPoint=t.extensions.points.current.get(),e.enable=i.isEnable(),e.loading=!0,e.node=e.node||{},i.api.state.on.changed(e,(function(n){e.enable=n})),e.enter=function(t,i){return!e.node.currency&&i&&i.stateParams&&i.stateParams.currency&&(e.node.currency=i.stateParams.currency),e.node.currency?e.node.pubkey?e.load():n((function(){return e.enter(t,i)}),500):a.get().then((function(n){return e.node.currency=n?n.name:null,e.enter(t,i)}))},e.$on("$csExtension.enter",e.enter),e.load=function(){if(e.node.currency||e.node.pubkey)return console.info("[Graph] [peer] Loading blocks count for [{0}]".format(e.node.pubkey.substr(0,8))),o.node.blockCount(e.node.currency,e.node.pubkey).then((function(n){e.blockCount=n,e.loading=!1}))}}if(angular.module("cesium.settings.services",["ngApi","cesium.config"]).factory("csSettings",["$rootScope","$q","$window","Api","localStorage","$translate","csConfig",function(e,n,t,i,a,o,s){var r=[{id:"en",label:"English",country:"us"},{id:"en-GB",label:"English (UK)",country:"gb"},{id:"eo-EO",label:"Esperanto"},{id:"fr-FR",label:"Français",country:"fr"}],l=s.fallbackLanguage?c(s.fallbackLanguage):"en";function c(e){if(!e)return l;if(_.findWhere(r,{id:e}))return e;var n=e.split("-");if(n.length>1)return c(n[0]);var t=_.find(r,(function(n){return String.prototype.startsWith.call(n.id,e)}));return t?t.id:l}var u,d,p,m,E={STORAGE_KEY:"GCHANGE_SETTINGS",KEEP_AUTH_IDLE_SESSION:9999},g={timeout:4e3,cacheTimeMs:6e4,timeWarningExpireMembership:5184e3,timeWarningExpire:7776e3,minVersion:"1.7.0",newIssueUrl:"https://github.com/duniter-gchange/gchange-client/issues/new?labels=bug",userForumUrl:"https://forum.monnaie-libre.fr",latestReleaseUrl:"https://api.github.com/repos/duniter-gchange/gchange-client/releases/latest",httpsMode:!1},h=angular.merge({useRelative:!1,useLocalStorage:!!t.localStorage,useLocalStorageEncryption:!1,walletHistoryTimeSecond:2592e3,walletHistorySliceSecond:432e3,walletHistoryAutoRefresh:!0,rememberMe:!0,keepAuthIdle:600,showUDHistory:!0,showLoginSalt:!1,expertMode:!1,decimalCount:2,uiEffects:!0,blockValidityWindow:6,helptip:{enable:!1,installDocUrl:"https://github.com/duniter-gchange/gchange-client/blob/master/README.md",currency:0,network:0,wotLookup:0,wot:0,wotCerts:0,wallet:0,walletCerts:0,header:0,settings:0},currency:{allRules:!1,allWotRules:!1},wallet:{showPubkey:!0,alertIfUnusedWallet:!0,notificationReadTime:0},locale:{id:(p=s.defaultLanguage||o.use(),m=c(p),p!==m&&console.debug("[settings] Fix locale [{0}] -> [{1}]".format(p,m)),m)}},g,s),b={},f=!1,T=new i(this,"csSettings"),v=function(){if(angular.isUndefined(u)||!angular.equals(u,b))return u=angular.copy(b),T.data.raise.changed(b)},O=function(){return f?(b.useLocalStorage?!0===b.node.temporary?a.getObject(E.STORAGE_KEY).then((function(e){var n=angular.copy(b);return n.node=e&&e.node||{},delete n.temporary,a.setObject(E.STORAGE_KEY,n)})):a.setObject(E.STORAGE_KEY,b):a.setObject(E.STORAGE_KEY,null)).then((function(){return b.useLocalStorage&&console.debug("[setting] Saved locally"),T.data.raisePromise.store(b)})).then(v):(console.debug("[setting] Waiting start finished..."),(d||I()).then(O))},R=function(e){if(e){var n=!1;if(e.locale&&e.locale.id){var t=c(e.locale.id);e.locale=_.findWhere(r,{id:t}),n=!b.locale||e.locale.id!==b.locale.id||e.locale.id!==o.use()}if(_.keys(g).forEach((function(n){e[n]=h[n]})),angular.merge(b,e),(e&&e.node&&!e.node.temporary||!b.node.temporary)&&delete b.node.temporary,b.plugins&&b.plugins.es.host&&b.plugins.es.port&&(!b.node||b.node.host!==b.plugins.es.host)){var i=b.node.host,a=b.plugins.es.host;console.warn("[settings] Replacing duniter node {{0}} with gchange pod {{1}}".format(i,a)),b.node={host:a,port:b.plugins.es.port,useSsl:b.plugins.es.useSsl}}n&&o.use(b.locale.id)}},N=function(){var e=Date.now();return a.getObject(E.STORAGE_KEY).then((function(n){if(!n)return console.debug("[settings] No settings in local storage. Using defaults."),R(h),void v();R(n),console.debug("[settings] Loaded from local storage in "+(Date.now()-e)+"ms"),v()}))},I=function(){return console.debug("[settings] Starting..."),d=a.ready().then(N).then((function(){console.debug("[settings] Started"),f=!0,d=null,T.data.raise.ready(b)}))};return e.$on("$translateChangeSuccess",(function(){var e=o.use();console.debug("[settings] Locale ["+e+"]");try{moment.locale(e.toLowerCase())}catch(n){try{moment.locale(e.substr(0,2))}catch(e){moment.locale("en-gb"),console.warn("[settings] Unknown local for moment lib. Using default [en]")}}try{numeral.language(e.toLowerCase())}catch(n){try{numeral.language(e.substring(0,2))}catch(e){numeral.language("en-gb"),console.warn("[settings] Unknown local for numeral lib. Using default [en]")}}T.locale.raise.changed(e)})),T.registerEvent("data","reset"),T.registerEvent("data","changed"),T.registerEvent("data","store"),T.registerEvent("data","ready"),T.registerEvent("locale","changed"),R(h),{ready:function(){return f?n.when():d||I()},start:I,data:b,apply:R,getByPath:function(e,n){var t=b;return _.each(e.split("."),(function(e){t=t[e],angular.isUndefined(t)&&(t=n)})),t},reset:function(){return _.keys(b).forEach((function(e){delete b[e]})),R(h),T.data.raisePromise.reset(b).then(O)},store:O,restore:N,defaultSettings:h,api:T,locales:r,constants:E}}]),angular.module("cesium.crypto.services",["cesium.utils.services"]).factory("CryptoUtils",["$q","$timeout","ionicReady",function(e,n,t){function i(){this.loaded=!1;var e=this;this.copy=function(n){_.forEach(_.keys(n),(function(t){e[t]=n[t]}))},this.isLoaded=function(){return this.loaded},this.util=this.util||{},this.util.array_to_string=function(e,n){var t=new Blob([new Uint8Array(e)]),i=new FileReader;i.onload=function(e){n(e.target.result)},i.readAsText(t)}}i.prototype.constants={crypto_sign_BYTES:64,crypto_secretbox_NONCEBYTES:24,crypto_box_MACBYTES:16,SEED_LENGTH:32,SCRYPT_PARAMS:{SIMPLE:{N:2048,r:8,p:1,memory:-1},DEFAULT:{N:4096,r:16,p:1,memory:-1}}},i.prototype.async_load_base58=function(e){var t=this;if(null!==Base58)return e(Base58);n((function(){t.async_load_base58(e)}),100)},i.prototype.async_load_scrypt=function(e,t){var i=this;null!==scrypt_module_factory?scrypt_module_factory(e,t):n((function(){i.async_load_scrypt(e,t)}),100)},i.prototype.async_load_nacl_js=function(e,t){var i=this;null!==nacl_factory?nacl_factory.instantiate(e,t):n((function(){i.async_load_nacl_js(e,t)}),100)},i.prototype.async_load_base64=function(e){var t=this;null!==Base64?e(Base64):n((function(){t.async_load_base64(e)}),100)},i.prototype.async_load_sha256=function(e){var t=this;if(null!==sha256)return e(sha256);n((function(){t.async_load_sha256(e)}),100)},i.prototype.seed_from_signSk=function(e){for(var n=new Uint8Array(that.constants.SEED_LENGTH),t=0;t<n.length;t++)n[t]=e[t];return n},i.prototype.seed_from_signSk=function(e){for(var n=new Uint8Array(that.constants.SEED_LENGTH),t=0;t<n.length;t++)n[t]=e[t];return n};var a=window.crypto||window.msCrypto||window.Crypto;function o(){this.id="FullJS",this.scrypt=null,this.nacl=null,this.base58=null,this.base64=null;var n=this;function t(e,n){if(0!==n)throw{message:"nacl_raw."+e+" signalled an error"}}function i(e,t,i,o,s){return function(e,n,t,i){if(t.length!==i)throw{message:"nacl."+e+" expected "+i+"-byte "+n+" but got length "+t.length}}(e,t,i,o),function(e,t){var i=t||0,o=a(e.length+i);n.nacl.nacl_raw.HEAPU8.set(e,o+i);for(var s=o;s<o+i;s++)n.nacl.nacl_raw.HEAPU8[s]=0;return o}(i,s)}function a(e){var t=n.nacl.nacl_raw._malloc(e);if(0===t)throw{message:"malloc() failed",nbytes:e};return t}function o(e){n.nacl.nacl_raw._free(e)}function s(e){this.length=e,this.address=a(e)}this.util=this.util||{},this.util.decode_utf8=function(e){var n,t=unescape(encodeURIComponent(e)),i=new Uint8Array(t.length);for(n=0;n<t.length;n++)i[n]=t.charCodeAt(n);return i},this.util.encode_utf8=function(e){return n.nacl.encode_utf8(e)},this.util.encode_base58=function(e){return n.base58.encode(e)},this.util.decode_base58=function(e){var t,i=n.base58.decode(e),a=new Uint8Array(i.length);for(t=0;t<i.length;t++)a[t]=i[t];return a},this.util.decode_base64=function(e){return n.base64.decode(e)},this.util.encode_base64=function(e){return n.base64.encode(e)},this.util.hash_sha256=function(t){return e((function(e){var i=n.util.decode_utf8(t);e(n.nacl.to_hex(n.nacl.crypto_hash_sha256(i)).toUpperCase())}))},this.util.random_nonce=function(){if(n.crypto&&n.crypto.getRandomValues){var t=new Uint8Array(n.constants.crypto_secretbox_NONCEBYTES);return n.crypto.getRandomValues(t),e.when(t)}return e.when(n.nacl.crypto_box_random_nonce())},this.util.crypto_hash_sha256=function(e){return n.nacl.crypto_hash_sha256(e)},this.util.crypto_scrypt=function(t,i,a,o,s,r){return e((function(e,l){try{e(n.scrypt.crypto_scrypt(t,i,a,o,s,r))}catch(e){l(e)}}))},this.box_keypair_from_sign=function(a){return a.boxSk&&a.boxPk?e.when(a):e((function(e,r){try{e((l=i("crypto_box_keypair_from_sign_sk","sk",a.signSk,n.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_secretkeybytes()),t("_crypto_sign_ed25519_sk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),n.nacl.crypto_box_keypair_from_raw_sk(c.extractBytes())))}catch(e){r(e)}var l,c}))},this.box_pk_from_sign=function(a){return e((function(e,r){try{e((l=i("crypto_box_pk_from_sign_pk","pk",a,n.nacl.nacl_raw._crypto_sign_publickeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_publickeybytes()),t("_crypto_sign_ed25519_pk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_pk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){r(e)}var l,c}))},this.box_sk_from_sign=function(a){return e((function(e,r){try{e((l=i("crypto_box_sk_from_sign_sk","sk",a,n.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_secretkeybytes()),t("_crypto_sign_ed25519_sk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){r(e)}var l,c}))},this.box=function(t,i,a,o){return e((function(e,s){if(t){var r=n.nacl.encode_utf8(t);"string"==typeof a&&(a=n.util.decode_base58(a));try{var l=n.nacl.crypto_box(r,i,a,o);e(n.util.encode_base64(l))}catch(e){s(e)}}else e(t)}))},this.box_open=function(t,i,a,o){return e((function(e,s){if(t){var r=n.util.decode_base64(t);"string"==typeof a&&(a=n.util.decode_base58(a));try{var l=n.nacl.crypto_box_open(r,i,a,o);e(n.nacl.decode_utf8(l))}catch(e){s(e)}}else e(t)}))},this.scryptKeypair=function(e,t,i){return n.util.crypto_scrypt(n.util.encode_utf8(t),n.util.encode_utf8(e),i&&i.N||n.constants.SCRYPT_PARAMS.DEFAULT.N,i&&i.r||n.constants.SCRYPT_PARAMS.DEFAULT.r,i&&i.p||n.constants.SCRYPT_PARAMS.DEFAULT.p,n.constants.SEED_LENGTH).then((function(e){var t=n.nacl.crypto_sign_seed_keypair(e),i=n.nacl.crypto_box_seed_keypair(e);return{signPk:t.signPk,signSk:t.signSk,boxPk:i.boxPk,boxSk:i.boxSk}}))},this.seedKeypair=function(t){return e((function(e,i){var a=n.nacl.crypto_sign_seed_keypair(t),o=n.nacl.crypto_box_seed_keypair(t);e({signPk:a.signPk,signSk:a.signSk,boxPk:o.boxPk,boxSk:o.boxSk})}))},this.scryptSignPk=function(t,i,a){return e((function(e,o){try{var s=n.scrypt.crypto_scrypt(n.util.encode_utf8(i),n.util.encode_utf8(t),a&&a.N||n.constants.SCRYPT_PARAMS.DEFAULT.N,a&&a.r||n.constants.SCRYPT_PARAMS.DEFAULT.r,a&&a.p||n.constants.SCRYPT_PARAMS.DEFAULT.p,n.constants.SEED_LENGTH);e(n.nacl.crypto_sign_seed_keypair(s).signPk)}catch(e){o(e)}}))},this.verify=function(t,i,a){return e((function(e,o){var s,r=n.util.decode_utf8(t),l=n.util.decode_base64(i),c=n.util.decode_base58(a),u=new Uint8Array(n.constants.crypto_sign_BYTES+r.length);for(s=0;s<n.constants.crypto_sign_BYTES;s++)u[s]=l[s];for(s=0;s<r.length;s++)u[s+n.constants.crypto_sign_BYTES]=r[s];e(null!==n.nacl.crypto_sign_open(u,c))}))},this.sign=function(t,i){return e((function(e,a){for(var o=n.util.decode_utf8(t),s=i.signSk,r=n.nacl.crypto_sign(o,s),l=new Uint8Array(n.constants.crypto_sign_BYTES),c=0;c<l.length;c++)l[c]=r[c];e(n.base64.encode(l))}))},this.load=function(){var t=e.defer(),i={},a={};"a"!=ionic.Platform.grade.toLowerCase()&&(console.info("Reduce NaCl memory to 16mb, because plateform grade is not [a] but [{0}]".format(ionic.Platform.grade)),i.requested_total_memory=16777216);var o=0,s=function(){4==++o&&(n.loaded=!0,t.resolve())};return this.async_load_nacl_js((function(e){n.nacl=e,s()}),i),this.async_load_scrypt((function(e){n.scrypt=e,n.scrypt.requested_total_memory=a.requested_total_memory,s()}),a),this.async_load_base58((function(e){n.base58=e,s()})),n.async_load_base64((function(e){n.base64=e,s()})),t.promise},this.util.hash=n.util.hash_sha256,this.box={keypair:{fromSignKeypair:n.box_keypair_from_sign,skFromSignSk:n.box_sk_from_sign,pkFromSignPk:n.box_pk_from_sign},pack:n.box,open:n.box_open},s.prototype.extractBytes=function(e){var t=function(e,t){var i=new Uint8Array(t);return i.set(n.nacl.nacl_raw.HEAPU8.subarray(e,e+t)),i}(this.address+(e||0),this.length-(e||0));return o(this.address),this.address=null,t}}a&&a.getRandomValues&&(i.prototype.crypto=a,i.prototype.util={},i.prototype.util.random_nonce=function(){var n=new Uint8Array(crypto_secretbox_NONCEBYTES);return this.crypto.getRandomValues(n),e.when(n)}),o.prototype=new i,new i;var s=new i;return t().then((function(){console.debug("[crypto] Starting...");var e,n=Date.now();console.debug("[crypto] Loading 'FullJS' implementation..."),(e=new o).load().catch((function(e){throw console.error(e),e})).then((function(){s.copy(e),console.debug("[crypto] Loaded '{0}' implementation in {1}ms".format(s.id,Date.now()-n))}))})),s}]).factory("csCrypto",["$q","$rootScope","$timeout","CryptoUtils","UIUtils","Modals",function(e,n,t,i,a,o){function s(e){return new RegExp(e)}function r(e,n){for(var t=Math.max(e.length,n.length),i=new Uint8Array(t),a=0;a<t;++a)i[a]=e[a]^n[a];return i}function l(e,n){var t=new Uint8Array(e.byteLength+n.byteLength);return t.set(new Uint8Array(e),0),t.set(new Uint8Array(n),e.byteLength),t}var c={WIF:{DATA_LENGTH:35},EWIF:{SALT_LENGTH:4,DERIVED_HALF_LENGTH:16,DATA_LENGTH:39,SCRYPT_PARAMS:{N:16384,r:8,p:8}},REGEXP:{PUBKEY:"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",SECKEY:"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88}",FILE:{TYPE_LINE:"^Type: ([a-zA-Z0-9]+)\n",VERSION:"Version: ([0-9]+)\n",PUB:"[Pp]ub: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\n",SEC:"[Ss]ec: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88})(\n|$)",DATA:"[Dd]ata: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+)(\n|$)"}}},u={FILE:{TYPE_LINE:s(c.REGEXP.FILE.TYPE_LINE),VERSION:s(c.REGEXP.FILE.VERSION),PUB:s(c.REGEXP.FILE.PUB),SEC:s(c.REGEXP.FILE.SEC),DATA:s(c.REGEXP.FILE.DATA)}},d={BAD_PASSWORD:3001,BAD_CHECKSUM:3002};function p(n,t){if(!n)return e.reject("Argument [content] is missing");var a;(t=t||{}).withSecret=!!angular.isDefined(t.withSecret)&&t.withSecret,t.defaultType=t.defaultType||"PubSec";var o=u.FILE.TYPE_LINE.exec(n),s=o&&o[1];if(!s&&t.defaultType)return p("Type: {0}\n{1}".format(t.defaultType,n),t);if("PubSec"==s){if(!(a=u.FILE.PUB.exec(n)))return e.reject("Missing [pub] field in file, or invalid public key value");var r={signPk:i.base58.decode(a[1])};return t.withSecret?(a=u.FILE.SEC.exec(n))?(r.signSk=i.base58.decode(a[1]),e.resolve(r)):e.reject("Missing [sec] field in file, or invalid secret key value"):e.resolve(r)}return"WIF"==s||"EWIF"==s?(a=u.FILE.DATA.exec(n))?m(a[1],{type:s,password:t.password}).then((function(e){return e&&!t.withSecret?{signPk:e.signPk}:e})):e.reject("Missing [Data] field in file. This is required for WIF or EWIF format"):t.defaultType?e.reject("Bad file format: missing Type field"):e.reject("Bad file format, unknown type ["+s+"]")}function m(n,t){t=t||{};var a=n&&i.base58.decode(n);return!a||a.length!=c.EWIF.DATA_LENGTH&&a.length!=c.WIF.DATA_LENGTH?e.reject("Invalid WIF or EWIF format (invalid bytes count)."):(t.type=t.type||1==a[0]&&"WIF"||2==a[0]&&"EWIF","WIF"==t.type?function(n){var t=i.util.decode_base58(n);if(1!=t[0])return e.reject({message:"Invalid WIF v1 format: expected [0x01] as first byte"});if(t.length!=c.WIF.DATA_LENGTH)return e.reject({message:"Invalid WIF v1 format: Data must be a "+c.WIF.DATA_LENGTH+" bytes array, encoded in base 58."});var a=t.slice(0,-2),o=t.slice(1,-2),s=t.slice(-2),r=i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(a)).slice(0,2);return i.util.encode_base58(s)!=i.util.encode_base58(r)&&e.reject({message:"Invalid WIF format: bad checksum"}),i.seedKeypair(o)}(n):"EWIF"==t.type?"function"!=typeof t.password||(t.password=t.password(),t.password)?"object"==typeof t.password&&t.password.then?t.password.then((function(e){if(!e)throw"CANCELLED";return E(n,e)})):"string"==typeof t.password?E(n,t.password):e.reject({message:"Invalid EWIF options.password. Waiting a callback function, a promise or a string."}):e.reject({message:"Invalid callback result for 'options.password()': must return a promise or a string."}):e.reject({message:"Invalid WIF or EWIF format: unknown first byte identifier."}))}function E(n,t){var a=i.util.decode_base58(n);if(2!=a[0])return e.reject({message:"Invalid EWIF v1 format: Expected [0x02] as first byte"});if(a.length!=c.EWIF.DATA_LENGTH)return e.reject({message:"Invalid EWIF v1 format: Expected {0} bytes, encoded in base 58.".format(c.EWIF.DATA_LENGTH)});var o=a.slice(0,-2),s=a.slice(-2),u=a.slice(1,5),p=a.slice(5,21),m=a.slice(21,37);return i.util.crypto_scrypt(i.util.encode_utf8(t),u,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var n=e.slice(0,32),t=e.slice(32,64),i=new aesjs.ModeOfOperation.ecb(t),a=i.decrypt(p),o=i.decrypt(m);return a=new Uint8Array(a),o=new Uint8Array(o),l(r(a,n.slice(0,16)),r(o,n.slice(16,32)))})).then(i.seedKeypair).then((function(e){var n=i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(e.signPk)).slice(0,4);if(i.util.encode_base58(u)!==i.util.encode_base58(n))throw{ucode:d.BAD_PASSWORD,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"};var t=i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(o)).slice(0,2);if(i.util.encode_base58(s)!=i.util.encode_base58(t))throw{ucode:d.BAD_CHECKSUM,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM"};return e}))}function g(n){if(!n)throw new Error("Missing keypair");return n.boxPk&&n.boxSk?e.when(n):e.all([i.box.keypair.skFromSignSk(n.signSk),i.box.keypair.pkFromSignPk(n.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{errorCodes:d,constants:c,util:angular.extend({pkChecksum:function(e){var n=i.util.decode_base58(e);return i.util.encode_base58(i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(n))).substring(0,3)}},i.util),keyfile:{read:function(n,t){return n&&n.content?p(n.content,t):e((function(e,i){if(!n)return i("Argument [file] is missing");var a=new FileReader;a.onload=function(n){p(n.target.result,t).then(e).catch(i)},a.readAsText(n,"utf8")}))},parseData:function e(n,i){return(i=i||{}).withSecret=!angular.isDefined(i.withSecret)||i.withSecret,i.silent=!!angular.isDefined(i.withSecret)&&i.silent,i.password=function(){return a.loading.hide(100).then((function(){return o.showPassword({title:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE",subTitle:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP",error:i.error,scope:i.scope})})).then((function(e){return t((function(){return e&&a.loading.show(),e}),150)}))},i.silent||a.loading.show(),m(n,i).then((function(e){return e})).catch((function(t){if(!t||"CANCELLED"!==t){if(t&&t.ucode==d.BAD_PASSWORD)return e(n,{withSecret:i.withSecret,error:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"});throw console.error("[crypto] Unable to parse as WIF or EWIF format: "+(t&&t.message||t)),t}}))},generateContent:function n(t,a){switch((a=a||{}).type=a.type||"PubSec",a.type){case"PubSec":return e.resolve("Type: PubSec\nVersion: 1\npub: "+i.base58.encode(t.signPk)+"\nsec: "+i.base58.encode(t.signSk)+"\n");case"WIF":return function(n){var t=i.seed_from_signSk(n.signSk);if(!t||t.byteLength!==i.constants.SEED_LENGTH)throw"Bad see format. Expected {0} bytes".format(i.constants.SEED_LENGTH);var a=new Uint8Array(1);a[0]=1;var o=l(a,t),s=l(o,i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(o)).slice(0,2));return e.when(i.util.encode_base58(s))}(t).then((function(e){return"Type: WIF\nVersion: 1\nData: "+e+"\n"}));case"EWIF":return a.password?a.password&&"function"==typeof a.password&&(console.debug("[crypto] [EWIF] Executing 'options.password()' to resolve the password..."),a.password=a.password(),!a.password)?e.reject({message:"Invalid callback result for 'options.password()': must return a promise or a string."}):a.password&&"object"==typeof a.password&&a.password.then?a.password.then((function(e){if(!e)throw"CANCELLED";return n(t,angular.merge({},a,{password:e}))})):a.password&&"string"==typeof a.password?function(n,t){var a=i.seed_from_signSk(n.signSk);if(!a||a.byteLength!==i.constants.SEED_LENGTH)return e.reject({message:"Bad see format. Expected {0} bytes".format(i.constants.SEED_LENGTH)});var o=i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(n.signPk)).slice(0,4);return i.util.crypto_scrypt(i.util.encode_utf8(t),o,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var n=e.slice(0,32),t=e.slice(32,64),s=r(a.slice(0,16),n.slice(0,16)),c=r(a.slice(16,32),n.slice(16,32)),u=new aesjs.ModeOfOperation.ecb(t),d=u.encrypt(s),p=u.encrypt(c);d=new Uint8Array(d),p=new Uint8Array(p);var m=new Uint8Array(1);return m[0]=2,m=l(m,o),m=l(m,d),m=l(m,p),m=l(m,i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(m)).slice(0,2)),i.util.encode_base58(m)}))}(t,a.password).then((function(e){return"Type: EWIF\nVersion: 1\nData: "+e+"\n"})):e.reject({message:"Invalid EWIF options.password. Waiting a callback function, a promise or a string."}):e.reject({message:"Missing EWIF options.password."});default:return e.reject({message:"Unknown keyfile format: "+a.type})}}},box:{getKeypair:g,pack:function(n,t,a,o,s){if(!n[a=a||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(o=o||"content")&&(o=[o]),n=angular.copy(n);var r=i.util.decode_base58(n[a]);return e.all([g(t),i.box.keypair.pkFromSignPk(r),s?e.when(s):i.util.random_nonce()]).then((function(t){var a=t[0].boxSk,s=t[1],r=t[2];return e.all(o.reduce((function(e,t){return n[t]?e.concat(i.box.pack(n[t],r,s,a)):e}),[])).then((function(e){var t=0;return _.forEach(o,(function(i){n[i]?n[i]=e[t++]:n[i]=null})),n.nonce=i.util.encode_base58(r),n}))}))},open:function(n,t,a,o){a=a||"issuer","string"==typeof(o=o||"content")&&(o=[o]);var s=Date.now(),r={},l=[g(t)];return e.all(n.reduce((function(e,n){var t=n[a];if(!t)throw"Record has no "+a;return r[t]?res:e.concat(i.box.keypair.pkFromSignPk(i.util.decode_base58(t)).then((function(e){r[t]=e})))}),l)).then((function(t){var s=t[0];return e.all(n.reduce((function(e,n){var t=r[n[a]],l=i.util.decode_base58(n.nonce);return n.valid=!0,e.concat(o.reduce((function(e,a){return n[a]?e.concat(i.box.open(n[a],l,t,s.boxSk).then((function(e){n[a]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+a),n.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+(Date.now()-s)+"ms"),n}))}}}}]),angular.module("cesium.utils.services",[]).factory("ionicReady",["$ionicPlatform",function(e){var n;return function(){return n||(n=e.ready()),n}}]).factory("UIUtils",["$ionicLoading","$ionicPopup","$ionicConfig","$ionicHistory","$translate","$q","ionicMaterialInk","ionicMaterialMotion","$window","$timeout","Fullscreen","$ionicPopover","$state","$rootScope","screenmatch",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E){var g,h=null,b={smallscreen:E.bind("xs, sm",m)},f={};function T(e,t){return e?o((function(i){a([e,t,"ERROR.POPUP_TITLE","ERROR.UNKNOWN_ERROR","COMMON.BTN_OK"]).then((function(a){var o=e.message||a[e];return n.show({template:"<p>"+(o||a["ERROR.UNKNOWN_ERROR"])+"</p>",title:a["ERROR.POPUP_TITLE"],subTitle:a[t],buttons:[{text:"<b>"+a["COMMON.BTN_OK"]+"</b>",type:"button-assertive",onTap:function(e){i(e)}}]})}))})):o.when()}function v(e,t){return o((function(i){a([e,t,"INFO.POPUP_TITLE","COMMON.BTN_OK"]).then((function(a){n.show({template:"<p>"+a[e]+"</p>",title:a["INFO.POPUP_TITLE"],subTitle:a[t],buttons:[{text:a["COMMON.BTN_OK"],type:"button-positive",onTap:function(e){i(e)}}]})}))}))}function O(n){return n?c((function(){return e.hide()}),n):e.hide()}function R(n){return h?((n=n||{}).template=n.template||h,e.show(n)):a("COMMON.LOADING").then((function(e){return h=e,R(n)}))}function N(){return b.smallscreen.active}function I(e,n,t){return function(n){var i,a=n.target.width,o=n.target.height,s=t?200:640,r=t?200:480,l=document.createElement("canvas");if(t){a>o?(a*=r/o,o=r):(o*=s/a,a=s),l.width=s,l.height=r,i=l.getContext("2d");var c=Math.trunc((s-a)/2+.5),u=Math.trunc((r-o)/2+.5);i.drawImage(n.target,c,u,s+-2*c,r+-2*u)}else a>o?a>s&&(o*=s/a,a=s):o>r&&(a*=r/o,o=r),l.width=a,l.height=o,(i=l.getContext("2d")).drawImage(n.target,0,0,l.width,l.height);var d=l.toDataURL();l.remove(),e(d)}}function S(e,n){var t=o.defer();(n=n||{}).templateUrl=n.templateUrl?n.templateUrl:"templates/common/popover_copy.html",n.scope=n.scope||m,n.scope.popovers=n.scope.popovers||{},n.autoselect=n.autoselect||!1,n.autoremove=!angular.isDefined(n.autoremove)||n.autoremove,n.backdropClickToClose=!angular.isDefined(n.backdropClickToClose)||n.backdropClickToClose,n.focusFirstInput=!!angular.isDefined(n.focusFirstInput)&&n.focusFirstInput;var i=function(i){(i=i||n.scope.popovers[n.templateUrl]).isResolved=!1,i.deferred=t,i.options=n,n.bindings&&angular.merge(i.scope,n.bindings),c((function(){i.show(e).then((function(){var e;n.autoselect?(e=document.querySelectorAll(n.autoselect)[0])&&(l.getSelection&&!l.getSelection().toString()?(e.setSelectionRange(0,e.value.length),e.focus()):e.focus()):n.autofocus&&(e=document.querySelectorAll(n.autofocus)[0])&&e.focus(),i.scope.$parent.$emit("popover.shown"),n.afterShow&&n.afterShow(i)}))}))},a=function(e){(e=e||n.scope.popovers[n.templateUrl])&&(delete n.scope.popovers[n.templateUrl],e.remove().then((function(){angular.element(l.document.querySelectorAll("body")[0]).removeClass("popover-open")})))},s=n.scope.popovers[n.templateUrl];return s?i(s):d.fromTemplateUrl(n.templateUrl,{scope:n.scope,backdropClickToClose:n.backdropClickToClose}).then((function(e){e.isResolved=!1,e.scope.closePopover=function(n){var t=e.options&&e.options.autoremove;e.options&&delete e.options.autoremove,e.hide().then((function(){if(t)return a(e)})).then((function(){e.deferred&&e.deferred.resolve(n),delete e.deferred,delete e.options}))},e.scope.$on("popover.hidden",(function(){e.options&&e.options.afterHidden&&e.options.afterHidden(),e.options&&e.options.autoremove&&a(e)})),n.scope.$on("$remove",(function(){e.deferred&&e.deferred.resolve(),a()})),n.scope.popovers[n.templateUrl]=e,i(e)})),t.promise}function A(e,n){var t=N()?100:10,i=".list.{0} .item, .list .{0} .item".format(n,n);return{ionListClass:n,show:function(n){return(n=n||{}).selector=n.selector||i,n.ink=!angular.isDefined(n.ink)||n.ink,n.startVelocity=n.startVelocity||(N()?1100:3e3),c((function(){n.ink&&g.ink(),e(n)}),n.timeout||t)}}}function C(e,n){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOn selector"),!1;c((function(){var n=document.querySelectorAll(e.selector);n&&_.forEach(n,(function(e){e.classList.toggle("on",!0)}))}),n||100)}function D(e,n){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOff selector"),!1;c((function(){var n=document.querySelectorAll(e.selector);n&&_.forEach(n,(function(e){e.classList.toggle("on",!1)}))}),n||900)}return f.motion={enable:!0,default:A(r.ripple,"animate-ripple"),blinds:A(r.blinds,"animate-blinds"),fadeSlideIn:A(r.fadeSlideIn,"animate-fade-slide-in"),fadeSlideInRight:A(r.fadeSlideInRight,"animate-fade-slide-in-right"),panInLeft:A(r.panInLeft,"animate-pan-in-left"),pushDown:A(r.pushDown,"push-down"),ripple:A(r.ripple,"animate-ripple"),slideUp:A(r.slideUp,"slide-up"),fadeIn:A((function(e){C(e)}),"fade-in"),toggleOn:C,toggleOff:D},g={alert:{error:T,info:v,confirm:function(e,t,i){return t=t||"CONFIRM.POPUP_TITLE",(i=i||{}).cssClass=i.cssClass||"confirm",i.okText=i.okText||"COMMON.BTN_OK",i.cancelText=i.cancelText||"COMMON.BTN_CANCEL",a([e,t,i.cancelText,i.okText]).then((function(a){return n.confirm({template:a[e],cssClass:i.cssClass,title:a[t],cancelText:a[i.cancelText],cancelType:i.cancelType,okText:a[i.okText],okType:i.okType})}))},notImplemented:function(){return v("INFO.FEATURES_NOT_IMPLEMENTED")}},loading:{show:R,hide:O,update:function(n){return e._getLoader().then((function(e){if(e&&e.isShown)return n&&n.template?a(n&&n.template).then((function(t){return n.template=t,e})):void 0})).then((function(e){if(e&&e.isShown)return R(n)}))}},toast:{show:function(n,t,i){return t=t||"short",i=i||"bottom",a([n]).then((function(i){return"string"==typeof t&&(t="short"==t?2e3:5e3),e.show({template:i[n],noBackdrop:!0,duration:t})}))}},onError:function(e,n){return function(t){var i,a=e;if(t&&t.message?(a=t.message,i=e):e||(a=t),!n)return"CANCELLED"==a?O(10):(O(10),T(a,i));n(a)}},screen:{isSmall:N,fullscreen:u},ink:s.displayEffect,motion:f.motion,setEffects:function(e){if(g.motion.enable!==e){if(console.debug("[UI] [effects] "+(e?"Enable":"Disable")),g.motion.enable=e,e)t.views.transition("platform"),angular.merge(g.motion,f.motion);else{t.views.transition("none");var n={class:void 0,show:function(){}};angular.merge(g.motion,{enable:!1,default:n,fadeSlideIn:n,fadeSlideInRight:n,panInLeft:n,pushDown:n,ripple:n,slideUp:n,fadeIn:n,toggleOn:C,toggleOff:D}),m.motion=n}i.clearCache()}},fab:{show:function(e,n){n||(n=900),c((function(){var n=document.getElementsByClassName("button-fab");_.forEach(n,(function(n){n.id==e&&n.classList.toggle("on",!0)}))}),n)},hide:function(e,n){n||(n=10),c((function(){var n=document.getElementsByClassName("button-fab");_.forEach(n,(function(n){n.id==e&&n.classList.toggle("on",!1)}))}),n)}},popover:{show:S,copy:function(e,n){var t=n&&n.indexOf("\n")>=0?n.split("\n").length:1;return S(e,{templateUrl:"templates/common/popover_copy.html",bindings:{value:n,rows:t},autoselect:".popover-copy "+(t<=1?"input":"textarea")})},share:function(e,n){return(n=n||{}).templateUrl=n.templateUrl?n.templateUrl:"templates/common/popover_share.html",n.autoselect=n.autoselect||".popover-share input",n.bindings=n.bindings||{},n.bindings.value=n.bindings.value||n.bindings.url||p.href(p.current,p.params,{absolute:!0}),n.bindings.postUrl=n.bindings.postUrl||n.bindings.value,n.bindings.postMessage=n.bindings.postMessage||"",n.bindings.titleKey=n.bindings.titleKey||"COMMON.POPOVER_SHARE.TITLE",S(e,n)},helptip:function e(n,t){var i="string"==typeof n&&n?l.document.getElementById(n):n;n||i||!t.selector||(i=l.document.querySelector(t.selector));var a=(t=t||{}).deferred||o.defer();if(i&&!t.timeout)t.preAction&&i[t.preAction](),t.templateUrl=t.templateUrl?t.templateUrl:"templates/common/popover_helptip.html",t.autofocus=t.autofocus||"#helptip-btn-ok",t.bindings=t.bindings||{},t.bindings.icon=t.bindings.icon||{},t.bindings.icon.position=t.bindings.icon.position||!1,t.bindings.icon.glyph=t.bindings.icon.glyph||(t.bindings.icon.position&&t.bindings.icon.position.startsWith("bottom-")?"ion-arrow-down-c":"ion-arrow-up-c"),t.bindings.icon.class=t.bindings.icon.class||"calm icon "+t.bindings.icon.glyph,t.bindings.tour=!!angular.isDefined(t.bindings.tour)&&t.bindings.tour,S(i,t).then((function(e){t.postAction&&i[t.postAction](),a.resolve(e)})).catch((function(e){t.postAction&&i[t.postAction](),a.reject(e)}));else if(t.timeout){var s=t.timeout;t.retryTimeout=t.retryTimeout||s,delete t.timeout,t.deferred=a,c((function(){e(n,t)}),s)}else angular.isDefined(t.retry)&&!t.retry?"continue"===t.onError?c((function(){a.resolve(!0)})):c((function(){a.reject("[helptip] element now found: "+n)})):(t.retry=angular.isUndefined(t.retry)?2:t.retry-1,t.deferred=a,c((function(){e(n,t)}),t.timeout||t.retryTimeout||100));return a.promise}},selection:{select:function e(n){if(n.value||"text"==n.type||"textarea"==n.type)l.getSelection&&!l.getSelection().toString()&&n.setSelectionRange(0,n.value.length);else if(n.childNodes&&n.childNodes.length>0)e(n.childNodes[0]);else{var t=l.document.createRange();t.selectNodeContents(n);var i=l.getSelection();i.removeAllRanges(),i.addRange(t)}},get:function(){var e="";return window.getSelection&&(e=l.getSelection().toString()),e}},image:{resizeFile:function(e,n){var t=document.createElement("img");return o((function(i,a){if(e){var o=new FileReader;o.onload=function(e){t.onload=I(i,0,n),t.src=e.target.result},o.readAsDataURL(e)}else a("no file to resize")})).then((function(e){return t.remove(),e}))},resizeSrc:function(e,n){var t=document.createElement("img");return o((function(i,a){t.onload=I(i,0,n),t.src=e})).then((function(e){return t.remove(),e}))},rotateSrc:function(e,n){var t=document.createElement("img");return o((function(n,i){t.onload=function(e,n){var t=Math.PI/180*90;return function(n){var i=n.target.width,a=n.target.height;i>a?i>640&&(a*=640/i,i=640):a>480&&(i*=480/a,a=480);var o=document.createElement("canvas");o.width=a,o.height=i;var s=o.getContext("2d");s.rotate(t),s.drawImage(n.target,0,-1*o.width);var r=o.toDataURL();o.remove(),e(r)}}(n),t.src=e})).then((function(e){return t.remove(),e}))}},raw:f}}]).factory("$focus",["$timeout","$window",function(e,n){return function(t){e((function(){var e=n.document.getElementById(t);e&&e.focus()}))}}]),angular.module("cesium.cache.services",["ngResource","angular-cache"]).factory("csCache",["$http","csSettings","CacheFactory",function(e,n,t){var i={LONG:36e5,SHORT:n.defaultSettings.cacheTimeMs},a=[];return{get:function(e,n,o){var s=(e=e||"csCache-")+(n=n||i.SHORT);if(o){for(var r=1;t.get(s+r);)r++;return a[s+=r]||(a[s]=!0),t.createCache(s,{maxAge:n,deleteOnExpire:"aggressive",recycleFreq:n,onExpire:o,storageMode:"memory"})}return a[s]||(a[s]=!0),t.get(s)||t.createCache(s,{maxAge:n,deleteOnExpire:"aggressive",recycleFreq:Math.max(n-1e3,3e5),storageMode:"memory"})},clear:function(e){_.forEach(_.keys(a),(function(n){if(n.startsWith(e)){var i=t.get(a);i&&i.removeAll()}}))},clearAll:function(){console.debug("[cache] cleaning all caches"),_.forEach(_.keys(a),(function(e){var n=t.get(e);n&&n.removeAll()}))},constants:{LONG:i.LONG,SHORT:i.SHORT}}}]),angular.module("cesium.modal.services",[]).controller("EmptyModalCtrl",(function(){})).controller("AboutModalCtrl",["$scope","UIUtils","csHttp",function(e,n,t){e.openLink=function(e,i,a){return(a=a||{}).onError=function(){return n.popover.copy(e,i)},t.uri.open(i,a)}}]).factory("ModalUtils",["$ionicModal","$rootScope","$q","$injector","$controller","$timeout",function(e,n,t,i,a,o){function s(e,n,i){e.deferred=n||t.defer(),e.resolved=!1,e.openModal=function(){return e.modal.show()},e.closeModal=function(n){return e.resolved=!0,e.modal.remove().then((function(){return e.deferred.resolve(n),n}))},e.setForm=function(n,t){t?e[t]=n:e.form=n},e.getParameters=function(){return i},e.$on("modal.hidden",(function(){e.resolved||(e.resolved=!0,o((function(){return e.deferred.resolve(),e.modal.remove()}),(e.modal.hideDelay||320)+20))}))}return{show:function(i,o,r,l){var c,u,d,p=t.defer();if((l=l||{}).animation=l.animation||"slide-in-up",o){l.scope=l.scope?l.scope.$new():n.$new(),s.call({},l.scope,p,r);var m={$scope:l.scope,parameters:r},E=(u={isControllerAs:!1,controllerName:"",propName:""},d=((c=o)||"").trim().split(/\s+/),u.isControllerAs=3===d.length&&"as"===(d[1]||"").toLowerCase(),u.isControllerAs?(u.controllerName=d[0],u.propName=d[2]):u.controllerName=c,u),g=a(o,m);E.isControllerAs&&(g.openModal=l.scope.openModal,g.closeModal=l.scope.closeModal)}return e.fromTemplateUrl(i,l).then((function(e){if(o)e.scope.$parent.modal=e;else{var n=e.scope;s.call({},n,p,r),n.modal=e}return e.show()}),(function(e){p.reject(e)})),p.promise}}}]).factory("Modals",["ModalUtils",function(e){return{showTransfer:function(n){return e.show("templates/wallet/modal_transfer.html","TransferModalCtrl",n,{focusFirstInput:!0})},showLogin:function(n){var t=angular.copy(n||{});return delete t.templateUrl,delete t.controller,e.show(n&&n.templateUrl||"templates/login/modal_login.html",n&&n.controller||"LoginModalCtrl",t,{focusFirstInput:!0})},showWotLookup:function(n){return e.show("templates/wot/modal_lookup.html","WotLookupModalCtrl",n||{},{focusFirstInput:!0})},showNetworkLookup:function(n){return e.show("templates/network/modal_network.html","NetworkLookupModalCtrl",n,{focusFirstInput:!0})},showAbout:function(n){return e.show("templates/modal_about.html","AboutModalCtrl",n)},showJoin:function(n){return e.show("templates/join/modal_join.html","JoinModalCtrl",n)},showHelp:function(n){return e.show("templates/help/modal_help.html","HelpModalCtrl",n)},showAccountSecurity:function(n){return e.show("templates/wallet/modal_security.html","WalletSecurityModalCtrl",n)}}}]),angular.module("cesium.http.services",["cesium.cache.services"]).factory("csHttp",["$http","$q","$timeout","$window","csSettings","csCache","Device",function(e,n,t,i,a,o,s){var r=a.data.timeout,l=[];function c(e,n){return e?e+(n&&80!=n&&443!=n?":"+n:""):null}function u(e,n,t,i){return(443==n||i?"https":"http")+"://"+c(e,n)+(t||"")}function d(e,n,t,i){n&&n.message?e(n):e(404==i?{ucode:404,message:"Resource not found"+(t?" ("+t+")":"")}:t?"Error while requesting ["+t+"]":"Unknown error from node")}function p(e,n,t,i){var a=[],o={},s=e;return"object"==typeof n&&(a=_.keys(n)),_.forEach(a,(function(e){s===(s=s.replace(":"+e,n[e]))&&(o[e]=n[e])})),t.params=o,i(s,t)}function m(e){var n;e.startsWith("duniter://")&&(n="duniter",e=e.replace("duniter://","http://"));var t=document.createElement("a");t.href=e;var i=t.pathname;i&&i.startsWith("/")&&(i=i.substring(1));var a={protocol:n||t.protocol,hostname:t.hostname,host:t.host,port:t.port,username:t.username,password:t.password,pathname:i,search:t.search,hash:t.hash};return t.remove(),a}function E(e,n){var t=e.split("."),i=n.split(".");function a(e){for(var n=0;n<e.length;++n)if(t=e[n],!/^\d+$/.test(t))return!1;var t;return!0}if(!a(t)||!a(i))return NaN;for(var o=0;o<t.length;++o){if(i.length===o)return 1;if(t[o]!==i[o])return t[o]>i[o]?1:-1}return t.length!=i.length?-1:0}r||(r=4e3);var g=angular.copy(o.constants);return g.clear=function(){console.debug("[http] Cleaning cache..."),o.clear("csHttp-")},{get:function(t,i,a,o,s){if(!t)return n.reject("[http] invalid URL from host: "+t);var l=u(t,i,a,o);return function(t){return n((function(n,i){p(l,t,{timeout:s||r,responseType:"json"},(function(t,a){e.get(t,a).success((function(e,t,i,a){n(e)})).error((function(e,n,a,o){d(i,e,t,n)}))}))}))}},getWithCache:function(t,i,a,s,l,c,m,E){var g=u(t,i,a,s);return l=l||o.constants.LONG,function(t){return n((function(n,i){var a={timeout:m||r,responseType:"json"};a.cache=c?o.get(E,l,(function(n,t,i){console.debug("[http] Refreshing cache for ["+n+"] "),e.get(n,a).success((function(e){a.cache.put(n,e),i&&i(n,e)}))})):o.get(E,l),p(g,t,a,(function(t,a){e.get(t,a).success((function(e){n(e)})).error((function(e,n){d(i,e,t,n)}))}))}))}},post:function(t,i,a,o,s){var l=u(t,i,a,o);return function(t,i){return n((function(n,a){p(l,i,{timeout:s||r,headers:{"Content-Type":"application/json;charset=UTF-8"}},(function(i,o){e.post(i,t,o).success((function(e){n(e)})).error((function(e,n){d(a,e,i,n)}))}))}))}},ws:function(e,i,o,s,r){if(!o)throw console.error("calling csHttp.ws without path argument"),"calling csHttp.ws without path argument";var u=function(e,n,t,i){return(443==n||i?"wss":"ws")+"://"+c(e,n)+(t||"")}(e,i,o,s);function d(e){if(!e.delegate)throw new Error("Websocket not opened");return 1==e.delegate.readyState?n.when(e.delegate):3==e.delegate.readyState?n.reject("Unable to connect to websocket ["+e.delegate.url+"]"):(e.waitDuration>=r?(e.waitRetryDelay=e.waitRetryDelay&&Math.min(e.waitRetryDelay+2e3,3e4)||2e3,console.debug("[http] Will retry websocket [{0}] in {1}s...".format(e.path,Math.round(e.waitRetryDelay/1e3)))):Math.round(e.waitDuration/1e3)%10==0&&console.debug("[http] Waiting websocket ["+e.path+"]..."),t((function(){return e.waitDuration+=e.waitRetryDelay,d(e)}),e.waitRetryDelay))}function m(e,n,t){return e.delegate||(e.path=o,e.callbacks=[],e.waitDuration=0,e.waitRetryDelay=200,p(u,t,{},(function(n){e.delegate=new WebSocket(n),e.delegate.onerror=function(n){e.delegate.readyState=3},e.delegate.onmessage=function(n){var t=JSON.parse(n.data);_.forEach(e.callbacks,(function(e){e(t)}))},e.delegate.onopen=function(n){console.debug("[http] Listening on websocket ["+e.path+"]..."),l.push(e),e.delegate.openTime=Date.now()},e.delegate.onclose=function(n){var i=_.findIndex(l,(function(n){return n.path===e.path}));i>=0&&l.splice(i,1),e.delegate.closing?e.delegate=null:e.delegate.openTime?(console.debug("[http] Unexpected close of websocket [{0}] (open {1} ms ago): re-opening...",o,Date.now()-e.delegate.openTime),e.delegate=null,m(e,null,t)):n&&(console.debug("[http] TODO -- Unexpected close of websocket [{0}]: error code: ".format(o),n),e.delegate=null,m(e,null,t))}}))),n&&e.callbacks.push(n),d(e)}function E(e){e.delegate&&(e.delegate.closing=!0,console.debug("[http] Closing websocket ["+e.path+"]..."),e.delegate.close(),e.callbacks=[],e.onclose&&e.onclose())}return r=r||a.data.timeout,{open:function(e){return m(this,null,e)},on:function(e,n){return m(this,e,n)},onListener:function(e,n){var t=this;return m(t,e,n),function(){!function(e,n){e.callbacks=_.reject(e.callbacks,(function(e){return e===n})),e.callbacks.length||E(e)}(t,e)}},send:function(e){var n=this;return d(n).then((function(){n.delegate&&n.delegate.send(e)}))},close:function(){E(this)},isClosed:function(){return!this.delegate||this.delegate.closing}}},closeAllWs:function(){l.length>0&&(console.debug("[http] Closing all websocket..."),_.forEach(l,(function(e){e.close()})),l=[])},getUrl:u,getServer:c,uri:{parse:m,open:function(e,n){if(n=n||{},!e.startsWith("http://")&&!e.startsWith("https://")){var t=m(e);if(!t.protocol&&n.type&&(t.protocol="email"==n.type?"mailto:":"phone"==n.type?"tel:":"",e=t.protocol+e),"mailto:"==t.protocol&&s.isDesktop())try{return void nw.Shell.openExternal(e)}catch(e){console.error("[http] Failed not open 'mailto:' URI into external tool.")}if("mailto:"!=t.protocol&&"tel:"!=t.protocol||!s.enable)return void(n.onError&&"function"==typeof n.onError&&n.onError(e))}var a,o=n.target||(s.enable?"_system":"_blank");if("_blank"===o||"_system"===o&&s.isDesktop())try{return void nw.Shell.openExternal(e)}catch(e){console.error("[http] Failed not open URI into external browser.")}if("_blank"===o&&s.isDesktop()){if(nw&&nw.Shell)return nw.Shell.openExternal(e),!1;a="location=1,titlebar=1,status=1,menubar=1,toolbar=1,resizable=1,scrollbars=1",i.screen&&i.screen.width&&i.screen.height&&(a+=",width={0},height={1}".format(Math.trunc(i.screen.width/2),Math.trunc(i.screen.height/2)))}var r=i.open(e,o,a);a&&i.screen&&i.screen.width&&i.screen.height&&(r.moveTo(i.screen.width/2/2,i.screen.height/2/2),r.focus())}},date:{now:function(){return moment().utc().unix()}},version:{compare:E,isCompatible:function(e,n){return console.debug("[http] Checking actual version [{0}] is compatible with min expected version [{1}]".format(n,e)),E(e,n)<=0}},cache:g}}]),angular.module("cesium.storage.services",["cesium.config"]).factory("sessionStorage",["$window","$q",function(e,n){var t={storage:e.sessionStorage||{},put:function(e,i){return t.storage[e]=i,n.when()},get:function(e,i){return n.when(t.storage[e]||i)},setObject:function(e,i){return t.storage[e]=JSON.stringify(i),n.when()},getObject:function(e){return n.when(JSON.parse(t.storage[e]||"null"))}};return t}]).factory("localStorage",["$window","$q","$log","sessionStorage",function(e,n,t,i){var a,o=!1,s={standard:{storage:null},secure:{storage:null}};function r(){if(a)return a;var t=Date.now();return(e.localStorage?(console.debug("[storage] Starting {local} storage..."),s.standard.storage=e.localStorage,_.forEach(_.keys(s.standard),(function(e){s[e]=s.standard[e]}))):(console.debug("[storage] Starting {session} storage..."),_.forEach(_.keys(i),(function(e){s[e]=i[e]}))),a=n.when()).then((function(){console.debug("[storage] Started in "+(Date.now()-t)+"ms"),o=!0,a=null}))}return s.standard.put=function(e,t){return angular.isDefined(t)&&null!=t?s.standard.storage[e]=t:s.standard.storage.removeItem(e),n.when()},s.standard.get=function(e,t){return n.when(s.standard.storage[e]||t)},s.standard.setObject=function(e,t){return s.standard.storage[e]=JSON.stringify(t),n.when()},s.standard.getObject=function(e){return n.when(JSON.parse(s.standard.storage[e]||"null"))},s.secure.put=function(e,i){return n((function(n,a){null!=i?s.secure.storage.set((function(e){n()}),(function(e){t.error(e),a(e)}),e,i):s.secure.storage.remove((function(){n()}),(function(e){t.error(e),n()}),e)}))},s.secure.get=function(e,i){return n((function(n,a){s.secure.storage.get((function(e){n(!e&&i?i:e)}),(function(e){t.error(e),n()}),e)}))},s.secure.setObject=function(e,i){return t.debug("[storage] Setting object into secure storage, using key="+e),n((function(n,t){s.secure.storage.set(n,t,e,i?JSON.stringify(i):void 0)}))},s.secure.getObject=function(e){return t.debug("[storage] Getting object from secure storage, using key="+e),n((function(n,i){s.secure.storage.get((function(e){n(JSON.parse(e||"null"))}),(function(e){t.error(e),n()}),e)}))},s.isStarted=function(){return o},s.ready=function(){return o?n.when():a||r()},r(),s}]),angular.module("cesium.device.services",["ngResource","cesium.utils.services","cesium.settings.services"]).factory("Device",["$translate","$ionicPopup","$q","ionicReady",function(e,n,t,i){var a,o={enable:!0},s={},r=!1;function l(e){if(!o.enable)return t.reject("Barcode scanner not enable. Please call 'Device.ready()' once before use (e.g in app.js).");var n=t.defer();return cordova.plugins.barcodeScanner.scan((function(e){console.debug("[device] bar code result",e),e.cancelled?n.resolve():n.resolve(e.text)}),(function(e){console.error("[device] Error while using barcode scanner -> "+e),n.reject(e)}),e),n.promise}return o.enable=!1,o.clipboard={copy:function(e,n){if(!o.enable)return t.reject("Device disabled");var i=t.defer();return $cordovaClipboard.copy(e).then((function(){n&&n(),i.resolve()}),(function(){i.reject({message:"ERROR.COPY_CLIPBOARD"})})),i.promise}},o.camera={getPicture:function(i){return o.camera.enable?(i&&"string"==typeof i&&(i={sourceType:i}),i=i||{},angular.isUndefined(i.sourceType)?e(["SYSTEM.PICTURE_CHOOSE_TYPE","SYSTEM.BTN_PICTURE_GALLERY","SYSTEM.BTN_PICTURE_CAMERA"]).then((function(e){return n.show({title:e["SYSTEM.PICTURE_CHOOSE_TYPE"],buttons:[{text:e["SYSTEM.BTN_PICTURE_GALLERY"],type:"button",onTap:function(e){return navigator.camera.PictureSourceType.PHOTOLIBRARY}},{text:e["SYSTEM.BTN_PICTURE_CAMERA"],type:"button button-positive",onTap:function(e){return navigator.camera.PictureSourceType.CAMERA}}]}).then((function(e){return console.info("[camera] User select sourceType:"+e),i.sourceType=e,o.camera.getPicture(i)}))})):(i.quality=i.quality||50,i.destinationType=i.destinationType||navigator.camera.DestinationType.DATA_URL,i.encodingType=i.encodingType||navigator.camera.EncodingType.PNG,i.targetWidth=i.targetWidth||400,i.targetHeight=i.targetHeight||400,$cordovaCamera.getPicture(i))):t.reject("Camera not enable. Please call 'Device.ready()' once before use (e.g in app.js).")},scan:function(e){return console.warn("Deprecated use of Device.camera.scan(). Use Device.barcode.scan() instead"),l(e)}},o.barcode={enable:!1,scan:l},o.keyboard={enable:!1,close:function(){o.keyboard.enable&&cordova.plugins.Keyboard.close()}},o.keyboard.digit={settings:{bindModel:function(e,n,t){t=t||{},e=e||$rootScope;var i=function(){return(n||"").split(".").reduce((function(e,n){return e?e[n]:void 0}),e)},a=function(t){var i=(n||"").split("."),a=i.length&&i[i.length-1];i.reduce((function(e,n){if(n!=a)return e[n];e[a]=t}),e)};return t.action=t.action||function(e){a((i()||"")+e)},t.decimal&&(t.decimalSeparator=t.decimalSeparator||".",t.leftButton=t.leftButton={html:"<span>.</span>",action:function(){var e=i()||"";e.indexOf(t.decimalSeparator)>=0||(e.trim().length||(e="0"),a(e+t.decimalSeparator))}}),t.rightButton=t.rightButton||{html:'<i class="icon ion-backspace-outline"></i>',action:function(){var e=i();e&&e.length&&(e=e.slice(0,-1),a(e))}},t}}},o.isIOS=function(){return!!navigator.userAgent.match(/iPhone | iPad | iPod/i)||ionic.Platform.isIOS()},o.isDesktop=function(){if(!angular.isDefined(s.isDesktop))try{s.isDesktop=!(o.enable||!process||!nw||!nw.App)}catch(e){s.isDesktop=!1}return s.isDesktop},o.isWeb=function(){return!o.enable&&!o.isDesktop()},o.ready=function(){return r?t.when():a||o.start()},o.start=function(){return a=i().then((function(){o.enable=window.cordova&&cordova&&cordova.plugins,o.enable?(o.camera.enable=!!navigator.camera,o.keyboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.Keyboard,o.barcode.enable=cordova&&cordova.plugins&&!!cordova.plugins.barcodeScanner,o.clipboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.clipboard,o.keyboard.enable&&angular.extend(o.keyboard,cordova.plugins.Keyboard),console.debug("[device] Ionic platform ready, with [camera: {0}] [barcode scanner: {1}] [keyboard: {2}] [clipboard: {3}]".format(o.camera.enable,o.barcode.enable,o.keyboard.enable,o.clipboard.enable))):console.debug("[device] Ionic platform ready - no device detected."),r=!0,a=null}))},o}]),angular.module("cesium.currency.services",["ngApi","cesium.bma.services"]).factory("csCurrency",["$rootScope","$q","$timeout","BMA","Api","csSettings",function(n,t,i,a,o,s){function r(a,r){var l,c,u={WELL_KNOWN_CURRENCIES:{g1:{firstBlockTime:1488987127,medianTimeOffset:3600}}},d={},p=!1,m=new o(this,"csCurrency-"+a);function E(){d.name=null,d.parameters=null,d.firstBlockTime=null,d.membersCount=null,d.cache={},d.node=r,d.currentUD=null,d.medianTimeOffset=0,p=!1,l=void 0,m.data.raise.reset(d)}function g(){return t.all([r.blockchain.parameters().then((function(e){return d.name=e.currency,d.parameters=e,d.medianTimeOffset=e.avgGenTime*e.medianTimeBlocks/2,e})).then((function(e){return n=e.currency,u.WELL_KNOWN_CURRENCIES[n]?(angular.merge(d,u.WELL_KNOWN_CURRENCIES[n]),t.when()):r.blockchain.block({block:0}).then((function(e){d.firstBlockTime=e.medianTime})).catch((function(e){if(e&&e.ucode===r.errorCodes.BLOCK_NOT_FOUND)return d.firstBlockTime=0,d.initPhase=!0,void console.warn("[currency] Blockchain not launched: Enable init phase mode");throw e}));var n})),r.blockchain.stats.ud().then((function(e){return e.result.blocks.length?function e(n,t){if(!n.result.blocks.length||t<0)return d.currentUD=d.parameters?d.parameters.ud0:-1,d.currentUD;var i=n.result.blocks[t];return r.blockchain.block({block:i}).then((function(e){var n,t;return d.currentUD=(n=e.dividend,(t=e.unitbase)<=0?n:n*Math.pow(10,t)),d.currentUD})).catch((function(a){if(console.error("[currency] Unable to load last block with UD, with number {0}".format(i)),t>0)return console.error("[currency] Retrying to load UD from a previous block..."),e(n,t-1);throw d.currentUD=null,a}))}(e,e.result.blocks.length-1):(d.currentUD=d.parameters?d.parameters.ud0:-1,d.currentUD)})).catch((function(e){throw d.currentUD=null,e})),m.data.raisePromise.load(d)]).catch((function(e){throw E(),e}))}function h(){return p?t.when(d):l||O()}function b(e){return function(){return p?t.when(d[e]):l||O().then((function(){return d[e]}))}}function f(n){var t=new e(n);t.cleanData(),console.debug("[currency] Received new block ["+t.number+"-"+t.hash+"]"),d.currentBlock=t,d.currentBlock.receivedAt=moment().utc().unix(),d.medianTime=t.medianTime,d.membersCount=t.membersCount,t.dividend&&(d.currentUD=t.dividend),m.data.raise.newBlock(t)}function T(){console.debug("[currency] Stopping..."),_.forEach(c,(function(e){e()})),c=[],E()}function v(){return T(),i(O,200)}function O(){console.debug("[currency] Starting...");var e=Date.now();return l=r.ready().then(g).then((function(){!function(){c=[r.api.node.on.restart(n,v,this),r.websocket.block().onListener(f)]}(),console.debug("[currency] Started in "+(Date.now()-e)+"ms"),p=!0,l=null,m.data.raise.ready(d)})).then((function(){return d}))}var R=b("currentBlock");function N(e){return R().then((function(n){var t=moment().utc().unix();if(e){if(n&&t-n.receivedAt<60)return n;n||console.warn("[currency] No current block in cache: get it from network. Websocket [/ws/block] may not be started ?")}return r.blockchain.current().catch((function(e){if(e&&e.ucode==r.errorCodes.NO_CURRENT_BLOCK)return{number:0,hash:r.constants.ROOT_BLOCK_HASH,medianTime:moment().utc().unix()};throw e})).then((function(e){return d.currentBlock=e,d.currentBlock.receivedAt=t,e}))}))}return m.registerEvent("data","ready"),m.registerEvent("data","load"),m.registerEvent("data","reset"),m.registerEvent("data","newBlock"),E(),{ready:function(){return p?t.when(d):l||O()},start:O,stop:T,data:d,get:h,name:b("name"),parameters:b("parameters"),currentUD:b("currentUD"),medianTimeOffset:b("medianTimeOffset"),blockchain:{current:N,lastValid:function(){return s.data.blockValidityWindow<=0?N(!0):N(!0).then((function(e){var n=e.number-s.data.blockValidityWindow;return n>0?r.blockchain.block({block:n}):e}))}},date:{now:function(){return moment().utc().unix()-(d.medianTimeOffset||u.WELL_KNOWN_CURRENCIES.g1.medianTimeOffset)}},api:m,default:function(){return console.warn("[currency] 'csCurrency.default()' has been DEPRECATED - Please use 'csCurrency.get()' instead."),h()}}}var l=r("default",a);return l.instance=r,l}]),angular.module("cesium.bma.services",["ngApi","cesium.http.services","cesium.settings.services"]).factory("BMA",["$q","$window","$rootScope","$timeout","Api","Device","csConfig","csSettings","csHttp",function(e,n,t,i,a,o,s,r,l){function c(o,c,u,d){var p,m="[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",E="SIG\\(([0-9a-zA-Z]{43,44})\\)",g="OBJ\\(([0-9]+)\\)",h="( ([a-z_][a-z0-9-_.ğĞ]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))( (.+))?",b={BMA:"BASIC_MERKLED_API",BMAS:"BMAS",WS2P:"WS2P",BMATOR:"BMATOR",WS2PTOR:"WS2PTOR"},f={USER_ID:"[0-9a-zA-Z-_]+",CURRENCY:"[0-9a-zA-Z-_]+",PUBKEY:m,PUBKEY_WITH_CHECKSUM:"("+m+"):([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3})",COMMENT:"[ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",INVALID_COMMENT_CHARS:"[^ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",URI_WITH_AT:"duniter://(?:([A-Za-z0-9_-]+):)?("+m+"@([a-zA-Z0-9-.]+.[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)",URI_WITH_PATH:"duniter://([a-zA-Z0-9-.]+.[a-zA-Z0-9-_:.]+)/("+m+")(?:/([A-Za-z0-9_-]+))?",BMA_ENDPOINT:b.BMA+h,BMAS_ENDPOINT:b.BMAS+h,WS2P_ENDPOINT:b.WS2P+" ([a-f0-9]{8})"+h,BMATOR_ENDPOINT:b.BMATOR+" ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?",WS2PTOR_ENDPOINT:b.WS2PTOR+" ([a-f0-9]{8}) ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?(?: (.+))?"},T={PROTOCOL_VERSION:10,ROOT_BLOCK_HASH:"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",LIMIT_REQUEST_COUNT:5,LIMIT_REQUEST_DELAY:1e3,regexp:f,api:b},v=this;function O(e,n,t,i){v.started&&v.stop(),v.alive=!1,v.cache={getByPath:{},postByPath:{},wsByPath:{}},r.data&&r.data.node&&(e=e||r.data.node.host,n=n||r.data.node.port,t=angular.isDefined(t)?t:443==n||r.data.node.useSsl||v.forceUseSsl,i=!angular.isDefined(i)||i),e&&(v.host=e,v.port=n||80,v.useSsl=angular.isDefined(t)?t:443==v.port||v.forceUseSsl,v.useCache=!!angular.isDefined(i)&&i,v.server=l.getServer(e,n),v.url=l.getUrl(e,n,"",t))}function R(e){return new RegExp("^"+e+"$")}function N(e){return new RegExp(e)}function I(){v.cache&&(console.warn("[BMA] Closing all websockets..."),_.keys(v.cache.wsByPath||{}).forEach((function(e){v.cache.wsByPath[e].close()})),v.cache.wsByPath={})}function S(e){l.getUrl(e.node.host,e.node.port,"",e.node.useSsl)!=v.url&&(O(e.node.host,e.node.port,e.node.useSsl,v.useCache),v.restart())}v.api=new a(this,"BMA-"+v.server),v.started=!1,v.init=O,v.forceUseSsl=!!("true"===s.httpsMode||!0===s.httpsMode||"force"===s.httpsMode||n.location&&"https:"===n.location.protocol),v.forceUseSsl&&console.debug("[BMA] Enable SSL (forced by config or detected in URL)"),o&&O(o,c,u,d),v.useCache=d,v.cleanCache=function(){console.debug("[BMA] Cleaning requests cache..."),I(),v.cache={getByPath:{},postByPath:{},wsByPath:{}}},get=function(e,n){n=v.useCache&&n;var t=e+(n?"#"+n:""),a=function(o){if(!v.started)return v._startPromise||console.warn("[BMA] Trying to get [{0}] before start(). Waiting...".format(e)),v.ready().then((function(){return a(o)}));var s=v.cache.getByPath[t];s||(s=n?l.getWithCache(v.host,v.port,e,v.useSsl,n):l.get(v.host,v.port,e,v.useSsl),v.cache.getByPath[t]=s);var r=1;return s(o).catch((function(e){if(e&&e.ucode==A.errorCodes.HTTP_LIMITATION&&r<=A.constants.LIMIT_REQUEST_COUNT)return 1===r&&(console.warn("[BMA] Too many HTTP requests: Will wait then retry..."),UIUtils.loading.update({template:"COMMON.LOADING_WAIT"})),i((function(){return r++,s(o)}),A.constants.LIMIT_REQUEST_DELAY);throw e}))};return a},post=function(e){var n=function(t,i){if(!v.started)return v._startPromise||console.error("[BMA] Trying to post [{0}] before start()...".format(e)),v.ready().then((function(){return n(t,i)}));var a=v.cache.postByPath[e];return a||(a=l.post(v.host,v.port,e,v.useSsl),v.cache.postByPath[e]=a),a(t,i)};return n},ws=function(e){return function(){var n=v.cache.wsByPath[e];return n&&!n.isClosed()||((n=l.ws(v.host,v.port,e,v.useSsl)).onclose=function(){delete v.cache.wsByPath[e]},v.cache.wsByPath[e]=n),n}},v.isAlive=function(){return l.get(v.host,v.port,"/node/summary",v.useSsl)().then((function(e){var n=e&&e.duniter&&e.duniter.software,t=!0;return"duniter"===n&&e.duniter.version&&r.data.minVersion?t=l.version.isCompatible(r.data.minVersion,e.duniter.version):"gchange-pod"===n&&e.duniter.version&&r.data.plugins.es.minVersion?t=l.version.isCompatible(r.data.plugins.es.minVersion,e.duniter.version):console.debug("[BMA] Unknown node software [{0} v{1}]: could not check compatibility.".format(n||"?",e.duniter.version||"?")),t||console.error("[BMA] Incompatible node [{0} v{1}]: expected at least v{2}".format(n,e.duniter.version,r.data.minVersion)),t})).catch((function(){return!1}))},v.isStarted=function(){return v.started},v.ready=function(){return v.started?e.when(!0):v._startPromise||v.start()},v.start=function(){if(v._startPromise)return v._startPromise;if(v.started)return e.when(v.alive);if(!v.host)return r.ready().then((function(){return v.init(),v.useCache=!0,v.start()}));v.useSsl?console.debug("[BMA] Starting [{0}] (SSL on)...".format(v.server)):console.debug("[BMA] Starting [{0}]...".format(v.server));var n=Date.now();return v._startPromise=e.all([r.ready,v.isAlive()]).then((function(e){return v.alive=e[1],v.alive?(p&&0!==p.length||function(){p=[r.api.data.on.changed(t,S,this)]}(),console.debug("[BMA] Started in "+(Date.now()-n)+"ms"),v.api.node.raise.start(),v.started=!0,delete v._startPromise,!0):(console.error("[BMA] Could not start [{0}]: node unreachable".format(v.server)),v.started=!0,delete v._startPromise,!1)})),v._startPromise},v.stop=function(){console.debug("[BMA] Stopping..."),_.forEach(p,(function(e){e()})),p=[],l.cache.clear(),v.cleanCache(),v.alive=!1,v.started=!1,delete v._startPromise,v.api.node.raise.stop()},v.restart=function(){return v.stop(),i(v.start,200).then((function(e){return e&&v.api.node.raise.restart(),e}))},v.api.registerEvent("node","start"),v.api.registerEvent("node","stop"),v.api.registerEvent("node","restart");var A={errorCodes:{REVOCATION_ALREADY_REGISTERED:1002,HTTP_LIMITATION:1006,IDENTITY_SANDBOX_FULL:1007,NO_MATCHING_IDENTITY:2001,UID_ALREADY_USED:2003,NO_MATCHING_MEMBER:2004,NO_IDTY_MATCHING_PUB_OR_UID:2021,WRONG_SIGNATURE_MEMBERSHIP:2006,MEMBERSHIP_ALREADY_SEND:2007,NO_CURRENT_BLOCK:2010,BLOCK_NOT_FOUND:2011,SOURCE_ALREADY_CONSUMED:2015,TX_INPUTS_OUTPUTS_NOT_EQUAL:2024,TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS:2025,TX_ALREADY_PROCESSED:2030},constants:T,regexp:{USER_ID:R(f.USER_ID),COMMENT:R(f.COMMENT),PUBKEY:R(f.PUBKEY),PUBKEY_WITH_CHECKSUM:R(f.PUBKEY_WITH_CHECKSUM),CURRENCY:R(f.CURRENCY),URI:R(f.URI),BMA_ENDPOINT:R(f.BMA_ENDPOINT),BMAS_ENDPOINT:R(f.BMAS_ENDPOINT),WS2P_ENDPOINT:R(f.WS2P_ENDPOINT),BMATOR_ENDPOINT:R(f.BMATOR_ENDPOINT),WS2PTOR_ENDPOINT:R(f.WS2PTOR_ENDPOINT),TX_OUTPUT_SIG:R(E),TX_OUTPUT_FUNCTION:N("SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)"),TX_OUTPUT_OBJ_OPERATOR_AND:N(g+"([ ]*&&[ ]*("+g+"))+"),TX_OUTPUT_OBJ_OPERATOR_OR:N(g+"([ ]*\\|\\|[ ]*("+g+"))+"),TX_OUTPUT_OBJ:N(g),TX_OUTPUT_OBJ_OPERATOR:N("OBJ\\(([0-9]+)\\)[ ]*(&&)|(\\|\\|)[ ]*OBJ\\(([0-9]+)\\)"),TX_OUTPUT_OBJ_PARENTHESIS:N("\\(("+g+")\\)"),TX_OUTPUT_FUNCTIONS:N("SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)([ ]*(&&)|(\\|\\|)[ ]*SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\))*")},node:{summary:get("/node/summary",l.cache.LONG),same:function(e,n){return e===v.host&&(!v.port&&!n||v.port==n||80)&&v.useSsl==(n&&443===n)},forceUseSsl:v.forceUseSsl},network:{peering:{self:get("/network/peering"),peers:get("/network/peering/peers")},peers:get("/network/peers"),ws2p:{info:get("/network/ws2p/info"),heads:get("/network/ws2p/heads")}},wot:{
|
||
lookup:get("/wot/lookup/:search",l.cache.MEDIUM),certifiedBy:get("/wot/certified-by/:pubkey"),certifiersOf:get("/wot/certifiers-of/:pubkey"),member:{all:get("/wot/members",l.cache.LONG),pending:get("/wot/pending",l.cache.SHORT)},requirements:function(e,n){return!0!==n?A.raw.wot.requirements(e):A.raw.wot.requirementsWithCache(e)},add:post("/wot/add"),certify:post("/wot/certify"),revoke:post("/wot/revoke")},blockchain:{parameters:get("/blockchain/parameters",l.cache.VERY_LONG),block:get("/blockchain/block/:block",l.cache.SHORT),blocksSlice:get("/blockchain/blocks/:count/:from"),current:get("/blockchain/current",l.cache.SHORT),membership:post("/blockchain/membership"),stats:{ud:get("/blockchain/with/ud",l.cache.MEDIUM),tx:get("/blockchain/with/tx"),newcomers:get("/blockchain/with/newcomers",l.cache.MEDIUM),hardship:get("/blockchain/hardship/:pubkey"),difficulties:get("/blockchain/difficulties")}},tx:{sources:get("/tx/sources/:pubkey",l.cache.SHORT),process:post("/tx/process"),history:{all:function(e){return A.raw.tx.history.all(e).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},times:function(e,n){return(!0!==n?A.raw.tx.history.times(e):A.raw.tx.history.timesWithCache(e)).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},blocks:get("/tx/history/:pubkey/blocks/:from/:to",l.cache.LONG),pending:get("/tx/history/:pubkey/pending")}},ud:{history:get("/ud/history/:pubkey")},uri:{},version:{},raw:{wot:{requirementsWithCache:get("/wot/requirements/:pubkey",l.cache.LONG),requirements:get("/wot/requirements/:pubkey")},tx:{history:{timesWithCache:get("/tx/history/:pubkey/times/:from/:to",l.cache.LONG),times:get("/tx/history/:pubkey/times/:from/:to"),all:get("/tx/history/:pubkey")}}}};A.tx.parseUnlockCondition=function(e){for(var n,t,i,a,o=e,s=[],r={},l=A.regexp.TX_OUTPUT_FUNCTION.exec(o);l;)n={},t="OBJ("+s.length+")",n.type=o.substr(l.index,l[0].indexOf("(")),n.value=l[1]||l[2]||l[3]||l[4],s.push(n),r[n.type]=r[n.type]++||1,o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_FUNCTION.exec(o);for(var c=!0;c;){for(c=!!(l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o));l;){for(n={},t="OBJ("+s.length+")",n.type="AND",n.children=[],s.push(n),i=l[0],a=A.regexp.TX_OUTPUT_OBJ.exec(i);a;)n.children.push(s[a[1]]),i=i.replace(a[0],""),a=A.regexp.TX_OUTPUT_OBJ.exec(i);o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(i)}for(l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_OR.exec(o),c=c||!!l;l;){for(n={},t="OBJ("+s.length+")",n.type="OR",n.children=[],s.push(n),i=l[0],a=A.regexp.TX_OUTPUT_OBJ.exec(i);a;)n.children.push(s[a[1]]),i=i.replace(a[0],""),a=A.regexp.TX_OUTPUT_OBJ.exec(i);o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o)}for(l=A.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o),c=c||!!l;l;)o=o.replace(l[0],l[1]),l=A.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o)}if(0!==(r=_.keys(r)).length)return console.debug("[BMA] Unlock conditions successfully parsed:",n),{unlockFunctions:r,unlockTree:n};console.error("[BMA] Unparseable unlock condition: ",output)},A.node.parseEndPoint=function(e,n){var t=A.regexp.BMA_ENDPOINT.exec(e);return t?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:t[8]&&443==t[8],path:t[10],useBma:!0}:(t=A.regexp.BMAS_ENDPOINT.exec(e))?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:!0,path:t[10],useBma:!0}:(t=A.regexp.BMATOR_ENDPOINT.exec(e))?{dns:t[1]||"",port:t[2]||80,useSsl:!1,useTor:!0,useBma:!0}:(t=A.regexp.WS2P_ENDPOINT.exec(e))?{ws2pid:t[1]||"",dns:t[3]||"",ipv4:t[5]||"",ipv6:t[7]||"",port:t[9]||80,useSsl:t[9]&&443==t[9],path:t[11]||"",useWs2p:!0}:(t=A.regexp.WS2PTOR_ENDPOINT.exec(e))?{ws2pid:t[1]||"",dns:t[2]||"",port:t[3]||80,path:t[4]||"",useSsl:!1,useTor:!0,useWs2p:!0}:n&&(t=R(n+h).exec(e))?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:t[8]&&443==t[8],path:t[10],useBma:!1}:void 0},A.copy=function(n){var t=v.started;if(l.getUrl(n.host,n.port,"",n.useSsl)!==v.url)return v.init(n.host,n.port,n.useSsl,v.useCache),t?v.restart():e.when()},A.wot.member.uids=function(){return A.wot.member.all().then((function(e){return e.results.reduce((function(e,n){return e[n.pubkey]=n.uid,e}),{})}))},A.wot.member.get=function(e){return A.wot.member.uids().then((function(n){var t=n[e];return{pubkey:e,uid:t||null}}))},A.wot.member.getByUid=function(e){return A.wot.member.all().then((function(n){return _.findWhere(n.results,{uid:e})}))},A.blockchain.blocks=function(e){return A.raw.getHttpRecursive(A.blockchain.block,"block",e)},A.network.peering.peersByLeaves=function(e){return A.raw.getHttpRecursive(A.network.peering.peers,"leaf",e,0,10)},A.raw.getHttpRecursive=function(n,t,a,o,s){return o=angular.isDefined(o)?o:0,s=s||A.constants.LIMIT_REQUEST_COUNT,e((function(r,l){var c=[],u=[];_.each(a.slice(o,o+s),(function(e){var i={};i[t]=e,u.push(n(i).then((function(e){e&&c.push(e)})))})),e.all(u).then((function(){o<a.length-1?i((function(){A.raw.getHttpRecursive(n,t,a,o+s,s).then((function(e){e&&e.length?r(c.concat(e)):r(c)})).catch((function(e){l(e)}))}),A.constants.LIMIT_REQUEST_DELAY):r(c)})).catch((function(e){e&&e.ucode===A.errorCodes.HTTP_LIMITATION?r(c):l(e)}))}))},A.raw.getHttpWithRetryIfLimitation=function(e){return e().catch((function(n){if(n&&n.ucode==A.errorCodes.HTTP_LIMITATION)return i((function(){return A.raw.getHttpWithRetryIfLimitation(e)}),A.constants.LIMIT_REQUEST_DELAY)}))},A.blockchain.lastUd=function(){return A.blockchain.stats.ud().then((function(e){if(!e.result.blocks||!e.result.blocks.length)return null;var n=e.result.blocks[e.result.blocks.length-1];return A.blockchain.block({block:n}).then((function(e){return e.unitbase>0?e.dividend*Math.pow(10,e.unitbase):e.dividend}))}))},A.uri.parse=function(n){return e((function(e,t){var i;if(R(f.PUBKEY).test(n))e({pubkey:n});else if(R(f.PUBKEY_WITH_CHECKSUM).test(n)){console.debug("[BMA.parse] Detecting a pubkey with checksum: "+n);var a=A.regexp.PUBKEY_WITH_CHECKSUM.exec(n);i=a[1];var o=a[2];console.debug("[BMA.parse] Detecting a pubkey {"+i+"} with checksum {"+o+"}");var s=csCrypto.util.pkChecksum(i);console.debug("[BMA.parse] Expecting checksum for pubkey is {"+s+"}"),o!=s?t({message:"ERROR.PUBKEY_INVALID_CHECKSUM"}):e({pubkey:i})}else if(n.startsWith("duniter://")){var r,c=l.uri.parse(n),u=-1===c.host.indexOf(".")?c.host:null,d=-1!==c.host.indexOf(".")?c.host:null;if(c.username&&(c.password?(r=c.username,i=c.password):i=c.username),c.pathname){var p=c.pathname.split("/"),m=p?p.length:0,E=0;if(!u&&m>E&&(u=p[E++]),!i&&m>E&&(i=p[E++]),!r&&m>E&&(r=p[E++]),m>E)return void t({message:"Bad Duniter URI format. Invalid path (incomplete or redundant): "+c.pathname})}if(u)return d||e({uid:r,pubkey:i,currency:u}),l.get(d+"/blockchain/parameters")().then((function(n){n.currency===u?e({uid:r,pubkey:i,host:d,currency:u}):t({message:"Node's currency ["+n.currency+"] does not matched URI's currency ["+u+"]."})})).catch((function(e){console.error(e),t({message:"Could not get node parameter. Currency could not be retrieve"})}));if(!d)return void t({message:"Bad Duniter URI format. Missing currency name (or node address)."});l.get(d+"/blockchain/parameters")().then((function(n){e({uid:r,pubkey:i,host:d,currency:n.currency})})).catch((function(e){console.error(e),t({message:"Could not get node parameter. Currency could not be retrieve"})}))}else console.debug("[BMA.parse] Could not parse URI: "+n),t({message:"ERROR.UNKNOWN_URI_FORMAT"})})).then((function(e){if(e){if(e.pubkey&&!R(f.PUBKEY).test(e.pubkey))throw{message:"Invalid pubkey format ["+e.pubkey+"]"};if(e.uid&&!R(f.USER_ID).test(e.uid))throw{message:"Invalid uid format ["+e.uid+"]"};if(e.currency&&!R(f.CURRENCY).test(e.currency))throw{message:"Invalid currency format ["+e.currency+"]"};return e}}))};var C=r.data.duniterLatestReleaseUrl&&l.uri.parse(r.data.duniterLatestReleaseUrl);A.raw.getLatestRelease=C?l.getWithCache(C.host,C.port,"/"+C.pathname,443==+C.port||"https:"===C.protocol||v.forceUseSsl,l.cache.LONG):function(){return e.when()},A.version.latest=function(){return A.raw.getLatestRelease().then((function(e){if(e)return e.name&&e.html_url?{version:e.name,url:e.html_url}:e.tag_name&&e.html_url?{version:e.tag_name.substring(1),url:e.html_url}:void 0})).catch((function(e){console.error("[BMA] Failed to get Duniter latest version",e)}))},A.websocket={block:ws("/ws/block"),peer:ws("/ws/peer"),close:I},angular.merge(v,A)}var u=new c(void 0,void 0,void 0,!0);return u.instance=function(e,n,t,i){return new c(e,n,t,i)},u.lightInstance=function(e,n,t,i){return{host:e,port:n=n||80,useSsl:t=angular.isDefined(t)?t:443==n,url:l.getUrl(e,n,"",t),node:{summary:l.getWithCache(e,n,"/node/summary",t,l.cache.LONG,!1,i)},network:{peering:{self:l.get(e,n,"/network/peering",t,i)},peers:l.get(e,n,"/network/peers",t,i)},blockchain:{current:l.get(e,n,"/blockchain/current",t,i),stats:{hardship:l.get(e,n,"/blockchain/hardship/:pubkey",t,i)}}}},u}]),angular.module("cesium.wot.services",["ngApi","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.settings.services"]).factory("csWot",["$q","$timeout","BMA","Api","CacheFactory","csConfig","csCurrency","csSettings","csCache",function(e,n,t,i,a,o,s,r,l){function c(a){var o=new i(this,"csWot-"+a),c=l.get("csWot-idty-",l.constants.SHORT),u=function(e){var n={};return e.reduce((function(e,t){return t.id=t.id||t.uid+"-"+t.pubkey,n[t.id]?e:(n[t.id]=!0,e.concat(t))}),[])},d=function(e,n,t){return n=n||0,e=u(e),e=_.sortBy(e,(function(e){var n=1;return n+=1e6*e.block,-(n+=10*(900-e.uid.toLowerCase().charCodeAt(0)))})),angular.isDefined(t)&&e.length>t&&(e=e.slice(n,n+t)),e},p=function(e,n){return t.wot.lookup({search:e||n}).then((function(i){if(!i||!i.results||!i.results.length)return{uid:null,pubkey:e,hasSelf:!1};var a=i.results.reduce((function(e,n){return e.concat(n.uids.reduce((function(e,t){var i=t.meta.timestamp.split("-",2);return e.concat({uid:t.uid,pubkey:n.pubkey,timestamp:t.meta.timestamp,number:parseInt(i[0]),hash:i[1],revoked:t.revoked,revocationNumber:t.revoked_on,sig:t.self})}),[]))}),[]);a.length&&(a=_.sortBy(a,(function(e){var t=0;return t+=1e10*(n&&e.uid===n?1:0),t+=1e9*(e.revoked?0:1),-(t+=1*(e.number?e.number:0))})));var o=a[0],r=[o.number];return o.revocationNumber&&r.push(o.revocationNumber),t.blockchain.blocks(r).then((function(e){return o.sigDate=e[0].medianTime,0!==o.number&&o.hash!==e[0].hash&&(o.hasBadSelfBlock=!0),o.revocationNumber&&(o.revocationTime=e[1].medianTime),o})).catch((function(e){if(e&&e.ucode==t.errorCodes.BLOCK_NOT_FOUND&&0===o.number)return o.sigDate=s.date.now(),o;throw e}))})).catch((function(n){if(n&&n.ucode==t.errorCodes.NO_MATCHING_IDENTITY)return{uid:null,pubkey:e,hasSelf:!1};throw n}))},m=function(e,n,i,a,o,l){function c(e,n){return e+"-"+n}var u=!0,d=i?i.reduce((function(e,n){var t=c(n.pubkey,n.cert_time?n.cert_time.block:n.sigDate);return n.cert_time||(u=!1),e[t]=n,e}),{}):{};return e({pubkey:n}).then((function(e){return e.certifications.reduce((function(e,n){var t=!n.written,i=n.cert_time?n.cert_time.medianTime:null,s=i?t?i+a.sigWindow-o:i+a.sigValidity-o:0;s=s<0?0:s;var l=c(n.pubkey,u&&n.cert_time?n.cert_time.block:n.sigDate);return delete d[l],e.concat({pubkey:n.pubkey,uid:n.uid,time:i,isMember:n.isMember,wasMember:n.wasMember,expiresIn:s,willExpire:s&&s<=r.data.timeWarningExpire,pending:t,block:null!==n.written?n.written.number:n.cert_time?n.cert_time.block:null,valid:s>0})}),[])})).catch((function(e){if(e&&e.ucode==t.errorCodes.NO_MATCHING_MEMBER)return[];throw e})).then((function(e){var n=_.values(d);if(!n.length)return e;if(s.data.initPhase)return n.reduce((function(e,n){return e.concat({pubkey:n.pubkey,uid:n.uid,isMember:n.isMember,wasMember:n.wasMember,time:null,expiresIn:a.sigWindow,willExpire:!1,pending:!0,block:0,valid:!0})}),e);var i=n.reduce((function(e,n){var t=u&&n.cert_time?n.cert_time.block:n.sigDate?n.sigDate.split("-")[0]:null;return angular.isDefined(t)&&(e[t]?e[t].push(n):e[t]=[n]),e}),{});return t.blockchain.blocks(_.keys(i)).then((function(n){return e=n.reduce((function(e,n){return e.concat(i[n.number].reduce((function(e,t){var i=n.medianTime,s=Math.max(0,i+a.sigWindow-o),c=!t.cert_time||!t.cert_time.block_hash||t.cert_time.block_hash==n.hash;c||console.debug("[wot] Invalid cert {0}: block hash changed".format(t.pubkey.substring(0,8)));var d=s>0&&(!l||t.isMember)&&c;return e.concat({pubkey:t.pubkey,uid:t.uid,isMember:t.isMember,wasMember:t.wasMember,time:i,expiresIn:s,willExpire:s&&s<=r.data.timeWarningExpire,pending:!0,block:u&&t.cert_time?t.cert_time.block:t.sigDate?t.sigDate.split("-")[0]:null,valid:d})}),[]))}),e)}))})).then((function(e){var n=e.reduce((function(e,n){return!n.pending&&n.valid&&n.expiresIn>=a.sigWindow&&(e[n.pubkey]=!0),e}),{});e=function(e){return _.sortBy(e,(function(e){var n=1;return n+=1e12*(e.expiresIn?e.expiresIn:0),n+=1e7*(e.isMember?1:0),-(n+=10*(e.block?e.block:0))}))}(e);var t=[],i=[];return{valid:e.reduce((function(e,a){return a.pending?(a.valid&&!n[a.pubkey]?t.push(a):a.valid||n[a.pubkey]||i.push(a),e):e.concat(a)}),[]),pending:t,error:i}}))},E=function(n,i,a,r){var l;if(!n&&a&&!r)return t.wot.member.getByUid(a).then((function(e){return e?E(e.pubkey,i,e.uid):E(n,i,a,!0)}));if(n){if((l=i?c.get(n):null)&&(!a||l.uid==a))return console.debug("[wot] Identity "+n.substring(0,8)+" found in cache"),e.when(l);console.debug("[wot] Loading identity "+n.substring(0,8)+"..."),l={pubkey:n}}else console.debug("[wot] Loading identity from uid "+a),l={};var u,d,g=Date.now();return e.all([s.parameters().then((function(e){u=e,l.sigQty=u.sigQty,l.sigStock=u.sigStock})),s.blockchain.current().then((function(e){d=e.medianTime})).catch((function(e){if(!e||e.ucode!=t.errorCodes.NO_CURRENT_BLOCK)throw e;d=Math.trunc((new Date).getTime()/1e3)})),e.when().then((function(){l.requirements={},l.isMember=!1})),p(n,a).then((function(e){angular.merge(l,e)}))]).then((function(){if(l.requirements.uid){var n=l.requirements.uid+"-"+l.requirements.meta.timestamp;return e.all([m(t.wot.certifiersOf,l.pubkey,l.lookup?l.lookup.certifications[n]:null,u,d,!0).then((function(e){l.received_cert=e.valid,l.received_cert_pending=e.pending,l.received_cert_error=e.error})),m(t.wot.certifiedBy,l.pubkey,l.lookup?l.lookup.givenCertifications:null,u,d,!1).then((function(e){l.given_cert=e.valid,l.given_cert_pending=e.pending,l.given_cert_error=e.error}))])}})).then((function(){return function(e){e.requirements.needCertificationCount=!e.requirements.needMembership&&e.requirements.certificationCount<e.sigQty?e.sigQty-e.requirements.certificationCount:0,e.requirements.willNeedCertificationCount=!e.requirements.needMembership&&!e.requirements.needCertificationCount&&e.requirements.certificationCount-e.requirements.willExpireCertificationCount<e.sigQty?e.sigQty-e.requirements.certificationCount+e.requirements.willExpireCertificationCount:0,e.requirements.pendingCertificationCount=e.received_cert_pending?e.received_cert_pending.length:0,e.requirements.revoked=angular.isDefined(e.requirements.revoked)?e.requirements.revoked:e.revoked,e.requirements.revoked?(delete e.hasBadSelfBlock,T(e,{type:"error",message:"ERROR.IDENTITY_REVOKED",messageParams:{revocationTime:e.revocationTime}}),console.debug("[wot] Identity [{0}] has been revoked".format(e.uid))):e.requirements.pendingRevocation?(T(e,{type:"error",message:"ERROR.IDENTITY_PENDING_REVOCATION"}),console.debug("[wot] Identity [{0}] has pending revocation".format(e.uid))):e.hasBadSelfBlock?(delete e.hasBadSelfBlock,e.isMember||(T(e,{type:"error",message:"ERROR.IDENTITY_INVALID_BLOCK_HASH"}),console.debug("[wot] Invalid membership for {0}: block hash changed".format(e.uid)))):e.requirements.expired?(T(e,{type:"error",message:"ERROR.IDENTITY_EXPIRED"}),console.debug("[wot] Identity {0} expired (in sandbox)".format(e.uid))):e.requirements.willNeedCertificationCount>0&&(T(e,{type:"error",message:"INFO.IDENTITY_WILL_MISSING_CERTIFICATIONS",messageParams:e.requirements}),console.debug("[wot] Identity {0} will need {1} certification(s)".format(e.uid,e.requirements.willNeedCertificationCount)))}(l),o.data.raisePromise.load(l).catch((function(e){console.debug("Error while loading identity data, on extension point."),console.error(e)}))})).then((function(){if(l.pubkey)return delete l.lookup,c.put(l.pubkey,l),console.debug("[wot] Identity "+l.pubkey.substring(0,8)+" loaded in "+(Date.now()-g)+"ms"),l}))},g=function(n,i){if(!n||n.trim()!==n)return e.when(void 0);var a=n.replace(/(^|\s)#\w+/g,"");return a=(a=a.replace(/[^a-zA-Z0-9_-\s]+/g,"")).replace(/\s+/g," ").trim(),(i=i||{}).addUniqueId=!angular.isDefined(i.addUniqueId)||i.addUniqueId,i.allowExtension=!angular.isDefined(i.allowExtension)||i.allowExtension,i.excludeRevoked=!!angular.isDefined(i.excludeRevoked)&&i.excludeRevoked,(a?e.all(a.split(" ").reduce((function(e,n){return console.debug("[wot] Will search on: '"+n+"'"),e.concat(t.wot.lookup({search:n}))}),[])).then((function(e){return e.reduce((function(e,n){return e.concat(n.results.reduce((function(e,n){return e.concat(n.uids.reduce((function(e,t){var a=t.meta.timestamp.split("-",2),o=!t.revoked&&t.revocation_sig;return i.excludeRevoked&&o?e:e.concat({uid:t.uid,pubkey:n.pubkey,number:a[0],hash:a[1],revoked:o})}),[]))}),[]))}),[])})).catch((function(e){if(e&&e.ucode==t.errorCodes.NO_MATCHING_IDENTITY)return[];throw e})):e.when([])).then((function(e){if(!i.allowExtension)return i.addUniqueId?u(e):e;var a=e.length;return o.data.raisePromise.search(n,e,"pubkey").then((function(){if(e.length>a&&_.filter(e,(function(e){return!e.uid&&e.pubkey})).length)return t.wot.member.uids().then((function(n){_.forEach(e,(function(e){!e.uid&&e.pubkey&&(e.uid=n[e.pubkey])}))}))})).then((function(){return i.addUniqueId?u(e):e}))}))},h=function(i,a,o,s){return e((function(r,l){var c=[],u=[];_.each(i.slice(a,a+o),(function(e){u.push(t.blockchain.block({block:e}).then((function(e){e&&e.joiners&&_.each(e.joiners,(function(n){var t=n.split(":"),i=t[t.length-1]+"-"+t[0];c.push({id:i,uid:t[t.length-1],pubkey:t[0],memberDate:e.medianTime,block:e.number})}))})))})),e.all(u).then((function(){c.length<s&&a<i.length-1?n((function(){h(i,a+o,o,s-c.length).then((function(e){r(c.concat(e))})).catch((function(e){l(e)}))}),1e3):r(c)})).catch((function(e){e&&e.ucode===t.errorCodes.HTTP_LIMITATION?r(c):l(e)}))}))},b=function(i,a,o){return e((function(s,r){var l=[],c={},u=[];_.each(i.slice(a,a+o),(function(e){u.push(g(e,{addUniqueId:!1,allowExtension:!1}).then((function(e){e&&e.length&&(l=e.reduce((function(e,n){return c[n.pubkey]?e:(c[n.pubkey]=!0,e.concat(n))}),l))})))})),e.all(u).then((function(){a<i.length-1?n((function(){b(i,a+o,o).then((function(e){e&&e.length?s(e.reduce((function(e,n){return c[n.pubkey]?e:(c[n.pubkey]=!0,e.concat(n))}),l)):s(l)})).catch((function(e){r(e)}))}),t.constants.LIMIT_REQUEST_DELAY):s(l)})).catch((function(e){e&&e.ucode===t.errorCodes.HTTP_LIMITATION?s(l):r(e)}))}))},f=function(n,i,a){i=i||"pubkey";var s=[];return a||s.push(t.wot.member.uids()),s.push(o.data.raisePromise.search(null,n,i).catch((function(e){console.debug("Error while search identities, on extension point."),console.error(e)}))),e.all(s).then((function(e){if(!a){var t=e[0];_.forEach(n,(function(e){!e.uid&&e[i]&&(e.uid=t[e[i]],e.uid&&e.uid==e.name&&delete e.name)}))}return n}))},T=function(e,n){(n=n||{}).type=n.type||"info",n.message=n.message||"",n.messageParams=n.messageParams||{},e.events=e.events||[],e.events.push(n)};return o.registerEvent("data","load"),o.registerEvent("data","search"),{id:a,load:E,search:g,newcomers:function(e,n){return e=e||0,n=n||20,t.blockchain.stats.newcomers().then((function(t){if(!t.result.blocks||!t.result.blocks.length)return null;var i=_.sortBy(t.result.blocks,(function(e){return-e}));return h(i,0,5,e+n)})).then((function(t){return t&&t.length?(t=d(t,e,n),f(t,"pubkey",!0)):null}))},pending:function(n,i){return n=n||0,i=i||20,e.all([t.wot.member.uids(),t.wot.member.pending().then((function(e){return e.memberships&&e.memberships.length?e.memberships:void 0}))]).then((function(a){var o=a[0],s=a[1];if(s){var r={},l={};_.forEach(s,(function(e){if("IN"==e.membership&&!o[e.pubkey]){var n={uid:e.uid,pubkey:e.pubkey,block:e.blockNumber,blockHash:e.blockHash},t=l[e.pubkey];if(t&&n.block>t.block)return;l[n.pubkey]=n,r[n.block]?r[n.block].push(n):r[n.block]=[n],t&&(r[t.block]=r[t.block].reduce((function(e,n){return n.pubkey==t.pubkey?e:(e||[]).concat(n)}),null),null===r[t.block]&&delete r[t.block])}}));var c=d(_.values(l),n,i),u=c.reduce((function(e,n){return e.concat(n.block)}),[]);return e.all([t.blockchain.blocks(_.uniq(u)).then((function(e){_.forEach(e,(function(e){_.forEach(r[e.number],(function(n){n.sigDate=e.medianTime,0!==e.number&&n.blockHash!==e.hash&&(T(n,{type:"error",message:"ERROR.WOT_PENDING_INVALID_BLOCK_HASH"}),console.debug("Invalid membership for uid={0}: block hash changed".format(n.uid)))}))}))})),f(c,"pubkey",!0)]).then((function(){return c}))}}))},all:function(){return b(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","u","v","w","x","y","z"],0,t.constants.LIMIT_REQUEST_COUNT).then((function(e){return f(e,"pubkey",!0).then((function(){return u(e)}))}))},extend:function(e,n,t){return f([e],n,t).then((function(e){return e[0]}))},extendAll:f,api:o}}var u=c("default");return u.instance=c,u}]),angular.module("cesium.tx.services",["ngApi","cesium.bma.services","cesium.settings.services","cesium.wot.services"]).factory("csTx",["$q","$timeout","$filter","$translate","UIUtils","BMA","Api","csConfig","csSettings","csWot","FileSaver",function(e,n,t,i,a,o,s,r,l,c,u){function d(n,o){var r=new s(this,"csTx-"+n),d=function(e,n,t,i,a){n&&0!==n.length&&_.forEach(n,(function(n){if(n.block_number||a){var s,r,l=!1,c=n.issuers.reduce((function(n,t){return l=t===e||l,n+(t!==e?", "+t:"")}),"");c.length>0&&(c=c.substring(2));var u,d=[],p=n.outputs.reduce((function(t,i,a){var p=i.split(":",3);r=parseInt(p[1]);var E=m(parseInt(p[0]),r),g=p[2],h=o.regexp.TX_OUTPUT_SIG.exec(g);if(h){var b=h[1];if(b==e){if(!l)return t+E;null===n.block_number&&d.push({amount:parseInt(p[0]),base:r,type:"T",identifier:n.hash,noffset:a,consumed:!1})}else if(""!==b&&b!=c&&(s=b),l)return t-E}else if(-1!=g.indexOf("SIG("+e+")")){var f=o.tx.parseUnlockCondition(g);if(f)return f.amount=E,(u=u||[]).push(f),console.debug("[tx] has locked output:",f),t+E}return t}),0),E=p>0?c:s,g=n.time||n.blockstampTime,h=p+":"+n.hash+":"+g;if(!i[h]&&0!==p){i[h]=!0;var b={time:g,amount:p,pubkey:E,comment:n.comment,isUD:!1,hash:n.hash,locktime:n.locktime,block_number:n.block_number};l&&null===n.block_number&&(b.inputs=n.inputs,b.sources=d),u&&(b.lockedOutputs=u),t.push(b)}}}))},p=function(n,t,i){return e((function(i,a){var s=[],r=[],c=[],u=Math.trunc((new Date).getTime()/1e3);t=t||u-l.data.walletHistoryTimeSecond;var p={},m={pendings:[]},E=function(e){d(n,e.history.sent,s,p),d(n,e.history.received,s,p),d(n,e.history.sending,s,p),d(n,e.history.pending,c,p,!0)},g=[o.tx.history.pending({pubkey:n}).then(E)];if(-1!==t){for(var h=l.data.walletHistorySliceSecond,b=t-t%h;b-h<u;b+=h)g.push(o.tx.history.times({pubkey:n,from:b,to:b+h-1}).then(E));g.push(o.tx.history.timesNoCache({pubkey:n,from:u-u%h,to:u+999999999}).then(E))}else g.push(o.tx.history.all({pubkey:n}).then(E));e.all(g).then((function(){m.history=s.concat(r).sort((function(e,n){return n.time-e.time})),m.pendings=c,m.fromTime=t,m.toTime=m.history.length?m.history[0].time:t,i(m)})).catch((function(e){m.history=[],m.pendings=[],m.errors=[],delete m.fromTime,delete m.toTime,a(e)}))}))},m=function(e,n){return n<=0?e:e*Math.pow(10,n)},E=function(e,n){_(n).forEach((function(n){!function(e,n,t){var i=e.type+":"+e.identifier+":"+e.noffset;angular.isUndefined(t[i])&&(n.push(e),t[i]=n.length-1)}(n,e.sources,e.sourcesIndexByKey)}))},g=function(e){return o.tx.sources({pubkey:e}).then((function(e){var n={sources:[],sourcesIndexByKey:[],balance:0};return e.sources&&e.sources.length&&(_.forEach(e.sources,(function(e){e.consumed=!1,n.balance+=m(e.amount,e.base)})),E(n,e.sources)),n}))},h=function(n,t){var i=(new Date).getTime(),a={};return e.all([g(n),p(n,t)]).then((function(e){angular.merge(a,e[0]),a.tx=e[1];var n=[],t=[],i=a.balance;function o(e){var o=[],s=!0;e.amount>0?s=!1:(_.forEach(e.inputs,(function(e){var n=e.split(":").slice(2).join(":"),t=a.sourcesIndexByKey[n];if(!angular.isDefined(t))return s=!1,!1;o.push(a.sources[t])})),e.sources&&E(a,e.sources),delete e.sources,delete e.inputs),s?(i+=e.amount,n.push(e),_.forEach(o,(function(e){e.consumed=!0}))):t.push(e)}for(var s=a.tx.pendings,r=!0;s&&s.length>0;)_.forEach(s,o),t.length>0&&n.length>0&&r?(s=t,t=[],r=!1):s=null;return a.tx.pendings=n,a.tx.errors=t,a.balance=i,c.extendAll((a.tx.history||[]).concat(a.tx.pendings||[]),"pubkey")})).then((function(){return console.debug("[tx] TX and sources loaded in "+((new Date).getTime()-i)+"ms"),a}))};return downloadHistoryFile=function(n,s){return(s=s||{}).fromTime=s.fromTime||-1,console.debug("[tx] Exporting TX history for pubkey [{0}]".format(n.substr(0,8))),e.all([i(["ACCOUNT.HEADERS.TIME","COMMON.UID","COMMON.PUBKEY","ACCOUNT.HEADERS.AMOUNT","ACCOUNT.HEADERS.COMMENT"]),o.blockchain.current(),h(n,s.fromTime)]).then((function(e){var o=e[0],s=e[1],r=s&&s.medianTime||moment().utc().unix(),l=s&&s.currency;return(e=e[2])&&e.tx&&e.tx.history?i("ACCOUNT.FILE_NAME",{currency:l,pubkey:n,currentTime:r}).then((function(e){var n=t("formatDecimal"),i=(t("formatPubkey"),t("formatDate")),a=(t("formatDateForFile"),t("currencySymbolNoHtml")),s=[o["ACCOUNT.HEADERS.TIME"],o["COMMON.UID"],o["COMMON.PUBKEY"],o["ACCOUNT.HEADERS.AMOUNT"]+" ("+a(l)+")",o["ACCOUNT.HEADERS.COMMENT"]],r=e.tx.history.reduce((function(e,t){return e.concat([i(t.time),t.uid,t.pubkey,n(t.amount/100),'"'+t.comment+'"'].join(";")+"\n")}),[s.join(";")+"\n"]),c=new Blob(r,{type:"text/plain; charset=utf-8"});u.saveAs(c,e)})):a.toast.show("INFO.EMPTY_TX_HISTORY")}))},{id:n,load:h,downloadHistoryFile:downloadHistoryFile,api:r}}var p=d("default",o);return p.instance=d,p}]),angular.module("cesium.wallet.services",["ngApi","ngFileSaver","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.settings.services"]).factory("csWallet",["$q","$rootScope","$timeout","$translate","$filter","Api","localStorage","CryptoUtils","BMA","csConfig","csSettings","FileSaver","Blob","csWot","csTx","csCurrency",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g){function h(i,a){var l,m,E,h={},b=new o(this,"csWallet-"+i),f=function(e){h.loaded=!1,h.pubkey=null,h.keypair={signSk:null,signPk:null},h.uid=null,h.isNew=null,h.events=[],T(),m=!1,E=void 0,e?b.data.raise.init(h):(u.data.useLocalStorage||u.reset(),b.data.raise.reset(h))},T=function(){h.keypair={signSk:null,signPk:null}},v=function(){return!!h.pubkey},O=function(n){return m?v()?e.when(h.keypair):e.reject("Not auth"):(E||M()).then((function(){return O(n)}))},R=function(){if(u.data.useLocalStorage)if(v()&&u.data.rememberMe){var e={keypair:h.keypair,pubkey:h.pubkey,version:c.version};s.setObject("GCHANGE_DATA",e)}else s.setObject("GCHANGE_DATA",null);else s.setObject("GCHANGE_DATA",null);s.setObject("CESIUM_DATA",null)},N=function(){return e.all([s.get("GCHANGE_DATA"),s.get("CESIUM_DATA")]).then((function(e){var n=e[0]||e[1];if(n)return y(n,!1).then((function(e){if(e&&e.keypair&&e.pubkey)return h.keypair=e.keypair,h.pubkey=e.pubkey,h.loaded=!1,b.data.raisePromise.login(h)})).then((function(){return h}))}))},I=function(e){return e&&e.minData?A(e):e||h.loaded?C(e):S()},S=function(){return h.loaded=!1,e.all([b.data.raisePromise.load(h,null).catch((function(e){console.error("Error while loading wallet data, on extension point. Try to continue"),console.error(e)}))]).then((function(){return b.data.raisePromise.finishLoad(h).catch((function(e){console.error("Error while finishing wallet data load, on extension point. Try to continue"),console.error(e)}))})).then((function(){return h.loaded=!0,h})).catch((function(e){throw h.loaded=!1,e}))},A=function(e){return C(e=e||{})},C=function(n){n=n||{api:!0};var t=[];return L("requirements"),t.length&&!n.api||t.push(b.data.raisePromise.load(h,n)),e.all(t).then((function(){return b.data.raisePromise.finishLoad(h)})).then((function(){return h}))},D=function(e){var n=Math.round(e.answer.length/2),t=e.answer.substr(0,n),i=e.answer.substr(n);return r.scryptKeypair(t,i).then((function(n){return e.pubkey=r.util.encode_base58(n.signPk),e.keypair=n,e}))},L=function(e){h.events=h.events.reduce((function(n,t){return t.context&&t.context==e?n:n.concat(t)}),[])},y=function(n,t){return t=!!angular.isUndefined(t)||t,e((function(e,i){var a=JSON.parse(n||"{}");if(a&&a.keypair&&a.keypair.signPk&&a.keypair.signSk){var o,s={},r=new Uint8Array(32);for(o=0;o<32;o++)r[o]=a.keypair.signPk[o];s.signPk=r;var l=new Uint8Array(64);for(o=0;o<64;o++)l[o]=a.keypair.signSk[o];if(s.signSk=l,a.version&&a.keypair.boxPk){var c=new Uint8Array(32);for(o=0;o<32;o++)c[o]=a.keypair.boxPk[o];s.boxPk=c}if(a.version&&a.keypair.boxSk){var u=new Uint8Array(32);for(o=0;o<64;o++)u[o]=a.keypair.boxSk[o];s.boxSk=u}e({pubkey:a.pubkey,keypair:s,tx:a.tx})}else t?i("Not a valid Wallet.data object"):e()}))};function k(){console.debug("[wallet] Stopping..."),_.forEach(l,(function(e){e()})),l=[],f()}function P(){return k(),t(M,200)}function M(){console.debug("[wallet] Starting...");var t=(new Date).getTime();return E=e.all([u.ready(),g.ready(),a.ready()]).then(N).then((function(e){if(e&&e.pubkey)return I({minData:!0})})).then((function(){!function(){l=[u.api.data.on.changed(n,R,this),a.api.node.on.restart(n,P,this)]}(),console.debug("[wallet] Started in "+((new Date).getTime()-t)+"ms"),m=!0,E=null,b.data.raise.ready(h)})).then((function(){return h}))}return b.registerEvent("data","ready"),b.registerEvent("data","init"),b.registerEvent("data","loginCheck"),b.registerEvent("data","login"),b.registerEvent("data","load"),b.registerEvent("data","finishLoad"),b.registerEvent("data","logout"),b.registerEvent("data","unauth"),b.registerEvent("data","reset"),b.registerEvent("error","send"),b.registerEvent("action","certify"),f(!0),{id:i,data:h,ready:function(){return m?e.when():E||M()},start:M,stop:k,login:function(e,n){return r.scryptKeypair(e,n).then((function(e){return h.pubkey=r.util.encode_base58(e.signPk),h.keypair=e,b.data.raisePromise.loginCheck(h).catch((function(e){throw f(),e})).then((function(){return b.data.raisePromise.login(h)}))})).then((function(){return u.data.useLocalStorage&&R(),h}))},logout:function(){return e((function(e,n){f(),R(),b.data.raise.logout(),b.data.raise.unauth(),e()}))},isLogin:v,getKeypair:O,isDataLoaded:function(e){return e&&e.minData,h.loaded},isNeverUsed:function(){if(h.loaded)return!h.pubkey||!(h.name||h.profile||h.avatar)},isNew:function(){return!!h.isNew},isUserPubkey:function(e){return v()&&h.pubkey===e},getData:function(){return h},loadData:I,refreshData:C,downloadSaveId:function(e){return function(e){var n="Version: 10 \nType: SaveID\nQuestions: \n"+e.questions+"Issuer: "+h.pubkey+"\nCrypted-Nonce: "+e.nonce+"\nCrypted-Pubkey: "+e.pubkey+"\nCrypted-Salt: "+e.salt+"\nCrypted-Pwd: "+e.pwd+"\n";return r.sign(n,h.keypair).then((function(e){return n+=e+"\n",console.debug("Has generate an SaveID document:\n----\n"+n+"----"),n}))}(e).then((function(e){var n=new p([e],{type:"text/plain; charset=utf-8"});d.saveAs(n,"saveID.txt")}))},getCryptedId:function(e){return D(e).then((function(){return r.util.random_nonce()})).then((function(n){return e.nonce=n,r.box.pack(e.salt,e.nonce,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.salt=n,r.box.pack(e.pwd,e.nonce,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.pwd=n,e.nonce=r.util.encode_base58(e.nonce),e}))},recoverId:function(e){var n=r.util.decode_base58(e.cypherNonce);return D(e).then((function(e){return r.box.open(e.cypherSalt,n,e.keypair.boxPk,e.keypair.boxSk)})).then((function(t){return e.salt=t,r.box.open(e.cypherPwd,n,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.pwd=n,e})).catch((function(e){console.warn("Incorrect answers - Unable to recover passwords")}))},events:{add:function(e,n){(e=e||{}).type=e.type||"info",e.message=e.message||"",e.messageParams=e.messageParams||{},e.context=e.context||"undefined",e.message.trim().length?n?h.events.splice(0,0,e):h.events.push(e):console.debug("Event without message. Skipping this event")},cleanByContext:L},api:b}}var b=h("default",l);return b.instance=h,b}]),angular.module("cesium.plugin.services",[]).provider("PluginService",(function(){var e=[],n={};this.registerEagerLoadingService=function(n){return e.push(n),this},this.extendState=function(e,t){return angular.isDefined(e)&&angular.isDefined(t)&&(n[e]||(n[e]=[]),n[e].push(t)),this},this.extendStates=function(e,n){var t=this;return e.forEach((function(e){t.extendState(e,n)})),this},this.$get=["$injector","$state",function(t,i){var a;return{start:function(){e.length>0&&_.forEach(e,(function(e){t.get(e)}))},extensions:{points:{getActivesByName:function(e){return _.keys(n).reduce((function(e,t){return i.includes(t)?e.concat(n[t]):e}),[]).reduce((function(n,t){return t.points&&t.points[e]?n.concat(t.points[e]):n}),[])},current:{get:function(){return a},set:function(e){a=e}}}}}}]})),angular.module("cesium.services",["cesium.config","cesium.settings.services","cesium.http.services","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.modal.services","cesium.storage.services","cesium.device.services","cesium.currency.services","cesium.wallet.services","cesium.tx.services","cesium.wot.services","cesium.plugin.services"]),e.prototype.isEmpty=function(){"use strict";return!(this.transactionsCount||this.certificationsCount||this.joinersCount||this.dividend||this.activesCount||this.identitiesCount||this.leaversCount||this.excludedCount||this.revokedCount)},e.prototype.parseData=function(){this.identities=this.parseArrayValues(this.identities,["pubkey","signature","buid","uid"]),this.joiners=this.parseArrayValues(this.joiners,["pubkey","signature","mBuid","iBuid","uid"]),this.actives=this.parseArrayValues(this.actives,["pubkey","signature","mBuid","iBuid","uid"]),this.leavers=this.parseArrayValues(this.leavers,["pubkey","signature","mBuid","iBuid","uid"]),this.revoked=this.parseArrayValues(this.revoked,["pubkey","signature"]),this.excluded=this.parseArrayValues(this.excluded,["pubkey"]),this.certifications=this.parseArrayValues(this.certifications,["from","to","block","signature"]),this.transactions=this.parseTransactions(this.transactions),delete this.raw},e.prototype.cleanData=function(){delete this.identities,delete this.joiners,delete this.actives,delete this.leavers,delete this.revoked,delete this.excluded,delete this.certifications,delete this.transactions,delete this.raw},e.prototype.parseArrayValues=function(e,n){return e&&e.length?e.reduce((function(e,t){var i=t.split(":");if(i.length!=n.length)return console.debug("[block] Bad format for '{0}': [{1}]. Expected {1} parts. Skipping".format(arrayProperty,t,n.length)),e;for(var a={},o=0;o<n.length;o++)a[n[o]]=i[o];return e.concat(a)}),[]):[]},e.prototype.regexp={TX_OUTPUT_SIG:("SIG\\(([0-9a-zA-Z]{43,44})\\)",new RegExp("^SIG\\(([0-9a-zA-Z]{43,44})\\)$"))},e.prototype.parseTransactions=function(n){return n&&n.length?n.reduce((function(n,t){var i={issuers:t.issuers,time:t.time};return i.outputs=t.outputs.reduce((function(n,i){var a=i.split(":");if(3!=a.length)return console.debug("[block] Bad format a 'transactions': [{0}]. Expected 3 parts. Skipping".format(i)),n;var o=a[0],s=a[1],r=a[2],l=e.prototype.regexp.TX_OUTPUT_SIG.exec(a[2]);if(l){var c=l[1];return t.issuers&&-1==t.issuers.indexOf(c)?n.concat({amount:s<=0?o:o*Math.pow(10,s),unitbase:s,pubkey:c}):n}return n.concat({amount:s<=0?o:o*Math.pow(10,s),unitbase:s,unlockCondition:r})}),[]),i.error||i.outputs.length||(i.toHimself=!0),n.concat(i)}),[]):[]},t.$inject=["$scope","$rootScope","$state","$ionicSideMenuDelegate","$q","$timeout","$ionicHistory","$controller","$window","csPlatform","UIUtils","BMA","csWallet","Device","Modals","csSettings","csConfig","csHttp"],i.$inject=["$scope","$state","$timeout","$ionicHistory","$translate","UIUtils","csPlatform","csCurrency","csSettings"],n.$inject=["$scope","PluginService"],angular.module("cesium.app.controllers",["cesium.services"]).config(["$httpProvider",function(e){e.defaults.useXDomain=!0,delete e.defaults.headers.common["X-Requested-With"]}]).config(["$stateProvider","$urlRouterProvider",function(e,n){e.state("app",{url:"/app",abstract:!0,templateUrl:"templates/menu.html",controller:"AppCtrl",data:{large:!1}}).state("app.home",{url:"/home?error",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"HomeCtrl"}}}),n.otherwise("/app/home")}]).controller("AppCtrl",t).controller("HomeCtrl",i).controller("PluginExtensionPointCtrl",n),a.$inject=["$timeout","Modals"],o.$inject=["$scope","$state","UIUtils","CryptoUtils","csSettings","Modals","csWallet","mkWallet","BMA"],angular.module("cesium.join.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.join",{url:"/join",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"JoinCtrl"}}})}]).controller("JoinCtrl",a).controller("JoinModalCtrl",o),s.$inject=["$scope","$timeout","CryptoUtils","UIUtils","Modals","csSettings","Device"],angular.module("cesium.login.controllers",["cesium.services"]).controller("LoginModalCtrl",s),r.$inject=["$scope","$state","$timeout","$anchorScroll","csSettings"],l.$inject=["$scope","$timeout","$anchorScroll","csSettings","parameters"],c.$inject=["$scope","$rootScope","$state","$window","$ionicSideMenuDelegate","$timeout","$q","$anchorScroll","UIUtils","csConfig","csSettings","csCurrency","Device","csWallet"],u.$inject=["$scope"],angular.module("cesium.help.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.help_tour",{url:"/tour",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"HelpTourCtrl"}}}).state("app.help",{url:"/help?anchor",views:{menuContent:{templateUrl:"templates/help/view_help.html",controller:"HelpCtrl"}}}).state("app.help_anchor",{url:"/help/:anchor",views:{menuContent:{templateUrl:"templates/help/view_help.html",controller:"HelpCtrl"}}})}]).controller("HelpCtrl",r).controller("HelpModalCtrl",l).controller("HelpTipCtrl",c).controller("HelpTourCtrl",u),d.$inject=["$scope","$q","$ionicPopup","$timeout","$state","UIUtils","csWallet","$translate","$ionicPopover","Modals","csSettings","esHttp"],angular.module("cesium.wallet.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.view_wallet",{url:"/wallet",views:{menuContent:{templateUrl:"templates/wallet/view_wallet.html",controller:"WalletCtrl"}}})}]).controller("WalletCtrl",d),p.$inject=["$scope","$state","$timeout","$focus","$ionicPopover","$ionicHistory","UIUtils","csConfig","csCurrency","csSettings","Device","BMA","csWallet","esDocument","esProfile"],m.$inject=["$scope","$controller","$focus","parameters"],E.$inject=["$scope","$rootScope","$state","$translate","$ionicHistory","UIUtils","Modals","esHttp","csCurrency","csWot","csWallet"],g.$inject=["$scope","$rootScope","$controller","$timeout","UIUtils","csWallet"],angular.module("cesium.wot.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.wot_lookup",{url:"/wot?q&type&hash",views:{menuContent:{templateUrl:"templates/wot/lookup.html",controller:"WotLookupCtrl"}}}).state("app.wot_identity",{url:"/wot/:pubkey/:uid?action",views:{menuContent:{templateUrl:"templates/wot/view_identity.html",controller:"WotIdentityViewCtrl"}}}).state("app.wot_identity_uid",{url:"/lookup/:uid?action",views:{menuContent:{templateUrl:"templates/wot/view_identity.html",controller:"WotIdentityViewCtrl"}}})}]).controller("WotLookupCtrl",p).controller("WotLookupModalCtrl",m).controller("WotIdentityAbstractCtrl",E).controller("WotIdentityViewCtrl",g),h.$inject=["$scope","$q","$window","$ionicHistory","$ionicPopup","$timeout","$translate","UIUtils","Modals","BMA","csHttp","csConfig","csSettings","csPlatform"],angular.module("cesium.settings.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.settings",{url:"/settings",views:{menuContent:{templateUrl:"templates/settings/settings.html",controller:"SettingsCtrl"}}})}]).controller("SettingsCtrl",h),angular.module("cesium.controllers",["cesium.app.controllers","cesium.join.controllers","cesium.login.controllers","cesium.help.controllers","cesium.settings.controllers","cesium.wallet.controllers","cesium.wot.controllers"]),angular.module("cesium.templates",[]).run(["$templateCache",function(e){e.put("templates/menu.html",'<ion-side-menus enable-menu-with-back-views="true" bind-notifier="{locale:$root.settings.locale.id}">\n \x3c!-- HEADER --\x3e\n <ion-side-menu-content>\n <ion-nav-bar class="bar-dark" title-align="left">\n <ion-nav-back-button class="no-text">\n </ion-nav-back-button>\n\n <ion-nav-buttons side="left">\n <button class="button button-icon button-clear icon ion-navicon visible-nomenu" menu-toggle="left"></button>\n </ion-nav-buttons>\n <ion-nav-buttons side="right">\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="nav-buttons-right"></cs-extension-point>\n\n \x3c!-- profile --\x3e\n <a id="helptip-header-bar-btn-profile" class="button button-icon button-clear hidden-xs hidden-sm" ng-click="showProfilePopover($event)">\n <i class="avatar avatar-member" ng-if="!$root.walletData.avatar" ng-class="{\'disable\': !login, \'royal-bg\': login}">\n </i>\n <i class="avatar" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')">\n </i>\n </a>\n </ion-nav-buttons>\n </ion-nav-bar>\n <ion-nav-view name="menuContent"></ion-nav-view>\n </ion-side-menu-content>\n\n \x3c!-- MENU --\x3e\n <ion-side-menu id="menu" side="left" expose-aside-when="large" enable-menu-with-back-views="false" width="225">\n <ion-header-bar>\n <h1 class="title dark hidden-sm hidden-xs" translate>\n COMMON.APP_NAME\n </h1>\n\n <div class="visible-sm visible-xs hero">\n <div class="content">\n <i class="avatar avatar-member hero-icon" ng-if="!$root.walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}" ng-click="!login ? showHome() : loginAndGo(\'app.view_wallet\')" menu-close></i>\n <i class="avatar hero-icon" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')" ng-click="loginAndGo(\'app.view_wallet\')" menu-close></i>\n <h4 ng-if="login">\n <a class="light" ng-click="loginAndGo(\'app.view_wallet\')" menu-close>\n {{$root.walletData.name||$root.walletData.uid}}\n <span ng-if="!$root.walletData.name && !$root.walletData.uid"><i class="icon ion-key"></i> {{$root.walletData.pubkey|formatPubkey}}</span>\n </a>\n </h4>\n <h4 ng-if="!login">\n <a class="light" ui-sref="app.view_wallet" menu-close>\n {{\'COMMON.BTN_LOGIN\'|translate}}\n <i class="ion-arrow-right-b"></i>\n </a>\n </h4>\n <cs-extension-point name="menu-profile-user"></cs-extension-point>\n </div>\n \x3c!-- logout --\x3e\n <a ng-if="login" class="button-icon" ng-click="logout({askConfirm: true})" style="position: absolute; top: 5px; left: 5px; z-index: 999">\n <i class="icon stable ion-android-exit"></i>\n </a>\n </div>\n\n \x3c!-- Fullscreen button --\x3e\n \x3c!-- removeIf(device) --\x3e\n <a ng-if="::$root.device.isWeb()" ng-click="toggleFullscreen()" class="button-icon visible-sm visible-xs" style="position: absolute; top: 5px; right: 5px; z-index: 999">\n <i class="icon ion-arrow-expand light" ng-class="{\'ion-arrow-shrink\': fullscreen}"></i>\n </a>\n \x3c!-- endRemoveIf(device) --\x3e\n </ion-header-bar>\n\n <ion-content scroll="false">\n <ion-list class="list">\n\n \x3c!-- Home --\x3e\n <ion-item menu-close class="item-icon-left" ui-sref="app.home" active-link-path-prefix="#/app/home" active-link="active">\n <i class="icon ion-home"></i>\n {{:locale:\'MENU.HOME\'|translate}}\n </ion-item>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="menu-discover"></cs-extension-point>\n\n \x3c!-- MAIN Section --\x3e\n <div class="item item-divider"></div>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="menu-main"></cs-extension-point>\n\n\n \x3c!-- USER Section --\x3e\n <div class="item item-divider"></div>\n\n\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/wallet" ng-click="loginAndGo(\'app.view_wallet\')" ng-class="{\'item-menu-disable\': !login}">\n <i class="icon ion-person"></i>\n {{:locale:\'MENU.ACCOUNT\'|translate}}\n </a>\n <a id="helptip-menu-btn-account"></a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="menu-user"></cs-extension-point>\n\n <a menu-close class="item item-icon-left visible-xs visible-sm" active-link="active" active-link-path-prefix="#/app/settings" ui-sref="app.settings">\n <i class="icon ion-android-settings"></i>\n {{:locale:\'MENU.SETTINGS\'|translate}}\n </a>\n <a id="helptip-menu-btn-settings"></a>\n\n </ion-list>\n\n </ion-content>\n\n \x3c!-- removeIf(device) --\x3e\n <ion-footer-bar class="bar-stable footer hidden-xs hidden-sm">\n <a class="pull-left icon-help" menu-toggle="left" title="{{:locale:\'HOME.BTN_HELP\'|translate}}" ui-sref="app.help"></a>\n\n <a class="title gray" ng-click="showAboutModal()" title="{{:locale:\'HOME.BTN_ABOUT\'|translate}}">\n \x3c!-- version --\x3e\n <span title="{{:locale:\'HOME.BTN_ABOUT\'|translate}}" ng-class="{\'assertive\': $root.newRelease}">\n \x3c!-- warning icon, if new version available --\x3e\n <i ng-if="$root.newRelease" class="ion-alert-circled assertive"></i>\n\n {{:locale:\'COMMON.APP_VERSION\'|translate:{version: config.version} }}\n </span>\n |\n \x3c!-- about --\x3e\n <span translate>HOME.BTN_ABOUT</span>\n </a>\n </ion-footer-bar>\n \x3c!-- endRemoveIf(device) --\x3e\n </ion-side-menu>\n\n\n</ion-side-menus>\n'),e.put("templates/modal_about.html",'<ion-modal-view class="about">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CLOSE\n </button>\n <h1 class="title" translate>ABOUT.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="text-center" scroll="true">\n\n <div class="list item-wrap-text">\n <ion-item class="item-icon-left item-text-wrap">\n <ng-bind-html ng-bind-html="\'COMMON.APP_NAME\'|translate"></ng-bind-html> <b>{{\'COMMON.APP_VERSION\'|translate:$root.config}}</b>\n <i ng-if="$root.newRelease" class="assertive ion-alert-circled"></i>\n <h3 ng-if="$root.config.build" class="gray">{{\'COMMON.APP_BUILD\'|translate:$root.config}}</h3>\n <span translate>ABOUT.LICENSE</span>\n </ion-item>\n\n \x3c!-- new version --\x3e\n <ion-item class="item-icon-left" ng-if="$root.newRelease">\n <i class="item-image icon ion-alert-circled assertive"></i>\n\n <span ng-if="!$root.device.isWeb()" ng-bind-html="\'ABOUT.PLEASE_UPDATE\' | translate:$root.newRelease "></span>\n <span ng-if="$root.device.isWeb()" ng-bind-html="\'ABOUT.LATEST_RELEASE\' | translate:$root.newRelease "></span>\n\n \x3c!-- link to release page --\x3e\n <h3 ng-if="!$root.device.enable">\n <a ng-click="openLink($event, $root.newRelease.url)" translate>{{::$root.newRelease.url}}</a>\n </h3>\n </ion-item>\n\n \x3c!-- source code --\x3e\n <div class="item item-icon-left">\n <i class="item-image icon ion-social-github"></i>\n {{\'ABOUT.CODE\' | translate}}\n <h3><a ng-click="openLink($event, \'https://github.com/duniter-gchange/gchange-client\')">https://github.com/duniter-gchange/gchange-client</a></h3>\n </div>\n\n \x3c!-- forum --\x3e\n <div class="item item-icon-left">\n <i class="item-image icon ion-chatbubbles"></i>\n {{\'ABOUT.FORUM\' | translate}}\n <h3><a ng-click="openLink($event, $root.settings.userForumUrl)">{{::$root.settings.userForumUrl}}</a></h3>\n </div>\n\n <div class="item item-icon-left">\n <i class="item-image icon ion-person-stalker"></i>\n {{\'ABOUT.DEVELOPERS\' | translate}}\n <h3>\n <a ng-click="openLink($event, \'https://github.com/blavenie\')">Benoit Lavenier</a>\n </h3>\n </div>\n <ion-item class="item item-icon-left item-text-wrap">\n <i class="item-image icon ion-bug"></i>\n <h2>{{\'ABOUT.DEV_WARNING\'|translate}}</h2>\n <span translate>ABOUT.DEV_WARNING_MESSAGE</span>\n <br>\n <a ng-click="openLink($event, $root.settings.newIssueUrl)" translate>ABOUT.REPORT_ISSUE</a>\n </ion-item>\n\n <div class="padding hidden-xs text-center">\n <button class="button button-positive ink" type="submit" ng-click="closeModal()">\n {{\'COMMON.BTN_CLOSE\' | translate}}\n </button>\n </div>\n\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("templates/api/locales_popover.html",'<ion-popover-view class="fit popover-locales" style="height: {{locales.length*48}}px">\n <ion-content scroll="false">\n <div class="list item-text-wrap block">\n\n <a ng-repeat="l in locales track by l.id" class="item item-icon-left ink" ng-click="changeLanguage(l.id)">\n <i class="item-image avatar" style="border-radius: 0; background-image: url(https://www.countryflags.io/{{l.country}}/shiny/64.png)"></i>\n {{l.label | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/common/form_error_messages.html",' <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.FIELD_ACCENT"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n'),e.put("templates/common/popover_copy.html",'<ion-popover-view class="popover-copy" style="height: {{(!rows || rows <= 1) ? 50 : rows*22}}px">\n <ion-content scroll="false">\n <div class="list">\n <div class="item item-input">\n <input type="text" ng-if="!rows || rows <= 1" ng-model="value">\n <textarea ng-if="rows && rows > 1" ng-model="value" rows="{{rows}}" cols="10">\n </textarea></div>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/common/popover_helptip.html",'<ion-popover-view class="popover-helptip">\n <ion-content scroll="false" class="list">\n <p>\n <i ng-if="icon.position && !icon.position.startsWith(\'bottom-\')" class="{{icon.class}} icon-{{icon.position}} hidden-xs" style="{{icon.style}}"></i>\n\n \x3c!-- close button--\x3e\n <a ng-click="closePopover()" class="pull-right button-close" ng-class="{\'pull-left\': icon.position === \'right\', \'pull-right\': icon.position !== \'right\'}">\n <i class="ion-close"></i>\n </a>\n\n <span> </span>\n </p>\n\n <p class="padding light">\n <ng-bind-html ng-bind-html="content | translate:contentParams"></ng-bind-html>\n <ng-bind-html ng-bind-html="trustContent"></ng-bind-html>\n </p>\n\n \x3c!-- buttons (if helptip) --\x3e\n <div class="text-center" ng-if="!tour">\n <button class="button button-small button-stable" ng-if="!hasNext" ng-click="closePopover(true)" translate>COMMON.BTN_UNDERSTOOD</button>\n <button class="button button-small button-stable" id="helptip-btn-ok" ng-if="hasNext" ng-click="closePopover(false)" translate>COMMON.BTN_UNDERSTOOD</button>\n <button id="helptip-btn-ok" class="button button-small button-positive icon-right ink" ng-if="hasNext" ng-click="closePopover(true)">\n <i class="icon ion-chevron-right"></i>\n </button>\n </div>\n\n \x3c!-- buttons (if feature tour) --\x3e\n <div class="text-center" ng-if="tour">\n <button class="button button-small button-positive" id="helptip-btn-ok" ng-if="!hasNext" ng-click="closePopover(false)" translate>COMMON.BTN_CLOSE</button>\n <button id="helptip-btn-ok" class="button button-small button-positive icon-right ink" ng-if="hasNext" ng-click="closePopover(true)">\n {{\'COMMON.BTN_CONTINUE\'|translate}}\n <i class="icon ion-chevron-right"></i>\n </button>\n </div>\n\n <p>\n <i ng-if="icon.position && icon.position.startsWith(\'bottom-\')" class="{{icon.class}} icon-{{icon.position}} hidden-xs"></i>\n </p>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/common/popover_profile.html",'<ion-popover-view class="fit has-header popover-profile hidden-xs hidden-sm">\n <ion-content scroll="false">\n <div class="row">\n <div class="col col-33">\n <i class="avatar avatar-member" ng-if="!$root.walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}"></i>\n <i class="avatar" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')"></i>\n </div>\n <div class="col col-66" ng-if="login">\n <h4>{{$root.walletData.name||$root.walletData.uid}}</h4>\n\n <h4 class="gray" ng-if="!$root.walletData.name && !$root.walletData.uid" copy-on-click="{{$root.walletData.pubkey}}">\n <i class="icon ion-key"></i> {{$root.walletData.pubkey|formatPubkey}}\n </h4>\n </div>\n </div>\n\n <div class="row" ng-show="login">\n <div class="col col-66 col-offset-33">\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="profile-popover-user"></cs-extension-point>\n </div>\n </div>\n\n <div class="row" ng-show="!login">\n <div class="col col-66 col-offset-33">\n <div class="text-center no-padding gray">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <b>\n <button class="button button-calm button-small ink" ng-click="showJoinModal()">\n {{\'LOGIN.CREATE_ACCOUNT\'|translate}}\n </button>\n </b>\n </div>\n </div>\n </div>\n </ion-content>\n <ion-footer-bar class="stable-bg row">\n <div class="col">\n \x3c!-- settings --\x3e\n <button class="button button-raised button-block button-stable ink ink-dark" id="helptip-popover-profile-btn-settings" ng-click="showSettings()" ui-sref="app.settings">\n <i class="icon ion-android-settings"></i>\n {{\'MENU.SETTINGS\' | translate}}\n </button>\n </div>\n <div class="col">\n <button class="button button-raised button-block button-stable ink ink-dark" ng-show="login" ng-click="logout()" translate>COMMON.BTN_LOGOUT</button>\n <button class="button button-raised button-block button-positive ink" ng-show="!login" ng-click="loginAndGo(\'app.view_wallet\')" translate>COMMON.BTN_LOGIN</button>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("templates/common/popover_share.html",'<ion-popover-view class="popover-share">\n <ion-content scroll="false">\n <div class="bar bar-header">\n <h1 class="title" ng-bind-html="titleKey|translate:titleValues"></h1>\n <span class="gray pull-right hidden-xs">{{time|formatDate}}</span>\n </div>\n <div class="list no-margin no-padding has-header has-footer block">\n <div class="item item-input">\n <input type="text" ng-model="value">\n </div>\n </div>\n\n <div class="bar bar-footer">\n <div class="button-bar">\n\n <a class="button button-icon positive icon ion-social-facebook" href="https://www.facebook.com/sharer/sharer.php?u={{postUrl|formatEncodeURI}}&title={{postMessage|formatEncodeURI}}" onclick="window.open(this.href, \'facebook-share\',\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\');return false;" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_FACEBOOK\'|translate}}">\n </a>\n\n <a class="button button-icon positive icon ion-social-twitter" href="https://twitter.com/intent/tweet?url={{postUrl|formatEncodeURI}}&text={{postMessage|formatEncodeURI}}" onclick="window.open(this.href, \'twitter-share\',\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\');return false;" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_TWITTER\'|translate}}">\n </a>\n\n <a class="button button-icon positive icon ion-social-googleplus" href="https://plus.google.com/share?url={{postUrl|formatEncodeURI}}" onclick="window.open(this.href, \'google-plus-share\', \'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=296,width=580\');return false;" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_GOOGLEPLUS\'|translate}}">\n </a>\n\n <a class="button button-icon positive icon ion-social-diaspora" href="https://sharetodiaspora.github.io/?title={{postMessage|formatEncodeURI}}&url={{postUrl|formatEncodeURI}}" onclick="window.open(this.href, \'diaspora-share\',\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\');return false;" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_DIASPORA\'|translate}}">\n </a>\n\n <a class="button-close" title="{{\'COMMON.BTN_CLOSE\'|translate}}" ng-click="closePopover()">\n <i class="icon ion-close"></i>\n </a>\n </div>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/join/modal_join.html",'<ion-modal-view class="modal-full-height">\n\n <ion-header-bar class="bar-positive">\n\n <button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slides.slider.activeIndex">\n </button>\n <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="!isLastSlide" ng-click="showHelpModal()"></button>\n\n <h1 class="title" translate>ACCOUNT.NEW.TITLE</h1>\n\n <button class="button button-clear icon-right visible-xs" ng-if="!isLastSlide" ng-click="doNext()">\n <span translate>COMMON.BTN_NEXT</span>\n <i class="icon ion-ios-arrow-right"></i>\n </button>\n <button class="button button-clear icon-right visible-xs" ng-if="isLastSlide" ng-click="doNewAccount()">\n <i class="icon ion-android-send"></i>\n </button>\n </ion-header-bar>\n\n\n <ion-slides options="slides.options" slider="slides.slider">\n\n \x3c!-- STEP: salt --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="saltForm" novalidate="" ng-submit="doNext(\'saltForm\')">\n\n <div class="list" ng-init="setForm(saltForm, \'saltForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-salt\')"></a>\n <span translate>ACCOUNT.NEW.SALT_WARNING</span>\n </div>\n\n \x3c!-- salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.username.$invalid}">\n <span class="input-label" translate>LOGIN.SALT</span>\n <input ng-if="!showUsername" name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required>\n <input ng-if="showUsername" name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required>\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.username.$error" ng-messages="saltForm.username.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.confirmSalt.$invalid}">\n <span class="input-label pull-right" translate>ACCOUNT.NEW.SALT_CONFIRM</span>\n <input ng-if="!showUsername" name="confirmUsername" type="password" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username">\n <input ng-if="showUsername" name="confirmUsername" type="text" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username">\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.confirmUsername.$error" ng-messages="saltForm.confirmUsername.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.SALT_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n \x3c!-- Show values --\x3e\n <div class="item item-toggle dark">\n <span translate>COMMON.SHOW_VALUES</span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="showUsername">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n <i class="icon ion-arrow-right-a"></i>\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP: password--\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="passwordForm" novalidate="" ng-submit="doNext(\'passwordForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-password\')"></a>\n <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span>\n </div>\n\n <div class="list" ng-init="setForm(passwordForm, \'passwordForm\')">\n\n \x3c!-- password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.password.$invalid}">\n <span class="input-label" translate>LOGIN.PASSWORD</span>\n <input ng-if="!showPassword" name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="6" required>\n <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="6" required>\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.password.$error" ng-messages="passwordForm.password.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}">\n <span class="input-label" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span>\n <input ng-if="!showPassword" name="confirmPassword" type="password" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n <input ng-if="showPassword" name="confirmPassword" type="text" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.confirmPassword.$error" ng-messages="passwordForm.confirmPassword.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.PASSWORD_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n \x3c!-- Show values --\x3e\n <div class="item item-toggle dark">\n <span translate>COMMON.SHOW_VALUES</span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="showPassword">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n\n <div class="padding hidden-xs">\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP 5: pseudo--\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="pseudoForm" novalidate="" ng-submit="doNext(\'pseudoForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <span translate>PROFILE.JOIN.TITLE_WARNING</span>\n </div>\n\n <div class="list" ng-init="setForm(pseudoForm, \'pseudoForm\')">\n\n \x3c!-- pseudo --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': pseudoForm.$submitted && pseudoForm.pseudo.$invalid}">\n <span class="input-label" translate>PROFILE.TITLE</span>\n <input name="pseudo" type="text" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" ng-model="formData.pseudo" ng-minlength="4" ng-maxlength="100" required>\n </div>\n <div class="form-errors" ng-show="pseudoForm.$submitted && pseudoForm.pseudo.$error" ng-messages="pseudoForm.pseudo.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!--<cs-extension-point name="last-slide"></cs-extension-point>--\x3e\n\n \x3c!-- STEP 6: last slide --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n\n <div class="padding text-center" translate>PROFILE.JOIN.LAST_SLIDE_CONGRATULATION</div>\n\n <div class="list">\n\n <ion-item class="item item-text-wrap item-border">\n <div class="dark pull-right padding-right" ng-if="formData.computing">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <span class="input-label" translate>COMMON.PUBKEY</span>\n <span class="gray text-no-wrap" ng-if="formData.computing" translate>\n ACCOUNT.NEW.COMPUTING_PUBKEY\n </span>\n <span class="gray text-no-wrap" ng-if="formData.pubkey">\n {{formData.pubkey}}\n </span>\n </ion-item>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" ng-click="doNewAccount()" translate>\n COMMON.BTN_SEND\n <i class="icon ion-android-send"></i>\n </button>\n </div>\n </ion-content>\n </ion-slide-page>\n\n \n</ion-slides></ion-modal-view>\n'),e.put("templates/help/help.html",'\n <a name="join"></a>\n <h2 translate>HELP.JOIN.SECTION</h2>\n\n <a name="join-salt"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.SALT</div>\n <div class="col" translate>HELP.JOIN.SALT</div>\n </div>\n\n <a name="join-password"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.PASSWORD</div>\n <div class="col" translate>HELP.JOIN.PASSWORD</div>\n </div>\n\n <a name="glossary"></a>\n <h2 translate>HELP.GLOSSARY.SECTION</h2>\n\n <a name="pubkey"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.PUBKEY</div>\n <div class="col" translate>HELP.GLOSSARY.PUBKEY_DEF</div>\n </div>\n\n <a name="universal_dividend"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.UNIVERSAL_DIVIDEND</div>\n <div class="col" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div>\n </div>\n\n'),e.put("templates/help/modal_help.html",'<ion-view class="modal slide-in-up ng-enter active ng-enter-active">\n\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CLOSE\n </button>\n\n <h1 class="title" translate>HELP.TITLE</h1>\n </ion-header-bar>\n\n <ion-content scroll="true" class="padding">\n\n <ng-include src="\'plugins/market/templates/help/help.html\'"></ng-include>\n\n <div class="padding hidden-xs text-center">\n <button class="button button-positive ink" type="submit" ng-click="closeModal()">\n {{\'COMMON.BTN_CLOSE\' | translate}}\n </button>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("templates/help/view_help.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>HELP.TITLE</span>\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <h1 class="hidden-xs hidden-sm" translate>HELP.TITLE</h1>\n\n <ng-include src="\'templates/help/help.html\'"></ng-include>\n\n </ion-content>\n</ion-view>\n'),e.put("templates/home/home.html",'<ion-view id="home">\n <ion-nav-title>\n\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n \x3c!-- locales --\x3e\n <button class="button button-clear hidden-xs hidden-sm gray" ng-if="!login" ng-click="showLocalesPopover($event)" style="align-content: center">\n <img ng-if=":locale:$root.settings.locale.country" ng-src="https://www.countryflags.io/{{:locale:$root.settings.locale.country}}/shiny/32.png">\n <span ng-if=":locale:!$root.settings.locale.country">{{:locale:$root.settings.locale.label}} </span>\n <small class="ion-arrow-down-b"></small>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="has-header text-center padding-xs bg-image-cover" style="background-image: url({{bgImage}})" scroll="false">\n\n <div class="logo"></div>\n <p class="hidden-xs"> </p>\n\n <div class="center padding light-bg" style="max-width: 382px">\n\n <h4>\n <span class="hidden-xs" translate>HOME.MESSAGE</span>\n\n <span ng-show="!loading" ng-bind-html="\'HOME.MESSAGE_CURRENCY\'|translate:{currency: $root.currency.name}"></span>\n </h4>\n\n <br class="hidden-xs">\n\n <ion-spinner icon="android" ng-if="loading"></ion-spinner>\n\n <div class="animate-fade-in animate-show-hide ng-hide" ng-show="!loading && error">\n <div class="card card-item padding">\n <p class="item-content item-text-wrap">\n <span class="dark" trust-as-html="\'HOME.CONNECTION_ERROR\'|translate:node"></span>\n </p>\n\n \x3c!-- Retry--\x3e\n <button type="button" class="button button-positive icon icon-left ion-refresh ink" ng-click="reload()">{{\'COMMON.BTN_REFRESH\'|translate}}</button>\n </div>\n </div>\n\n <div class="center animate-fade-in animate-show-hide ng-hide" ng-show="!loading && !error">\n\n\n \x3c!-- Help tour (NOT ready yet for small device)\n <button type="button"\n ng-show="login"\n class="button button-block button-stable button-raised icon-left icon ion-easel ink-dark hidden-xs"\n ng-click="startHelpTour()" >\n {{\'COMMON.BTN_HELP_TOUR\'|translate}}\n </button>--\x3e\n\n <cs-extension-point name="buttons"></cs-extension-point>\n\n <button type="button" class="button button-block button-positive button-raised icon ink-dark" ng-click="showJoinModal()" ng-if="!login" translate>LOGIN.CREATE_FREE_ACCOUNT</button>\n\n <button type="button" class="button button-block button-positive button-raised icon icon-left ion-person ink-dark" ui-sref="app.view_wallet" ng-show="login" translate>MENU.ACCOUNT</button>\n\n <br class="visible-xs visible-sm">\n \x3c!-- login link --\x3e\n <div class="text-center no-padding" ng-show="!login">\n <br class="visible-xs visible-sm">\n {{\'LOGIN.HAVE_ACCOUNT_QUESTION\'|translate}}\n <b>\n <a class="positive hidden-xs hidden-sm" ng-click="loginAndGo(\'app.view_wallet\')" translate>\n COMMON.BTN_LOGIN\n </a>\n </b>\n </div>\n\n \x3c!-- disconnect link --\x3e\n <div class="text-center no-padding hidden-xs hidden-sm" ng-show="login">\n <span class="dark" ng-bind-html="\'HOME.NOT_YOUR_ACCOUNT_QUESTION\'|translate:$root.walletData"></span>\n <a class="bold positive" ng-click="logout()" translate>\n HOME.BTN_CHANGE_ACCOUNT\n </a>\n </div>\n\n <button type="button" class="button button-block button-stable button-raised ink visible-xs visible-sm" ui-sref="app.view_wallet" ng-if="!login" translate>COMMON.BTN_LOGIN</button>\n <button type="button" class="button button-block button-assertive button-raised icon icon-left ion-log-out ink-dark visible-xs visible-sm" ng-click="logout()" ng-if="login" translate>COMMON.BTN_LOGOUT</button>\n\n </div>\n\n <br>\n\n <div class="text-center no-padding visible-xs stable">\n <br>\n \x3c!-- version --\x3e\n <span translate="COMMON.APP_VERSION" translate-values="{version: config.version}"></span>\n |\n \x3c!-- about --\x3e\n <a href="#" ng-click="showAboutModal()" translate>HOME.BTN_ABOUT</a>\n </div>\n </div>\n\n\n </ion-content>\n\n</ion-view>\n'),e.put("templates/login/modal_login.html",'<ion-modal-view class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <h1 class="title" ng-bind-html="\'LOGIN.TITLE\' | translate">\n </h1>\n <div class="buttons buttons-right">\n <span class="secondary-buttons visible-xs">\n <button class="button button-positive button-icon button-clear icon ion-android-done" style="color: #fff" ng-click="doLogin()">\n </button>\n </span></div>\n\n </ion-header-bar>\n\n <ion-content>\n <form name="loginForm" novalidate="" ng-submit="doLogin()">\n\n <div class="list" ng-init="setForm(loginForm)">\n\n \x3c!-- salt (=username, to enable browser login cache) --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.SALT</span>\n <input ng-if="!showSalt" name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" required>\n <input ng-if="showSalt" name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Show salt --\x3e\n <div class="item item-toggle dark">\n <span translate>LOGIN.SHOW_SALT</span>\n <label class="toggle toggle-stable">\n <input type="checkbox" ng-model="showSalt">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n \x3c!-- password--\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span>\n <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-model-options="{ debounce: 650 }" select-on-click required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.password.$error" ng-messages="form.password.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n\n \x3c!-- remember me --\x3e\n <div class="item item-toggle dark hidden-xs">\n <span translate>SETTINGS.REMEMBER_ME</span>\n <label class="toggle toggle-calm">\n <input type="checkbox" ng-model="formData.rememberMe">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n\n \x3c!-- Show public key --\x3e\n <div class="item item-button-right left">\n <span ng-if="formData.username && formData.password" class="input-label" translate>COMMON.PUBKEY</span>\n <a class="button button-light button-small ink animate-if" ng-click="showPubkey()" ng-if="showPubkeyButton">\n {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}\n </a>\n <h3 class="gray text-no-wrap" ng-if="!computing">\n {{pubkey}}\n </h3>\n <h3 ng-if="computing">\n <ion-spinner icon="android"></ion-spinner>\n </h3>\n </div>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_LOGIN\' | translate}}\n </button>\n </div>\n\n \x3c!-- Register ? --\x3e\n <div class="text-center no-padding">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <a ng-click="showJoinModal()" translate>\n LOGIN.CREATE_ACCOUNT\n </a>\n </div>\n\n <div class="text-center no-padding">\n <a ng-click="showAccountSecurityModal()" translate>\n LOGIN.FORGOTTEN_ID\n </a>\n </div>\n\n \x3c!--div class="padding hidden-xs text-right">\n <a class="assertive ink" ng-click="openNewAccount()" type="button" translate>COMMON.NO_ACOUNT_QUESTION\n </a>\n </div--\x3e\n </form>\n </ion-content>\n</ion-modal-view>\n'),e.put("templates/settings/popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="reset()">\n <i class="icon ion-refresh"></i>\n {{\'SETTINGS.BTN_RESET\' | translate}}\n </a>\n\n \x3c!-- help tour --\x3e\n <a class="item item-icon-left ink" ng-click="startSettingsTour()">\n <i class="icon ion-easel"></i>\n {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/settings/popup_node.html",'<form name="popupForm" ng-submit="">\n\n <div class="list no-padding" ng-init="setPopupForm(popupForm)">\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': popupForm.$submitted && popupForm.newNode.$invalid}">\n <span class="input-label" ng-bind-html="\'SETTINGS.POPUP_PEER.HOST\'|translate"></span>\n <input name="newNode" type="text" placeholder="{{\'SETTINGS.POPUP_PEER.HOST_HELP\' | translate}}" ng-model="popupData.newNode" ng-minlength="3" required>\n </div>\n <div class="form-errors" ng-if="popupForm.$submitted && popupForm.newNode.$error" ng-messages="popupForm.newNode.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n <div class="item item-toggle">\n <span class="input-label">\n {{\'SETTINGS.POPUP_PEER.USE_SSL\' | translate}}\n </span>\n <h4>\n <small class="gray" ng-bind-html="\'SETTINGS.POPUP_PEER.USE_SSL_HELP\' | translate">\n </small>\n </h4>\n <label class="toggle toggle-royal no-padding-right">\n <input type="checkbox" ng-model="popupData.useSsl">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n\n <a class="button button-positive button-clear positive button-outline button-full button-small-padding icon-left ink no-padding" ng-click="showNodeList()">\n <i class="icon ion-search"></i>\n {{\'SETTINGS.POPUP_PEER.BTN_SHOW_LIST\' | translate}}\n </a>\n </div>\n\n <button type="submit" class="hide"></button>\n</form>\n\n\n'),e.put("templates/settings/settings.html",'<ion-view left-buttons="leftButtons" cache-view="false" class="settings">\n <ion-nav-title translate>SETTINGS.TITLE</ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content>\n\n \x3c!-- Buttons bar--\x3e\n <div class="padding text-center hidden-xs hidden-sm">\n <button class="button button-raised button-stable ink" ng-click="reset()">\n <i class="icon ion-refresh"></i>\n {{\'SETTINGS.BTN_RESET\' | translate}}\n </button>\n\n \x3c!--button class="button button-stable button-small-padding icon ion-android-more-vertical"\n ng-click="showActionsPopover($event)"\n title="{{\'COMMON.BTN_OPTIONS\' | translate}}">\n </button--\x3e\n </div>\n\n <div class="row no-padding responsive-sm responsive-md responsive-lg">\n\n \x3c!-- first column --\x3e\n <div class="col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm" style="margin-bottom: 2px">\n\n <span class="item item-divider" translate>SETTINGS.DISPLAY_DIVIDER</span>\n\n <label class="item item-input item-select">\n <div class="input-label" translate>COMMON.LANGUAGE</div>\n <select ng-model="formData.locale" ng-change="changeLanguage(formData.locale.id)" ng-options="l as l.label for l in locales track by l.id">\n </select>\n </label>\n\n <div class="item item-toggle dark">\n <div class="input-label">\n {{\'COMMON.BTN_RELATIVE_UNIT\' | translate}}\n </div>\n <label class="toggle toggle-royal" id="helptip-settings-btn-unit-relative">\n <input type="checkbox" ng-model="formData.useRelative">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n \x3c!--div class="item item-toggle dark item-text-wrap">\n <div class="input-label" ng-bind-html="\'SETTINGS.ENABLE_HELPTIP\' | translate">\n </div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.helptip.enable" >\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div--\x3e\n\n \x3c!--div class="item item-toggle dark item-text-wrap">\n <div class="input-label" ng-bind-html="\'SETTINGS.ENABLE_UI_EFFECTS\' | translate">\n </div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.uiEffects" >\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div--\x3e\n\n <span class="item item-divider" translate>SETTINGS.STORAGE_DIVIDER</span>\n\n <div class="item item-text-wrap item-toggle dark">\n <div class="input-label">\n {{\'SETTINGS.USE_LOCAL_STORAGE\' | translate}}\n </div>\n <h4 class="gray" ng-bind-html="\'SETTINGS.USE_LOCAL_STORAGE_HELP\' | translate">\n </h4>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.useLocalStorage">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="common"></cs-extension-point>\n\n <span class="item item-divider">\n {{\'SETTINGS.AUTHENTICATION_SETTINGS\' | translate}}\n </span>\n\n <div class="item item-toggle item-text-wrap">\n <div class="input-label" ng-class="{\'gray\': !formData.useLocalStorage}">\n {{\'SETTINGS.REMEMBER_ME\' | translate}}\n </div>\n <h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.REMEMBER_ME_HELP\' | translate"></h4>\n\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.rememberMe" ng-disabled="!formData.useLocalStorage">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n \x3c!-- second column --\x3e\n <div class="col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm no-margin-xs no-margin-sm">\n\n \x3c!--span class="item item-divider">\n {{\'SETTINGS.WALLETS_SETTINGS\' | translate}}\n </span>\n\n <div class="item item-toggle item-text-wrap dark">\n <span class="input-label" ng-class="{\'gray\': !formData.useLocalStorage}" translate>SETTINGS.USE_WALLETS_ENCRYPTION</span>\n <h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.USE_WALLETS_ENCRYPTION_HELP\' | translate">\n </h4>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.useLocalStorageEncryption" ng-disabled="!formData.useLocalStorage">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n <span class="item item-divider" translate>SETTINGS.HISTORY_SETTINGS</span>\n\n <div class="item item-toggle item-text-wrap dark">\n <div class="input-label" translate>SETTINGS.DISPLAY_UD_HISTORY</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.showUDHistory" >\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n <div class="item item-toggle dark hidden-xs hidden-sm">\n <div class="input-label" translate>SETTINGS.TX_HISTORY_AUTO_REFRESH</div>\n <h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.TX_HISTORY_AUTO_REFRESH_HELP\' | translate"></h4>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.walletHistoryAutoRefresh" >\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div--\x3e\n\n \x3c!-- Allow extension here\n <cs-extension-point name="history"></cs-extension-point--\x3e\n\n <span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span>\n\n \x3c!-- Duniter node --\x3e\n <div class="item ink item-text-wrap item-icon-right hidden-xs hidden-sm" ng-click="changeNode()">\n <div class="input-label" translate>SETTINGS.PEER</div>\n\n \x3c!-- node temporary changed --\x3e\n <ng-if ng-if="formData.node.temporary">\n <h4 class="gray text-wrap assertive">\n <i class="icon ion-alert-circled"></i>\n <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span>\n </h4>\n <div class="item-note assertive text-italic">{{bma.server}}</div>\n </ng-if>\n\n <div class="badge badge-balanced" ng-if="!formData.node.temporary">{{bma.server}}</div>\n <i class="icon ion-ios-arrow-right"></i>\n </div>\n <ion-item class="ink item-icon-right visible-xs visible-sm" ng-click="changeNode()">\n <div class="input-label hidden-xs" translate>SETTINGS.PEER</div>\n <div class="input-label visible-xs" translate>SETTINGS.PEER_SHORT</div>\n\n \x3c!-- node temporary changed --\x3e\n <ng-if ng-if="formData.node.temporary">\n <h4 class="gray text-wrap assertive">\n <b class="ion-alert-circled"></b>\n <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span>\n </h4>\n <div class="badge badge-assertive">{{bma.server}}</div>\n </ng-if>\n <div class="badge badge-balanced" ng-if="!formData.node.temporary">{{bma.server}}</div>\n <i class="icon ion-ios-arrow-right"></i>\n </ion-item>\n\n \x3c!-- Expert mode ?--\x3e\n <div class="item item-text-wrap item-toggle dark hidden-xs hidden-sm">\n <div class="input-label" ng-bind-html="\'SETTINGS.EXPERT_MODE\' | translate"></div>\n <h4 class="gray" ng-bind-html="\'SETTINGS.EXPERT_MODE_HELP\' | translate"></h4>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.expertMode">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n \x3c!-- Block validity window\n <label class="item item-input item-select item-text-wrap">\n <div class="input-label hidden-xs">\n <span translate>SETTINGS.BLOCK_VALIDITY_WINDOW</span>\n <h4 class="gray text-wrap hidden-xs" ng-bind-html="\'SETTINGS.BLOCK_VALIDITY_WINDOW_HELP\' | translate"></h4>\n </div>\n <div class="input-label visible-xs" translate>SETTINGS.BLOCK_VALIDITY_WINDOW_SHORT</div>\n <select ng-model="formData.blockValidityWindow"\n ng-options="i as (blockValidityWindowLabels[i].labelKey | translate:blockValidityWindowLabels[i].labelParams ) for i in blockValidityWindows track by i">\n </select>\n </label>--\x3e\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="network"></cs-extension-point>\n\n <span class="item item-divider" ng-if="$root.config.plugins" translate>SETTINGS.PLUGINS_SETTINGS</span>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="plugins"></cs-extension-point>\n\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("templates/wallet/popover_actions.html",'<ion-popover-view class="fit has-header popover-wallet-actions">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n \x3c!-- identity --\x3e\n <a class="item item-icon-left ink" ng-if="walletData.requirements.needSelf" ng-click="self()">\n <i class="icon ion-flag"></i>\n {{\'ACCOUNT.BTN_SEND_IDENTITY_DOTS\' | translate}}\n </a>\n\n \x3c!-- membership in --\x3e\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="walletData.requirements.needMembership" ng-click="membershipIn()">\n <i class="icon ion-person"></i>\n {{\'ACCOUNT.BTN_MEMBERSHIP_IN_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink hidden-xs hidden-sm" ng-class="{\'gray\':!walletData.requirements.needMembership}" ng-click="membershipIn()">\n <i class="icon ion-person"></i>\n {{\'ACCOUNT.BTN_MEMBERSHIP_IN_DOTS\' | translate}}\n </a>\n\n \x3c!-- renew membership --\x3e\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="walletData.requirements.needRenew" ng-click="renewMembership()">\n <i class="icon ion-loop"></i>\n {{\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink hidden-xs hidden-sm" ng-class="{\'gray\':!walletData.requirements.needRenew}" ng-click="renewMembership()">\n <i class="icon ion-loop"></i>\n {{\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\' | translate}}\n </a>\n\n <a class="item item-icon-left assertive ink" ng-if="walletData.requirements.canMembershipOut" ng-click="membershipOut()">\n <i class="icon ion-log-out"></i>\n {{\'ACCOUNT.BTN_MEMBERSHIP_OUT_DOTS\' | translate}}\n </a>\n\n <a class="item item-icon-left ink" ng-click="showSecurityModal()">\n <i class="icon ion-android-lock"></i>\n <span ng-bind-html="\'ACCOUNT.BTN_SECURITY_DOTS\' | translate"></span>\n\n </a>\n\n <div class="item-divider hidden-sm hidden-xs"></div>\n\n \x3c!-- help tour --\x3e\n <a class="item item-icon-left ink hidden-sm hidden-xs" ng-click="startWalletTour()">\n <i class="icon ion-easel"></i>\n {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/wallet/popover_unit.html",'<ion-popover-view class="popover-unit">\n <ion-content scroll="false">\n <div class="list">\n <a class="item item-icon-left" ng-class="{ \'selected\': !formData.useRelative}" ng-click="closePopover(false)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': !formData.useRelative}"></i>\n <i ng-bind-html="$root.currency.name | currencySymbol:false"></i>\n </a>\n <a class="item item-icon-left" ng-class="{ \'selected\': formData.useRelative}" ng-click="closePopover(true)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': formData.useRelative}"></i>\n <i ng-bind-html="$root.currency.name | currencySymbol:true"></i>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/wallet/view_wallet.html",'<ion-view left-buttons="leftButtons" class="view-wallet" id="wallet">\n <ion-nav-title>\n \x3c!-- no title--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()">\n </button>\n\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n \x3c!--<button class="button button-icon button-clear visible-xs visible-sm"\n id="helptip-wallet-options-xs"\n ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i>\n </button>--\x3e\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:$root.settings.locale.id}">\n <div class="positive-900-bg hero" id="wallet-header" ng-class="{\'hero-qrcode-active\': toggleQRCode}">\n <div class="content" ng-if="!loading">\n <i class="avatar avatar-member" ng-if=":rebind:!formData.avatar"></i>\n <i class="avatar" ng-if=":rebind:formData.avatar" style="background-image: url({{:rebind:formData.avatar.src}})"></i>\n <ng-if ng-if=":rebind:formData.name">\n <h3 class="light">{{:rebind:formData.name}}</h3>\n </ng-if>\n \x3c!--ng-if ng-if=":rebind:!formData.name">\n <h3 class="light" ng-if=":rebind:formData.uid">{{:rebind:formData.uid}}</h3>\n <h3 class="light" ng-if=":rebind:!formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</h3>\n </ng-if--\x3e\n <cs-extension-point name="hero"></cs-extension-point>\n </div>\n <h4 class="content light" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n </div>\n\n \x3c!--div id="qrcode" class="qrcode visible-xs visible-sm spin"\n ng-class="{\'active\': toggleQRCode}"\n ng-click="toggleQRCode = !toggleQRCode"></div--\x3e\n\n \x3c!-- Buttons bar--\x3e\n <a id="wallet-share-anchor"></a>\n <div class="hidden-xs hidden-sm padding text-center" ng-if="!loading">\n\n <button class="button button-stable button-small-padding icon ion-android-share-alt ink" ng-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}">\n </button>\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <cs-extension-point name="buttons"></cs-extension-point>\n\n \n\n \x3c!--<button id="helptip-wallet-options"\n class="button button-stable icon-right ink"\n ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i> \n {{:locale:\'COMMON.BTN_OPTIONS\' | translate}}\n </button>--\x3e\n\n <div ng-if="formData.requirements.needRenew">\n <br>\n <button class="button button-raised button-stable ink" ng-click="renewMembership()">\n <span class="assertive">{{:locale:\'ACCOUNT.BTN_MEMBERSHIP_RENEW\' | translate}}</span>\n </button>\n </div>\n </div>\n\n <div class="visible-xs visible-sm padding text-center" ng-if="!loading">\n <button class="button button-assertive button-small-padding ink" ng-click="logout({askConfirm: true})">\n <i class="icon ion-log-out"></i>\n {{\'COMMON.BTN_LOGOUT\' | translate}}\n </button>\n </div>\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n\n <div class="list" ng-class="::motion.ionListClass" ng-hide="loading">\n\n <span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span>\n\n \x3c!-- Public key\n <span id="helptip-wallet-pubkey"\n class="item item-icon-left item-text-wrap ink"\n on-hold="copy(formData.pubkey)"\n copy-on-click="{{:rebind:formData.pubkey}}">\n <i class="icon ion-key"></i>\n {{:locale:\'COMMON.PUBKEY\'|translate}}\n <h4 id="pubkey" class="dark">{{:rebind:formData.pubkey}}</h4>\n </span> --\x3e\n\n \x3c!-- Uid + Registration date\n <ion-item class="item-icon-left" ng-if=":rebind:formData.sigDate||formData.uid">\n <i class="icon ion-calendar"></i>\n <span translate>COMMON.UID</span>\n <h5 class="dark" ng-if=":rebind:formData.sigDate">\n <span translate>WOT.REGISTERED_SINCE</span>\n {{:rebind:formData.sigDate | formatDate}}\n </h5>\n <span class="badge badge-stable">{{:rebind:formData.uid}}</span>\n </ion-item>--\x3e\n\n \x3c!-- Certifications\n <a id="helptip-wallet-certifications"\n class="item item-icon-left item-icon-right item-text-wrap ink"\n ng-if="formData.isMember||formData.requirements.pendingMembership"\n ng-click="showCertifications()">\n <i class="icon ion-ribbon-b"></i>\n <b ng-if="formData.requirements.isSentry" class="ion-star icon-secondary" style="color: yellow; font-size: 16px; left: 25px; top: -7px;"></b>\n {{:locale:\'ACCOUNT.CERTIFICATION_COUNT\'|translate}}\n <cs-badge-certification requirements="formData.requirements"\n parameters="{sigQty: formData.parameters.sigQty}">\n </cs-badge-certification>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a> --\x3e\n\n \x3c!-- Signature stock\n <a id="helptip-wallet-given-certifications"\n class="item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm"\n ng-if="formData.isMember"\n ng-click="showGivenCertifications()">\n <i class="icon ion-ribbon-a"></i>\n <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a> --\x3e\n\n \x3c!-- Events\n <span class="item item-divider" ng-if="formData.events.length">\n {{:locale:\'ACCOUNT.EVENTS\' | translate}}\n </span>\n\n <div\n class="item item-text-wrap item-icon-left item-wallet-event"\n ng-repeat="event in formData.events">\n <i class="icon"\n ng-class="{\'ion-information-circled royal\': event.type==\'info\',\'ion-alert-circled\': event.type==\'warn\'||event.type==\'error\',\'assertive\': event.type==\'error\',\'ion-clock\': event.type==\'pending\'}"></i>\n <span trust-as-html="event.message | translate:event.messageParams"></span>\n </div> --\x3e\n\n \x3c!-- Account transaction\n <a class="item item-icon-left item-icon-right ink"\n ng-if="!loading"\n ui-sref="app.view_wallet_tx">\n <i class="icon ion-card"></i>\n <span translate>WOT.ACCOUNT_OPERATIONS</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>--\x3e\n\n <cs-extension-point name="general"></cs-extension-point>\n\n <cs-extension-point name="after-general"></cs-extension-point>\n\n\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n </ion-content>\n\n</ion-view>\n'),e.put("templates/wot/identity.html",'<i ng-if="::!identity.avatar" class="item-image icon ion-person"></i>\n<i ng-if="::identity.avatar" class="item-image avatar" style="background-image: url({{::identity.avatar.src}})"></i>\n\n<h2>\n <span ng-bind-html="::identity.name"></span>\n</h2>\n\n\x3c!--<h4 class="gray"--\x3e\n \x3c!--ng-class="{\'pull-right\': !smallscreen}"--\x3e\n \x3c!--ng-if="::identity.sigDate">--\x3e\n \x3c!--<i class="ion-clock"></i>--\x3e\n \x3c!--{{::\'WOT.LOOKUP.REGISTERED\' | translate:identity}}--\x3e\n\x3c!--</h4>--\x3e\n<h4 class="gray" ng-class="{\'pull-right\': !smallscreen}" ng-if="identity.creationTime">\n <i class="ion-clock"></i>\n {{::\'WOT.LOOKUP.MEMBER_FROM\' | translate:{time: identity.creationTime} }}\n</h4>\n<h4 class="gray">\n <span class="positive" ng-if="::identity.city">\n <i class="ion-location"></i>\n {{::identity.city}} \n </span>\n</h4>\n<h4 ng-if="::identity.events||identity.tags">\n <span ng-repeat="event in ::identity.events" class="assertive">\n <i class="ion-alert-circled" ng-if="::!identity.valid"></i>\n <span ng-bind-html="::event.message|translate:event.messageParams"></span>\n </span>\n <span ng-if="::identity.tags" class="dark">\n <ng-repeat ng-repeat="tag in ::identity.tags">\n #<ng-bind-html ng-bind-html="::tag"></ng-bind-html>\n </ng-repeat>\n </span>\n</h4>\n'),e.put("templates/wot/lookup.html",'<ion-view>\n <ion-nav-title>\n {{\'WOT.LOOKUP.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n \x3c!--<button class="button button-icon button-clear icon ion-qr-scanner hidden-no-device"--\x3e\n \x3c!--ng-if="$root.device.barcode.enable"--\x3e\n \x3c!--ng-click="scanQrCode()">--\x3e\n \x3c!--</button>--\x3e\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n <ng-include src="\'templates/wot/lookup_form.html\'">\n </ion-content>\n</ion-view>\n'),e.put("templates/wot/lookup_form.html",'<div class="lookupForm">\n\n <div class="item no-padding">\n\n <div class="double-padding-x padding-top-xs item-text-wrap" ng-if="::allowMultiple" style="height: 36px">\n\n <div class="gray padding-top" ng-if="!selection.length && parameters.help">{{::parameters.help|translate}}</div>\n\n <div ng-repeat="identity in selection track by identity.id" class="button button-small button-text button-stable button-icon-event ink" ng-class="{\'button-text-positive\': identity.selected}">\n <span ng-bind-html="identity.name||identity.uid||(identity.pubkey|formatPubkey)"></span>\n <i class="icon ion-close" ng-click="removeSelection(identity, $event)"> </i>\n </div>\n\n </div>\n\n <div class="item-input">\n <i class="icon ion-search placeholder-icon"></i>\n\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'WOT.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n <input type="text" class="hidden-xs hidden-sm" id="{{wotSearchTextId}}" placeholder="{{\'WOT.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="helptip-wot-search-text"></a>\n </div>\n </div>\n </div>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px" ng-class="::{\'hidden-xs\': !showResultLabel}">\n <div class="pull-left" ng-if="!search.loading && showResultLabel">\n <h4 ng-if="search.type==\'newcomers\'" translate>\n WOT.LOOKUP.NEWCOMERS\n </h4>\n \x3c!--<h4--\x3e\n \x3c!--ng-if="search.type==\'pending\'" translate>--\x3e\n \x3c!--WOT.LOOKUP.PENDING--\x3e\n \x3c!--</h4>--\x3e\n <h4 ng-if="search.type==\'text\'" translate>\n COMMON.RESULTS_LIST\n </h4>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.type==\'newcomers\'}" ng-click="doGetNewcomers()">\n <i class="icon ion-person-stalker"></i>\n {{\'WOT.LOOKUP.BTN_NEWCOMERS\' | translate}}\n </a>\n \n \x3c!--<a ng-if="enableFilter"--\x3e\n \x3c!--class="button button-text button-small"--\x3e\n \x3c!--ng-class="{\'button-text-positive\': search.type==\'pending\'}"--\x3e\n \x3c!--ng-click="doGetPending()" class="badge-balanced">--\x3e\n \x3c!--<i class="icon ion-clock"></i>--\x3e\n \x3c!--{{\'WOT.LOOKUP.BTN_PENDING\' | translate}}--\x3e\n \x3c!--</a>--\x3e\n \n <button class="button button-small button-stable ink" ng-click="doSearch()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n\n <button class="button button-small button-positive {{parameters.okType}} ink" ng-if="::allowMultiple" ng-disabled="!selection.length" ng-click="next()">\n {{parameters.okText||\'COMMON.BTN_NEXT\' | translate}}\n </button>\n </div>\n </div>\n\n <div class="text-center" ng-if="search.loading">\n <p class="gray" ng-if="::$root.currency.initPhase" translate>WOT.SEARCH_INIT_PHASE_WARNING</p>\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <ng-if ng-if="!search.loading">\n <div class="assertive padding" ng-if="!search.results.length">\n <span ng-if="search.type==\'text\'" translate>COMMON.SEARCH_NO_RESULT</span>\n <span ng-if="search.type==\'newcomers\'" translate>WOT.LOOKUP.NO_NEWCOMERS</span>\n </div>\n\n \x3c!-- simple selection + device --\x3e\n \n\n \x3c!-- simple selection + no device --\x3e\n \x3c!--removeIf(device)--\x3e\n <div ng-if="!allowMultiple" class="list {{::motion.ionListClass}}">\n\n <div ng-repeat="identity in search.results" id="helptip-wot-search-result-{{$index}}" class="item item-border-large item-avatar item-icon-right ink" ng-click="::select(identity)">\n\n <ng-include src="\'templates/wot/identity.html\'"></ng-include>\n\n <i class="icon ion-ios-arrow-right"></i>\n </div>\n </div>\n \x3c!--endRemoveIf(device)--\x3e\n\n \x3c!-- multi selection --\x3e\n <div ng-if="::allowMultiple" class="list {{::motion.ionListClass}}">\n\n <ion-checkbox ng-repeat="identity in search.results" ng-model="identity.checked" class="item item-border-large item-avatar ink" ng-click="toggleCheck($index, $event)">\n <ng-include src="\'templates/wot/identity.html\'"></ng-include>\n </ion-checkbox>\n </div>\n\n <ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="2%">\n </ion-infinite-scroll>\n\n </ng-if>\n</div>\n'),e.put("templates/wot/lookup_popover_actions.html",'<ion-popover-view class="fit has-header visible-sm visible-xs">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink" ng-click="doGetNewcomers()">\n <i class="icon ion-person"></i>\n {{\'WOT.LOOKUP.BTN_NEWCOMERS\' | translate}}\n </a>\n\n <a class="item item-icon-left ink" ng-click="doGetPending()">\n <i class="icon ion-clock"></i>\n {{\'WOT.LOOKUP.BTN_PENDING\' | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("templates/wot/modal_lookup.html",'<ion-modal-view id="wotLookup" class="modal-full-height">\n\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate="">COMMON.BTN_CANCEL</button>\n\n <h1 class="title hidden-xs">\n {{::parameters.title?parameters.title:\'WOT.MODAL.TITLE\'|translate}}\n </h1>\n\n <button class="button button-clear icon-right visible-xs ink" ng-if="allowMultiple && selection.length" ng-click="closeModal(selection)">\n {{::parameters.okText||\'COMMON.BTN_NEXT\' | translate}}\n <i ng-if="::!parameters.okText||parameters.okIcon" class="icon {{::parameters.okIcon||\'ion-ios-arrow-right\'}}"></i>\n </button>\n </ion-header-bar>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <div class="visible-xs visible-sm text-right stable-bg stable">\n \n <button class="button button-icon button-small-padding dark ink" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </div>\n\n <ng-include src="\'templates/wot/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-modal-view>\n'),
|
||
e.put("templates/wot/view_identity.html",'<ion-view left-buttons="leftButtons" class="view-identity">\n <ion-nav-title>\n </ion-nav-title>\n\n <ion-content scroll="true">\n\n <div class="hero dark-bg" ng-class="{\'positive-900-bg\': !loading && formData.isMember}">\n <div class="content" ng-if="!loading">\n <i class="avatar" ng-if="::!formData.avatar" ng-class="{\'avatar-wallet\': !formData.isMember, \'avatar-member\': formData.isMember}"></i>\n <i class="avatar" ng-if="::formData.avatar" style="background-image: url({{::formData.avatar.src}})"></i>\n <ng-if ng-if="::formData.name" title="{{::formData.name}}">\n <h3 class="light">{{::formData.name|truncText: 30}}</h3>\n </ng-if>\n <ng-if ng-if="::!formData.name">\n <h3 class="light" ng-if="::formData.uid">{{::formData.uid}}</h3>\n <h3 class="light" ng-if="::!formData.uid"><i class="ion-key"></i> {{::formData.pubkey | formatPubkey}}</h3>\n </ng-if>\n \x3c!--<h4 class="assertive">\n <ng-if ng-if="::(formData.name || formData.uid) && !formData.isMember && !revoked" translate>WOT.NOT_MEMBER_PARENTHESIS</ng-if>\n <ng-if ng-if="::(formData.name || formData.uid) && !formData.isMember && revoked" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</ng-if>\n <ng-if ng-if="::(formData.name || formData.uid) && formData.isMember && revoked" translate>WOT.MEMBER_PENDING_REVOCATION_PARENTHESIS</ng-if>\n </h4--\x3e\n <cs-extension-point name="hero"></cs-extension-point>\n </div>\n <h4 class="content light" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n\n\n </div>\n\n \x3c!-- button bar--\x3e\n <a id="wot-share-anchor-{{::formData.pubkey}}"></a>\n <div class="hidden-xs hidden-sm padding text-center">\n <button class="button button-stable button-small-padding icon ion-android-share-alt ink" ng-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}">\n </button>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="buttons"></cs-extension-point>\n\n \x3c!-- <button class="button button-stable button-small-padding icon ion-ribbon-b ink"\n ng-click="certify()"\n ng-if=":rebind:formData.hasSelf"\n title="{{\'WOT.BTN_CERTIFY\' | translate}}"\n ng-disabled="disableCertifyButton">\n </button>--\x3e\n\n \x3c!--<button class="button button-calm ink"\n ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})">\n {{\'COMMON.BTN_SEND_MONEY\' | translate}}\n </button>--\x3e\n </div>\n\n <div class="row no-padding">\n\n <div class="visible-xs visible-sm">\n \x3c!--<button id="fab-certify-{{:rebind:formData.uid}}" style="top: 170px;"\n class="button button-fab button-fab-top-left button-fab-hero button-calm spin"\n ng-if=":rebind:(canCertify && !alreadyCertified)"\n ng-click="certify()">\n <i class="icon ion-ribbon-b"></i>\n </button>--\x3e\n\n <cs-extension-point name="buttons-top-fab"></cs-extension-point>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col list" ng-class="::motion.ionListClass" bind-notifier="{ rebind:loading}">\n\n <span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span>\n\n \x3c!-- Pubkey\n <ion-item class="item-icon-left item-text-wrap ink"\n copy-on-click="{{:rebind:formData.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>COMMON.PUBKEY</span>\n <h4 id="pubkey" class="dark text-left">{{:rebind:formData.pubkey}}</h4>\n </ion-item>--\x3e\n\n \x3c!--<div class="item item-icon-left item-text-wrap"\n ng-if=":rebind:!formData.hasSelf">\n <i class="icon ion-ios-help-outline positive"></i>\n <span translate>WOT.NOT_MEMBER_ACCOUNT</span>\n <h4 class="gray" translate>WOT.NOT_MEMBER_ACCOUNT_HELP</h4>\n </div>--\x3e\n\n \x3c!-- Uid + Registration date\n <ion-item class="item-icon-left" ng-if=":rebind:formData.sigDate||formData.uid">\n <i class="icon ion-calendar"></i>\n <span translate>COMMON.UID</span>\n <h5 class="dark" ng-if=":rebind:formData.sigDate">\n <span translate>WOT.REGISTERED_SINCE</span>\n {{:rebind:formData.sigDate | formatDate}}\n </h5>\n <span class="badge badge-stable">{{:rebind:formData.uid}}</span>\n </ion-item>--\x3e\n\n \x3c!-- Received certifications count\n <a id="helptip-wot-view-certifications"\n class="item item-icon-left item-text-wrap item-icon-right ink"\n ng-if=":rebind:formData.hasSelf"\n ng-click="showCertifications()">\n <i class="icon ion-ribbon-b"></i>\n <b ng-if=":rebind:formData.requirements.isSentry" class="ion-star icon-secondary" style="color: yellow; font-size: 16px; left: 25px; top: -7px;"></b>\n <span translate>ACCOUNT.CERTIFICATION_COUNT</span>\n <cs-badge-certification cs-id="helptip-wot-view-certifications-count"\n requirements="formData.requirements"\n parameters="{sigQty: formData.sigQty}">\n </cs-badge-certification>\n\n <i class="gray icon ion-ios-arrow-right"></i>\n </a> --\x3e\n\n \x3c!-- Signature stock\n <a class="item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm"\n ng-if=":rebind:formData.hasSelf && formData.isMember"\n ng-click="showGivenCertifications()">\n <i class="icon ion-ribbon-a"></i>\n <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span>\n <cs-badge-given-certification identity="formData"\n parameters="{sigStock: formData.sigStock}">\n </cs-badge-given-certification>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>--\x3e\n\n \x3c!-- Account transaction\n <a class="item item-icon-left item-icon-right ink"\n ng-if="!loading"\n ui-sref="app.wot_identity_tx_uid({uid:formData.uid,pubkey:formData.pubkey})">\n <i class="icon ion-card"></i>\n <span translate>WOT.ACCOUNT_OPERATIONS</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>--\x3e\n\n <div class="item item-text-wrap item-icon-left item-wallet-event assertive" ng-repeat="event in :rebind:formData.events | filter: {type: \'error\'}">\n <i class="icon ion-alert-circled"></i>\n <span trust-as-html="event.message | translate:event.messageParams"></span>\n </div>\n\n <cs-extension-point name="general"></cs-extension-point>\n\n <cs-extension-point name="after-general"></cs-extension-point>\n\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n </div>\n\n </ion-content>\n\n \x3c!-- fab button\n <div class="visible-xs visible-sm" ng-hide="loading">\n <button id="fab-transfer" class="button button-fab button-fab-bottom-right button-assertive drop"\n ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.uid})">\n <i class="icon ion-android-send"></i>\n </button>\n </div>--\x3e\n</ion-view>\n'),e.put("templates/wot/view_identity_tx.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs visible-sm">{{::formData.name||formData.uid}}</span>\n <span class="hidden-xs hidden-sm" ng-if="!loading" translate="WOT.OPERATIONS.TITLE" translate-values="{uid: formData.name || formData.uid}"></span>\n </ion-nav-title>\n\n <ion-content>\n\n <div class="hidden-xs hidden-sm padding text-center" ng-if="!loading">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <button class="button button-stable button-small-padding icon ion-android-download ink" ng-click="downloadHistoryFile()" title="{{\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\' | translate}}">\n </button>\n\n <cs-extension-point name="buttons"></cs-extension-point>\n\n </div>\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list {{motion.ionListClass}}" ng-if="!loading">\n\n <div class="row">\n\n <div class="col col-15 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n\n \x3c!-- the balance --\x3e\n <div class="item item-divider item-tx">\n {{\'ACCOUNT.BALANCE_ACCOUNT\'|translate}}\n <div class="badge badge-balanced">\n {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n </div>\n </div>\n\n <span class="item item-divider" ng-if="!loading">\n {{:locale:\'ACCOUNT.LAST_TX\'|translate}}\n <a id="helptip-wallet-tx" style="position: relative; bottom: 0; right: 0px"> </a>\n </span>\n\n \x3c!-- iterate on each TX --\x3e\n <div class="item item-tx item-icon-left" ng-repeat="tx in history" ng-include="\'templates/wallet/item_tx.html\'">\n </div>\n\n <div class="item item-text-wrap text-center" ng-if="tx.fromTime > 0">\n <p>\n <a ng-click="showMoreTx()">{{:locale:\'ACCOUNT.SHOW_MORE_TX\'|translate}}</a>\n <span class="gray" translate="ACCOUNT.TX_FROM_DATE" translate-values="{fromTime: tx.fromTime}"></span>\n <span class="gray">|</span>\n <a ng-click="showMoreTx(-1)" translate>ACCOUNT.SHOW_ALL_TX</a>\n </p>\n </div>\n </div>\n\n <div class="col col-15 hidden-xs hidden-sm"> </div>\n\n </div>\n </div>\n </ion-content>\n</ion-view>\n')}]),angular.module("cesium.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Public key",MEMBER:"Member",BLOCK:"Block",BTN_OK:"OK",BTN_YES:"Yes",BTN_NO:"No",BTN_SEND:"Send",BTN_SEND_MONEY:"Transfer money",BTN_SEND_MONEY_SHORT:"Transfer",BTN_SAVE:"Save",BTN_YES_SAVE:"Yes, Save",BTN_YES_CONTINUE:"Yes, Continue",BTN_SHOW:"Show",BTN_SHOW_PUBKEY:"Show key",BTN_RELATIVE_UNIT:"Display amounts in UD?",BTN_BACK:"Back",BTN_NEXT:"Next",BTN_IMPORT:"Import",BTN_CANCEL:"Cancel",BTN_CLOSE:"Close",BTN_LATER:"Later",BTN_LOGIN:"Sign In",BTN_LOGOUT:"Logout",BTN_ADD_ACCOUNT:"New Account",BTN_SHARE:"Share",BTN_EDIT:"Edit",BTN_DELETE:"Delete",BTN_ADD:"Add",BTN_SEARCH:"Search",BTN_REFRESH:"Refresh",BTN_RETRY:"Retry",BTN_START:"Start",BTN_CONTINUE:"Continue",BTN_CREATE:"Create",BTN_UNDERSTOOD:"I understand",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Features tour",BTN_HELP_TOUR_SCREEN:"Discover this screen",BTN_DOWNLOAD:"Download",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Download account statement",BTN_MODIFY:"Modify",CHOOSE_FILE:"Drag your file<br/>or click to select",DAYS:"days",NO_ACCOUNT_QUESTION:"Not a member yet? Register now!",SEARCH_NO_RESULT:"No result found",LOADING:"Loading...",LOADING_WAIT:"Loading...<br/><small>(Waiting for node availability)</small>",SEARCHING:"Searching...",FROM:"From",TO:"To",COPY:"Copy",LANGUAGE:"Language",UNIVERSAL_DIVIDEND:"Universal dividend",UD:"UD",DATE_PATTERN:"DD/MM/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(empty)",UID:"Pseudonym",ENABLE:"Enabled",DISABLE:"Disabled",RESULTS_LIST:"Results:",RESULTS_COUNT:"{{count}} results",EXECUTION_TIME:"executed in {{duration|formatDurationMs}}",SHOW_VALUES:"Display values openly?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filters",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit at {{limit}})",POPOVER_SHARE:{TITLE:"Share",SHARE_ON_TWITTER:"Share on Twitter",SHARE_ON_FACEBOOK:"Share on Facebook",SHARE_ON_DIASPORA:"Share on Diaspora*",SHARE_ON_GOOGLEPLUS:"Share on Google+"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choose source:",BTN_PICTURE_GALLERY:"Gallery",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Home",WOT:"Registry",CURRENCY:"Currency",ACCOUNT:"My Account",WALLETS:"My wallets",TRANSFER:"Transfer",SCAN:"Scan",SETTINGS:"Settings",NETWORK:"Network",TRANSACTIONS:"My transactions"},ABOUT:{TITLE:"About",LICENSE:"<b>Free/libre software</b> (License GNU AGPLv3).",LATEST_RELEASE:"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)",CODE:"Source code:",OFFICIAL_WEB_SITE:"Official web site:",DEVELOPERS:"Developers:",FORUM:"Forum:",DEV_WARNING:"Warning",DEV_WARNING_MESSAGE:"This application is still in active development.<br/>Please report any issue to us!",DEV_WARNING_MESSAGE_SHORT:"This App is still unstable (still under development).",REPORT_ISSUE:"Report an issue"},HOME:{TITLE:"Cesium",MESSAGE:"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!",MESSAGE_CURRENCY:"Make exchanges in the libre currency {{currency|abbreviate}}!",BTN_CURRENCY:"Explore currency",BTN_ABOUT:"about",BTN_HELP:"Help",REPORT_ISSUE:"Report an issue",NOT_YOUR_ACCOUNT_QUESTION:'You do not own the account <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Disconnect this account",CONNECTION_ERROR:'Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class="positive" ng-click="doQuickFix(\'settings\')">in the settings</a>.'},SETTINGS:{TITLE:"Settings",DISPLAY_DIVIDER:"Display",STORAGE_DIVIDER:"Storage",NETWORK_SETTINGS:"Network",PEER:"Duniter peer address",PEER_SHORT:"Peer address",PEER_CHANGED_TEMPORARY:"Address used temporarily",USE_LOCAL_STORAGE:"Enable local storage",USE_LOCAL_STORAGE_HELP:"Allows you to save your settings",WALLETS_SETTINGS:"My wallets",USE_WALLETS_ENCRYPTION:"Secure the list",USE_WALLETS_ENCRYPTION_HELP:"Enables you to encrypt the list of your wallets. Authentication required to access it.",ENABLE_HELPTIP:"Enable contextual help tips",ENABLE_UI_EFFECTS:"Enable visual effects",HISTORY_SETTINGS:"Account operations",DISPLAY_UD_HISTORY:"Display produced dividends?",TX_HISTORY_AUTO_REFRESH:"Enable automatic refresh?",TX_HISTORY_AUTO_REFRESH_HELP:"Updates the list of operations to each new block.",AUTHENTICATION_SETTINGS:"Authentication",KEEP_AUTH:"Expiration of authentication",KEEP_AUTH_SHORT:"Expiration",KEEP_AUTH_HELP:"Define when authentication is cleared from memory.",KEEP_AUTH_OPTION:{NEVER:"After each operation",SECONDS:"After {{value}}s of inactivity",MINUTE:"After {{value}}min of inactivity",MINUTES:"After {{value}}min of inactivity",HOUR:"After {{value}}h of inactivity",ALWAYS:"At the end of the session"},KEYRING_FILE:"Keyring file",KEYRING_FILE_HELP:'Allow auto-connect at startup, or to authenticate (only if "Expiration of authentication" is "at the end of the session"',REMEMBER_ME:"Remember me ?",REMEMBER_ME_HELP:"Allows to remain identified from one session to another, keeping the public key locally.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restore default values",EXPERT_MODE:"Enable expert mode",EXPERT_MODE_HELP:"Allow to see more details",BLOCK_VALIDITY_WINDOW:"Block uncertainty time",BLOCK_VALIDITY_WINDOW_SHORT:"Time of uncertainty",BLOCK_VALIDITY_WINDOW_HELP:"Time to wait before considering an information is validated",BLOCK_VALIDITY_OPTION:{NONE:"No delay",N:"{{time | formatDuration}} ({{count}} blocks)"},POPUP_PEER:{TITLE:"Duniter peer",HOST:"Address",HOST_HELP:"Address: server:port",USE_SSL:"Secured?",USE_SSL_HELP:"(SSL Encryption)",BTN_SHOW_LIST:"Peer's list"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Block #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Current block",TITLE:"Block #{{number|formatInteger}}",COMPUTED_BY:"Computed by",SHOW_RAW:"Show raw data",TECHNICAL_DIVIDER:"Technical informations",VERSION:"Format version",HASH:"Computed hash",UNIVERSAL_DIVIDEND_HELP:"Money co-produced by each of the {{membersCount}} members",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Minimal difficulty",POW_MIN_HELP:"Difficulty imposed in calculating hash",DATA_DIVIDER:"Data",IDENTITIES_COUNT:"New identities",JOINERS_COUNT:"Joiners",ACTIVES_COUNT:"Renewals",ACTIVES_COUNT_HELP:"Members having renewed their membership",LEAVERS_COUNT:"Leavers",LEAVERS_COUNT_HELP:"Members that now refused certification",EXCLUDED_COUNT:"Excluded members",EXCLUDED_COUNT_HELP:"Old members, excluded because missing membreship renewal or certifications",REVOKED_COUNT:"Revoked identities",REVOKED_COUNT_HELP:"These accounts may no longer be member",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Change",TX_OUTPUT_UNLOCK_CONDITIONS:"Unlock conditions",TX_OUTPUT_OPERATOR:{AND:"and",OR:"or"},TX_OUTPUT_FUNCTION:{SIG:"<b>Sign</b> of the public key",XHX:"<b>Password</b>, including SHA256 =",CSV:"Blocked during",CLTV:"Bloqué until"}},LOOKUP:{TITLE:"Blocks",NO_BLOCK:"No bloc",LAST_BLOCKS:"Last blocks:",BTN_COMPACT:"Compact"}},CURRENCY:{VIEW:{TITLE:"Currency",TAB_CURRENCY:"Currency",TAB_WOT:"Web of trust",TAB_NETWORK:"Network",TAB_BLOCKS:"Blocks",CURRENCY_SHORT_DESCRIPTION:"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.",NETWORK_RULES_DIVIDER:"Network rules",CURRENCY_NAME:"Currency name",MEMBERS:"Members count",MEMBERS_VARIATION:"Variation since {{duration|formatDuration}} (since last UD)",MONEY_DIVIDER:"Money",MASS:"Monetary mass",SHARE:"Money share",UD:"Universal Dividend",C_ACTUAL:"Current growth",MEDIAN_TIME:"Current blockchain time",POW_MIN:"Common difficulty",MONEY_RULES_DIVIDER:"Rules of currency",C_RULE:"Theoretical growth target",UD_RULE:"Universal dividend (formula)",DT_REEVAL:"Period between two re-evaluation of the UD",REEVAL_SYMBOL:"reeval",DT_REEVAL_VALUE:"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date of first reevaluation of the UD",SIG_QTY_RULE:"Required number of certifications to become a member",SIG_STOCK:"Maximum number of certifications sent by a member",SIG_PERIOD:"Minimum delay between 2 certifications sent by one and the same issuer.",SIG_WINDOW:"Maximum delay before a certification will be treated",SIG_VALIDITY:"Lifetime of a certification that has been treated",MS_WINDOW:"Maximum delay before a pending membership will be treated",MS_VALIDITY:"Lifetime of a membership that has been treated",STEP_MAX:"Maximum distance between a newcomer and each referring members.",WOT_RULES_DIVIDER:"Rules for web of trust",SENTRIES:"Required number of certifications (given <b>and</b> received) to become a referring member",SENTRIES_FORMULA:"Required number of certifications to become a referring member (formula)",XPERCENT:"Minimum percent of referring member to reach to match the distance rule",AVG_GEN_TIME:"The average time between 2 blocks",CURRENT:"current",MATH_CEILING:"CEILING",DISPLAY_ALL_RULES:"Display all rules?",BTN_SHOW_LICENSE:"Show license",WOT_DIVIDER:"Web of trust"},LICENSE:{TITLE:"Currency license",BTN_DOWNLOAD:"Download file",NO_LICENSE_FILE:"License file not found."}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain time",LOADING_PEERS:"Loading peers...",NODE_ADDRESS:"Address:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Pre-release (latest stable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> available",WS2PID:"Identifier:",PRIVATE_ACCESS:"Private access",POW_PREFIX:"Proof of work prefix:",ENDPOINTS:{BMAS:"Secure endpoint (SSL)",BMATOR:"TOR endpoint",WS2P:"WS2P endpoint",ES_USER_API:"Cesium+ data node"}},INFO:{ONLY_SSL_PEERS:"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode."}},PEER:{PEERS:"Peers",SIGNED_ON_BLOCK:"Signed on block",MIRROR:"mirror",MIRRORS:"Mirrors",MIRROR_PEERS:"Mirror peers",PEER_LIST:"Peer's list",MEMBERS:"Members",MEMBER_PEERS:"Member peers",ALL_PEERS:"All peers",DIFFICULTY:"Difficulty",API:"API",CURRENT_BLOCK:"Block #",POPOVER_FILTER_TITLE:"Filter",OFFLINE:"Offline",OFFLINE_PEERS:"Offline peers",BTN_SHOW_PEER:"Show peer",VIEW:{TITLE:"Peer",OWNER:"Owned by ",SHOW_RAW_PEERING:"See peering document",SHOW_RAW_CURRENT_BLOCK:"See current block (raw format)",LAST_BLOCKS:"Last blocks",KNOWN_PEERS:"Known peers :",GENERAL_DIVIDER:"General information",ERROR:{LOADING_TOR_NODE_ERROR:"Could not get peer data, using the TOR network.",LOADING_NODE_ERROR:"Could not get peer data"}}},WOT:{SEARCH_HELP:"Search (member or public key)",SEARCH_INIT_PHASE_WARNING:"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...",REGISTERED_SINCE:"Registered on",REGISTERED_SINCE_BLOCK:"Registered since block #",NO_CERTIFICATION:"No validated certification",NO_GIVEN_CERTIFICATION:"No given certification",NOT_MEMBER_PARENTHESIS:"(non-member)",IDENTITY_REVOKED_PARENTHESIS:"(identity revoked)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(being revoked)",EXPIRE_IN:"Expires",NOT_WRITTEN_EXPIRE_IN:"Deadline<br/>treatment",EXPIRED:"Expired",PSEUDO:"Pseudonym",SIGNED_ON_BLOCK:"Emitted on block #{{block}}",WRITTEN_ON_BLOCK:"Written on block #{{block}}",GENERAL_DIVIDER:"General information",NOT_MEMBER_ACCOUNT:"Non-member account",NOT_MEMBER_ACCOUNT_HELP:"This is a simple wallet, with no pending membership application.",TECHNICAL_DIVIDER:"Technical data",BTN_CERTIFY:"Certify",BTN_YES_CERTIFY:"Yes, certify",BTN_SELECT_AND_CERTIFY:"New certification",ACCOUNT_OPERATIONS:"Account operations",VIEW:{POPOVER_SHARE_TITLE:"Identity {{title}}"},LOOKUP:{TITLE:"Registry",NEWCOMERS:"New members:",NEWCOMERS_COUNT:"{{count}} members",PENDING:"Pending registrations:",PENDING_COUNT:"{{count}} pending registrations",REGISTERED:"Registered {{time | formatFromNow}}",MEMBER_FROM:"Member since {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Latest members",BTN_PENDING:"Pending registrations",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",NO_PENDING:"No pending registrations.",NO_NEWCOMERS:"No members."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Search"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Received certifications",LIST:"Details of received certifications",PENDING_LIST:"Pending certifications",RECEIVED:"Received certifications",RECEIVED_BY:"Certifications received by {{uid}}",ERROR:"Received certifications in error",SENTRY_MEMBER:"Referring member"},OPERATIONS:{TITLE:"{{uid}} - Operations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications sent",SUMMARY:"Sent certifications",LIST:"Details of sent certifications",PENDING_LIST:"Pending certifications",SENT:"Sent certifications",SENT_BY:"Certifications sent by {{uid}}",ERROR:"Sent certifications with error"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Login',SCRYPT_FORM_HELP:"Please enter your credentials. <br> Remember to check the public key for your account.",PUBKEY_FORM_HELP:"Please enter a public account key:",FILE_FORM_HELP:"Choose the keychain file to use:",SCAN_FORM_HELP:"Scan the QR code of a wallet.",SALT:"Identifier",SALT_HELP:"Identifier",SHOW_SALT:"Display identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Don't have an account yet?",HAVE_ACCOUNT_QUESTION:"Already have an account ?",CREATE_ACCOUNT:"Create an account",CREATE_FREE_ACCOUNT:"Create a free account",FORGOTTEN_ID:"Forgot password?",ASSOCIATED_PUBKEY:"Public key :",BTN_METHODS:"Other methods",BTN_METHODS_DOTS:"Change method...",METHOD_POPOVER_TITLE:"Methods",MEMORIZE_AUTH_FILE:"Memorize this keychain during the navigation session",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.',BTN_RELOGIN:"Sign In",IDLE_WARNING:"You will be logout... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Secret and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key only",SCAN:"Scan a QR code"},SCRYPT:{SIMPLE:"Light salt",DEFAULT:"Standard salt",SECURE:"Secure salt",HARDEST:"Hardest salt",EXTREME:"Extreme salt",USER:"Personal value",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating...",HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Authentification',METHOD_LABEL:"Méthode d'authentification",BTN_AUTH:"S'authentifier",SCRYPT_FORM_HELP:"Veuillez vous authentifier :",ERROR:{SCRYPT_DEFAULT:"Sallage simple (par défaut)",SCRYPT_ADVANCED:"Sallage avancé",FILE:"Fichier de trousseau"}},ACCOUNT:{TITLE:"My Account",BALANCE:"Balance",LAST_TX:"Latest validated transactions",BALANCE_ACCOUNT:"Account balance",NO_TX:"No transaction",SHOW_MORE_TX:"Show more",SHOW_ALL_TX:"Show all",TX_FROM_DATE:"(current limit to {{fromTime|medianFromNowShort}})",PENDING_TX:"Pending transactions",VALIDATING_TX:"Transactions being validated",ERROR_TX:"Transaction not executed",ERROR_TX_SENT:"Sent transactions",PENDING_TX_RECEIVED:"Transactions awaiting receipt",EVENTS:"Events",OUT_DISTANCED:"Your current certifications come from a group too isolated from the <a ng-click=\"showHelpModal('wot')\"> Web of Trust</a> (WoT): the <a ng-click=\"showHelpModal('distance_rule')\">maximum distance rule</a> is violated.<br/>You must obtain certifications from another area of the Web of Trust, or wait for it to tighten.",WAITING_MEMBERSHIP:"Membership application sent. Waiting validation.",WAITING_CERTIFICATIONS:"You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.",WAITING_CERTIFICATIONS_HELP:'To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click="showLicenseModal()">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click="openLink($event, $root.settings.userForumUrl)">the user forum</a>.',WILL_MISSING_CERTIFICATIONS:"You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)",WILL_NEED_RENEW_MEMBERSHIP:"Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a> before then.",NEED_RENEW_MEMBERSHIP:"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED:"You are no longer a member because your membership <b>has been canceled</b> for lack of certifications. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",NO_WAITING_MEMBERSHIP:"No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\"doQuickFix('membership')\">send the membership application</a>.",CERTIFICATION_COUNT:"Received certifications",CERTIFICATION_COUNT_SHORT:"Certifications",SIG_STOCK:"Stock of certifications to give",BTN_RECEIVE_MONEY:"Receive",BTN_SELECT_ALTERNATIVES_IDENTITIES:"Switch to another identity...",BTN_FIX_MEMBERSHIP:"Resubmit membership request...",BTN_MEMBERSHIP_RENEW:"Renew membership",BTN_MEMBERSHIP_RENEW_DOTS:"Renew membership...",BTN_MEMBERSHIP_OUT_DOTS:"Revoke membership...",BTN_SECURITY_DOTS:"Sign-in and security...",BTN_SHOW_DETAILS:"Display technical data",LOCKED_OUTPUTS_POPOVER:{TITLE:"Locked amount",DESCRIPTION:"Here are the conditions for unlocking this amount:",DESCRIPTION_MANY:"This transaction consists of several parts, of which the unlock conditions are:",LOCKED_AMOUNT:"Conditions for the amount:"},NEW:{TITLE:"Registration",INTRO_WARNING_TIME:"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).",INTRO_WARNING_SECURITY:"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.",INTRO_WARNING_SECURITY_HELP:"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...",INTRO_HELP:"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.",REGISTRATION_NODE:"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.",REGISTRATION_NODE_HELP:"If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.",SELECT_ACCOUNT_TYPE:"Choose the type of account to create:",MEMBER_ACCOUNT:"Member account",MEMBER_ACCOUNT_TITLE:"Create a member account",MEMBER_ACCOUNT_HELP:"If you are not yet registered as an individual (one account possible per individual).",WALLET_ACCOUNT:"Simple wallet",WALLET_ACCOUNT_TITLE:"Create a wallet",WALLET_ACCOUNT_HELP:"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.",SALT_WARNING:"Choose a identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!",PASSWORD_WARNING:"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!",PSEUDO_WARNING:"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>",PSEUDO:"Pseudonym",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Confirm",SALT_CONFIRM_HELP:"Confirm the identifier",PASSWORD_CONFIRM:"Confirm",PASSWORD_CONFIRM_HELP:"Confirm the password",SLIDE_6_TITLE:"Confirmation:",COMPUTING_PUBKEY:"Computing...",LAST_SLIDE_CONGRATULATION:"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Warning:</b> your identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?',CHECKING_PSEUDO:"Checking...",PSEUDO_AVAILABLE:"This pseudonym is available",PSEUDO_NOT_AVAILABLE:"This pseudonym is not available",INFO_LICENSE:"To be able to adhere to the currency, we ask you to kindly read and accept this license.",BTN_ACCEPT:"I accept",BTN_ACCEPT_LICENSE:"I accept the license"},POPUP_REGISTER:{TITLE:"Enter a pseudonym",HELP:"A pseudonym is needed to let other members find you."},SECURITY:{ADD_QUESTION:"Add custom question",BTN_CLEAN:"Clean",BTN_RESET:"Reset",DOWNLOAD_REVOKE:"Save a revocation file",DOWNLOAD_REVOKE_HELP:"Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.",GENERATE_KEYFILE:"Generate my keychain file ...",GENERATE_KEYFILE_HELP:"Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!",KEYFILE_FILENAME:"keychain-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey",MEMBERSHIP_IN:"Register as member...",MEMBERSHIP_IN_HELP:"Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.",SEND_IDENTITY:"Publish identity...",SEND_IDENTITY_HELP:"Allows you to associate a pseudonym to this account, but <b>without applying for membership</b> to become a member. This is not very useful because the validity of this pseudonym association is limited in time.",HELP_LEVEL:"Choose <strong> at least {{nb}} questions </strong> :",LEVEL:"Security level",LOW_LEVEL:'Low <span class="hidden-xs">(2 questions minimum)</span>',MEDIUM_LEVEL:'Medium <span class="hidden-xs">(4 questions minimum)</span>',QUESTION_1:"What was your best friend's name when you were a teen ?",QUESTION_2:"What was the name of your first pet ?",QUESTION_3:"What is the first meal you have learned to cook ?",QUESTION_4:"What is the first movie you saw in the cinema?",QUESTION_5:"Where did you go the first time you flew ?",QUESTION_6:"What was your favorite elementary school teacher's name ?",QUESTION_7:"What would you consider the ideal job ?",QUESTION_8:"Which children's book do you prefer?",QUESTION_9:"What was the model of your first vehicle?",QUESTION_10:"What was your nickname when you were a child ?",QUESTION_11:"What was your favorite movie character or actor when you were a student ?",QUESTION_12:"What was your favorite singer or band when you were a student ?",QUESTION_13:"In which city did your parents meet ?",QUESTION_14:"What was the name of your first boss ?",QUESTION_15:"What is the name of the street where you grew up ?",QUESTION_16:"What is the name of the first beach where you go swim ?",QUESTION_17:"QWhat is the first album you bought ?",QUESTION_18:"What is the name of your favorite sport team ?",QUESTION_19:"What was your grand-father's job ?",RECOVER_ID:"Recover my password...",RECOVER_ID_HELP:"If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.",REVOCATION_WITH_FILE:"Rekoke my member account...",REVOCATION_WITH_FILE_DESCRIPTION:"If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.",REVOCATION_WITH_FILE_HELP:"To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.",REVOCATION_WALLET:"Revoke this account immediately",REVOCATION_WALLET_HELP:"Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.",REVOCATION_FILENAME:"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",SAVE_ID:"Save my credentials...",SAVE_ID_HELP:"Creating a backup file, to <b>retrieve your password</b> (and the identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.",STRONG_LEVEL:'Strong <span class="hidden-xs ">(6 questions minimum)</span>',TITLE:"Account and security"},FILE_NAME:"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Date",AMOUNT:"Amount",COMMENT:"Comment"}},TRANSFER:{TITLE:"Transfer",SUB_TITLE:"Transfer money",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add comment?",MODAL:{TITLE:"Transfer"}},ERROR:{POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"Value is too short (min {{minLength]] characters).",FIELD_TOO_SHORT_WITH_LENGTH:"This field value is too short.",FIELD_TOO_LONG:"Value is exceeding max length.",FIELD_TOO_LONG_WITH_LENGTH:"Value is too long (max {{maxLength}} characters).",FIELD_MIN:"Minimum value: {{min}}",FIELD_MAX:"Maximal value: {{max}}",FIELD_ACCENT:"Commas and accent characters not allowed",FIELD_NOT_NUMBER:"Value is not a number",FIELD_NOT_INT:"Value is not an integer",FIELD_NOT_EMAIL:"Email adress not valid",PASSWORD_NOT_CONFIRMED:"Must match previous password.",SALT_NOT_CONFIRMED:"Must match previous identifier.",SEND_IDENTITY_FAILED:"Error while trying to register.",SEND_CERTIFICATION_FAILED:"Could not certify identity.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"You could not send certification, because your account is <b>not a member account</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.",NOT_MEMBER_FOR_CERTIFICATION:"Your account is not a member account yet.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"This account could not be certified. No registration found, or need to renew.",LOGIN_FAILED:"Error while sign in.",LOAD_IDENTITY_FAILED:"Could not load identity.",LOAD_REQUIREMENTS_FAILED:"Could not load identity requirements.",SEND_MEMBERSHIP_IN_FAILED:"Error while sending registration as member.",SEND_MEMBERSHIP_OUT_FAILED:"Error while sending membership revocation.",REFRESH_WALLET_DATA:"Could not refresh wallet.",GET_CURRENCY_PARAMETER:"Could not get currency parameters.",GET_CURRENCY_FAILED:"Could not load currency. Please retry later.",SEND_TX_FAILED:"Could not send transaction.",ALL_SOURCES_USED:"Please wait the next block computation (All transaction sources has been used).",NOT_ENOUGH_SOURCES:"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Error while creating your member account.",RESTORE_WALLET_DATA_ERROR:"Error while reloading settings from local storage",LOAD_WALLET_DATA_ERROR:"Error while loading wallet data.",COPY_CLIPBOARD_FAILED:"Could not copy to clipboard",TAKE_PICTURE_FAILED:"Could not get picture.",SCAN_FAILED:"Could not scan QR code.",SCAN_UNKNOWN_FORMAT:"Code not recognized.",WOT_LOOKUP_FAILED:"Search failed.",LOAD_PEER_DATA_FAILED:"Duniter peer not accessible. Please retry later.",NEED_LOGIN_FIRST:"Please sign in first.",AMOUNT_REQUIRED:"Amount is required.",AMOUNT_NEGATIVE:"Negative amount not allowed.",NOT_ENOUGH_CREDIT:"Not enough credit.",INVALID_NODE_SUMMARY:"Unreachable peer or invalid address",INVALID_USER_ID:"Field 'pseudonym' must not contains spaces or special characters.",INVALID_COMMENT:"Field 'reference' has a bad format.",INVALID_PUBKEY:"Public key has a bad format.",IDENTITY_REVOKED:"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.",IDENTITY_PENDING_REVOCATION:"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.",IDENTITY_INVALID_BLOCK_HASH:"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.",IDENTITY_EXPIRED:"This identity has expired: this person must re-apply <b>before</b> being certified.",IDENTITY_SANDBOX_FULL:"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).",IDENTITY_NOT_FOUND:"Identity not found",WOT_PENDING_INVALID_BLOCK_HASH:"Membership not valid.",WALLET_INVALID_BLOCK_HASH:"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\"doQuickFix('renew')\">renew your application for membership</a> to fix this issue.",WALLET_IDENTITY_EXPIRED:"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\"doQuickFix('fixIdentity')\">re-issue your identity</a> to resolve this issue.",WALLET_REVOKED:"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.",WALLET_HAS_NO_SELF:"Your identity must first have been published, and not expired.",AUTH_REQUIRED:"Authentication required.",AUTH_INVALID_PUBKEY:"The public key does not match the connected account.",AUTH_INVALID_SCRYPT:"Invalid username or password.",AUTH_INVALID_FILE:"Invalid keychain file.",AUTH_FILE_ERROR:"Failed to open keychain file",IDENTITY_ALREADY_CERTIFY:"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).",UNABLE_TO_CERTIFY_TITLE:"Unable to certify",LOAD_NEWCOMERS_FAILED:"Unable to load new members.",LOAD_PENDING_FAILED:"Unable to load pending registrations.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member</b> in order to perform this action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"You must have <b>published your identity</b> in order to perform this action.",GET_BLOCK_FAILED:"Error while getting block",INVALID_BLOCK_HASH:"Block not found (incorrect hash)",DOWNLOAD_REVOCATION_FAILED:"Error while downloading revocation file.",REVOCATION_FAILED:"Error while trying to revoke the identity.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Wrong identifier or password ",RECOVER_ID_FAILED:"Could not recover password",LOAD_FILE_FAILED:"Unable to load file",NOT_VALID_REVOCATION_FILE:"Invalid revocation file (wrong file format)",NOT_VALID_SAVE_ID_FILE:"Invalid credentials backup file (wrong file format)",NOT_VALID_KEY_FILE:"Invalid keychain file (unrecognized format)",EXISTING_ACCOUNT:"Your identifiers correspond to an already existing account, whose <a ng-click=\"showHelpModal('pubkey')\">public key</a> is:",EXISTING_ACCOUNT_REQUEST:"Please modify your credentials so that they correspond to an unused account.",GET_LICENSE_FILE_FAILED:"Unable to get license file",CHECK_NETWORK_CONNECTION:"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Identity successfully signed",NOT_ENOUGH_CREDIT:"Not enough credit",TRANSFER_SENT:"Transfer request successfully sent",COPY_TO_CLIPBOARD_DONE:"Copy succeeded",MEMBERSHIP_OUT_SENT:"Membership revocation sent",NOT_NEED_MEMBERSHIP:"Already a member.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"This identity will soon lack certification (at least {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocation sent successfully",REVOCATION_SENT_WAITING_PROCESS:"Revocation <b>has been sent successfully</b>. It is awaiting processing.",FEATURES_NOT_IMPLEMENTED:"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)",EMPTY_TX_HISTORY:"No operations to export"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Warning</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Security warning</b>',CERTIFY_RULES_TITLE_UID:"Certify {{uid}}",CERTIFY_RULES:'<b class="assertive">Don\'t certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?',FULLSCREEN:"View the application in full screen?",EXIT_APP:"Close the application ?",TRANSFER:"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li></ul><br/><b>Are-you sure you want to do this transfer?</b>",MEMBERSHIP_OUT:"This operation is <b>irreversible</b>.<br/></br/><b>Are you sure you want to terminate your membership?</b>",MEMBERSHIP_OUT_2:"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>terminate your membership</b>?",LOGIN_UNUSED_WALLET_TITLE:"Typing error?",LOGIN_UNUSED_WALLET:"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.",FIX_IDENTITY:"The pseudonym <b>{{uid}}</b> will be published again, replacing the old publication that has expired.<br/></br/><b>Are you sure</b> you want to continue?",FIX_MEMBERSHIP:"Your application for membership will be sent.<br/></br/><b>Are you sure?</b>",RENEW_MEMBERSHIP:"Your membership will be renewed.<br/></br/><b>Are you sure?</b>",REVOKE_IDENTITY:"You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated pseudonym <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to revoke this identity?",REVOKE_IDENTITY_2:"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>revoke this identity</b>?",NOT_NEED_RENEW_MEMBERSHIP:"Your membership does not need to be renewed (it will only expire in {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Are you sure you</b> want to renew your membership?",SAVE_BEFORE_LEAVE:"Do you want to <b>save your changes</b> before leaving the page?",SAVE_BEFORE_LEAVE_TITLE:"Changes not saved",LOGOUT:"Are you sure you want to logout?",USE_FALLBACK_NODE:"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?"},DOWNLOAD:{POPUP_TITLE:"<b>Revocation file</b>",POPUP_REVOKE_MESSAGE:"To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>"},HELP:{TITLE:"Online help",JOIN:{SECTION:"Join",SALT:'The identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class="text-italic">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good identifier must be sufficiently long (8 characters at the very least) and as original as possible.',PASSWORD:"The password is very important. Together with the identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.",PSEUDO:'A pseudonym is used only when joining as <span class="text-italic">member</span>. It is always associated with a wallet (by its <span class="text-italic">public key</span>).<br/>It is published on the network so that other users may identify it, certify or send money to the account.<br/>A pseudonym must be unique among all members (current and past).'},LOGIN:{SECTION:"Log in",PUBKEY:"Account public key",PUBKEY_DEF:'The public key of the keychain is generated from the entered identifiers (any), but does not correspond to an account already used.<br/><b>Make sure your public key is the same as your account</b>. Otherwise, you will be logged into an account that is probably never used, as the risk of collision with an existing account is very small.<br/><a href="https://en.wikipedia.org/wiki/Elliptic_curve_cryptography" target="_ system">Learn more about cryptography</a> by public key.',METHOD:"Méthodes de connexion",METHOD_DEF:"Plusieurs options sont disponibles pour vous connecter à un portfeuille :<br/> - La connexion <b>par sallage (simple ou avancé)</b> mélange votre mot de passe grâce à l'identifiant secret, pour limiter les tentatives de piratge par force brute (par exemple à partir de mots connus).<br/> - La connexion <b>par clé publique</b> évite de saisir vos identifiants, qui vous seront demandé seulement le moment venu lors d'une opération sur le compte.<br/> - La connexion <b>par fichier de trousseau</b> va lire les clés (publique et privée) du compte, depuis un fichier, sans besoin de saisir d'identifiants. Plusieurs formats de fichier sont possibles."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the identifier and the password.",MEMBER:"Member",MEMBER_DEF:'A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class="text-italic">currency parameters</span>.',CURRENCY_RULES:"Currency rules",CURRENCY_RULES_DEF:'The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class="text-italic">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href="#/app/currency">See current parameters</a>.',BLOCKCHAIN:"Blockchain",BLOCKCHAIN_DEF:'The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class="text-italic">currency rules</span>.<br/><a href="http://en.duniter.org/presentation/" target="_blank">Read more about Duniter</a> and the working of its blockchain.',UNIVERSAL_DIVIDEND_DEF:'The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class="text-italic">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href="http://trm.creationmonetaire.info" target="_system">Read more about RTM</a> and open money.'},TIP:{MENU_BTN_CURRENCY:"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.",CURRENCY_WOT:"The <b>member count</b> shows the <b>community's weight and evolution</b>.",CURRENCY_MASS:"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).",CURRENCY_UNIT_RELATIVE:"The unit used here (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>",CURRENCY_CHANGE_UNIT:"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).",CURRENCY_CHANGE_UNIT_TO_RELATIVE:"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, which is relative to the Universal Dividend (the amount co-produced by each member).",CURRENCY_RULES:"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.",MENU_BTN_NETWORK:"Menu <b>{{'MENU.NETWORK'|translate}}</b> allows discovery of <b>network's state<b>.",NETWORK_BLOCKCHAIN:"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.",NETWORK_PEERS:"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.",NETWORK_PEERS_BLOCK_NUMBER:"This <b>number</b> (in green) indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.",NETWORK_PEERS_PARTICIPATE:'<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre). <a target="_new" href="{{installDocUrl}}" target="_system">Read the installation manual >></a>.',MENU_BTN_ACCOUNT:"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.",MENU_BTN_ACCOUNT_MEMBER:"Here you can consult your account status, transaction history and your certifications.",WALLET_CERTIFICATIONS:"Click here to reveiw the details of your certifications (given and received).",WALLET_RECEIVED_CERTIFICATIONS:"Click here to review the details of your <b>received certifications</b>.",WALLET_GIVEN_CERTIFICATIONS:"Click here to review the details of your <b>given certifications</b>.",WALLET_BALANCE:"Your account <b>balance</b> is shown here.",WALLET_BALANCE_RELATIVE:"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.",WALLET_BALANCE_CHANGE_UNIT:"You can <b>change the unit</b> in which amounts are shown in <b><i class=\"icon ion-android-settings\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.",WALLET_PUBKEY:"This is your account public key. You can communicate it to a third party so that it more easily identifies your account.",WALLET_SEND:"Issue a payment in just a few clicks.",WALLET_SEND_NO_MONEY:"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)",WALLET_OPTIONS:"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!",WALLET_RECEIVED_CERTS:"This shows the list of persons that certified you.",WALLET_CERTIFY:"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.",WALLET_CERT_STOCK:"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.",MENU_BTN_TX_MEMBER:"<b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.",MENU_BTN_TX:"View the history of <b>your transactions</b> here and send new payments.",MENU_BTN_WOT:"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).",WOT_SEARCH_TEXT_XS:"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.",WOT_SEARCH_TEXT:"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.",WOT_SEARCH_RESULT:"Simply click a user row to view the details sheet.",WOT_VIEW_CERTIFICATIONS:"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.",WOT_VIEW_CERTIFICATIONS_COUNT:"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.",WOT_VIEW_CERTIFICATIONS_CLICK:"Click here to open <b>a list of all certifications</b> given to and by this identity.",WOT_VIEW_CERTIFY:"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.",CERTIFY_RULES:"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!",MENU_BTN_SETTINGS:"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.",HEADER_BAR_BTN_PROFILE:"Click here to access your <b>user profile</b>",SETTINGS_CHANGE_UNIT:"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).",END_LOGIN:"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!",END_NOT_LOGIN:"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> below."}}}),e.translations("en",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Public key",MEMBER:"Member",BLOCK:"Block",BTN_OK:"OK",BTN_YES:"Yes",BTN_NO:"No",BTN_SEND:"Send",BTN_SEND_MONEY:"Transfer money",BTN_SEND_MONEY_SHORT:"Transfer",BTN_SAVE:"Save",BTN_YES_SAVE:"Yes, Save",BTN_YES_CONTINUE:"Yes, Continue",BTN_SHOW:"Show",BTN_SHOW_PUBKEY:"Show key",BTN_RELATIVE_UNIT:"Display amounts in UD?",BTN_BACK:"Back",BTN_NEXT:"Next",BTN_IMPORT:"Import",BTN_CANCEL:"Cancel",BTN_CLOSE:"Close",BTN_LATER:"Later",BTN_LOGIN:"Sign In",BTN_LOGOUT:"Logout",BTN_ADD_ACCOUNT:"New Account",BTN_SHARE:"Share",BTN_EDIT:"Edit",BTN_DELETE:"Delete",BTN_ADD:"Add",BTN_SEARCH:"Search",BTN_REFRESH:"Refresh",BTN_RETRY:"Retry",BTN_START:"Start",BTN_CONTINUE:"Continue",BTN_CREATE:"Create",BTN_UNDERSTOOD:"I understand",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Features tour",BTN_HELP_TOUR_SCREEN:"Discover this screen",BTN_DOWNLOAD:"Download",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Download account statement",BTN_MODIFY:"Modify",CHOOSE_FILE:"Drag your file<br/>or click to select",DAYS:"days",NO_ACCOUNT_QUESTION:"Not a member yet? Register now!",SEARCH_NO_RESULT:"No result found",LOADING:"Loading...",LOADING_WAIT:"Loading...<br/><small>(Waiting for node availability)</small>",SEARCHING:"Searching...",FROM:"From",TO:"To",COPY:"Copy",LANGUAGE:"Language",UNIVERSAL_DIVIDEND:"Universal dividend",UD:"UD",DATE_PATTERN:"MM/DD/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"MM/DD/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(empty)",UID:"Pseudonym",ENABLE:"Enabled",DISABLE:"Disabled",RESULTS_LIST:"Results:",RESULTS_COUNT:"{{count}} results",EXECUTION_TIME:"executed in {{duration|formatDurationMs}}",SHOW_VALUES:"Display values openly?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filters",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit at {{limit}})",POPOVER_SHARE:{TITLE:"Share",SHARE_ON_TWITTER:"Share on Twitter",SHARE_ON_FACEBOOK:"Share on Facebook",SHARE_ON_DIASPORA:"Share on Diaspora*",SHARE_ON_GOOGLEPLUS:"Share on Google+"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choose source:",BTN_PICTURE_GALLERY:"Gallery",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Home",WOT:"Registry",CURRENCY:"Currency",ACCOUNT:"My Account",WALLETS:"My wallets",TRANSFER:"Transfer",SCAN:"Scan",SETTINGS:"Settings",NETWORK:"Network",TRANSACTIONS:"My transactions"},ABOUT:{TITLE:"About",LICENSE:"<b>Free/libre software</b> (License GNU AGPLv3).",LATEST_RELEASE:"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)",CODE:"Source code:",OFFICIAL_WEB_SITE:"Official web site:",DEVELOPERS:"Developers:",FORUM:"Forum:",DEV_WARNING:"Warning",DEV_WARNING_MESSAGE:"This application is still in active development.<br/>Please report any issue to us!",DEV_WARNING_MESSAGE_SHORT:"This App is still unstable (still under development).",REPORT_ISSUE:"Report an issue"},HOME:{TITLE:"Cesium",MESSAGE:"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!",MESSAGE_CURRENCY:"Make exchanges in the libre currency {{currency|abbreviate}}!",BTN_CURRENCY:"Explore currency",BTN_ABOUT:"about",BTN_HELP:"Help",REPORT_ISSUE:"Report an issue",NOT_YOUR_ACCOUNT_QUESTION:'You do not own the account <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Disconnect this account",CONNECTION_ERROR:'Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class="positive" ng-click="doQuickFix(\'settings\')">in the settings</a>.'},SETTINGS:{TITLE:"Settings",DISPLAY_DIVIDER:"Display",STORAGE_DIVIDER:"Storage",NETWORK_SETTINGS:"Network",PEER:"Duniter peer address",PEER_SHORT:"Peer address",PEER_CHANGED_TEMPORARY:"Address used temporarily",USE_LOCAL_STORAGE:"Enable local storage",USE_LOCAL_STORAGE_HELP:"Allows you to save your settings",WALLETS_SETTINGS:"My wallets",USE_WALLETS_ENCRYPTION:"Secure the list",USE_WALLETS_ENCRYPTION_HELP:"Enables you to encrypt the list of your wallets. Authentication required to access it.",ENABLE_HELPTIP:"Enable contextual help tips",ENABLE_UI_EFFECTS:"Enable visual effects",HISTORY_SETTINGS:"Account operations",DISPLAY_UD_HISTORY:"Display produced dividends?",TX_HISTORY_AUTO_REFRESH:"Enable automatic refresh?",TX_HISTORY_AUTO_REFRESH_HELP:"Updates the list of operations to each new block.",AUTHENTICATION_SETTINGS:"Authentication",KEEP_AUTH:"Expiration of authentication",KEEP_AUTH_SHORT:"Expiration",KEEP_AUTH_HELP:"Define when authentication is cleared from memory.",KEEP_AUTH_OPTION:{NEVER:"After each operation",SECONDS:"After {{value}}s of inactivity",MINUTE:"After {{value}}min of inactivity",MINUTES:"After {{value}}min of inactivity",HOUR:"After {{value}}h of inactivity",ALWAYS:"At the end of the session"},KEYRING_FILE:"Keyring file",KEYRING_FILE_HELP:'Allow auto-connect at startup, or to authenticate (only if "Expiration of authentication" is "at the end of the session"',REMEMBER_ME:"Remember me ?",REMEMBER_ME_HELP:"Allows to remain identified from one session to another, keeping the public key locally.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restore default values",EXPERT_MODE:"Enable expert mode",EXPERT_MODE_HELP:"Allow to see more details",BLOCK_VALIDITY_WINDOW:"Block uncertainty time",BLOCK_VALIDITY_WINDOW_SHORT:"Time of uncertainty",BLOCK_VALIDITY_WINDOW_HELP:"Time to wait before considering an information is validated",BLOCK_VALIDITY_OPTION:{NONE:"No delay",N:"{{time | formatDuration}} ({{count}} blocks)"},POPUP_PEER:{TITLE:"Duniter peer",HOST:"Address",HOST_HELP:"Address: server:port",USE_SSL:"Secured?",USE_SSL_HELP:"(SSL Encryption)",BTN_SHOW_LIST:"Peer's list"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Block #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Current block",TITLE:"Block #{{number|formatInteger}}",COMPUTED_BY:"Computed by",SHOW_RAW:"Show raw data",TECHNICAL_DIVIDER:"Technical informations",VERSION:"Format version",HASH:"Computed hash",UNIVERSAL_DIVIDEND_HELP:"Money co-produced by each of the {{membersCount}} members",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Minimal difficulty",POW_MIN_HELP:"Difficulty imposed in calculating hash",DATA_DIVIDER:"Data",IDENTITIES_COUNT:"New identities",JOINERS_COUNT:"Joiners",ACTIVES_COUNT:"Renewals",ACTIVES_COUNT_HELP:"Members having renewed their membership",LEAVERS_COUNT:"Leavers",LEAVERS_COUNT_HELP:"Members that now refused certification",EXCLUDED_COUNT:"Excluded members",EXCLUDED_COUNT_HELP:"Old members, excluded because missing membreship renewal or certifications",REVOKED_COUNT:"Revoked identities",REVOKED_COUNT_HELP:"These accounts may no longer be member",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Change",TX_OUTPUT_UNLOCK_CONDITIONS:"Unlock conditions",TX_OUTPUT_OPERATOR:{AND:"and",OR:"or"},TX_OUTPUT_FUNCTION:{SIG:"<b>Sign</b> of the public key",XHX:"<b>Password</b>, including SHA256 =",CSV:"Blocked during",CLTV:"Bloqué until"}},LOOKUP:{TITLE:"Blocks",NO_BLOCK:"No bloc",LAST_BLOCKS:"Last blocks:",BTN_COMPACT:"Compact"}},CURRENCY:{VIEW:{TITLE:"Currency",TAB_CURRENCY:"Currency",TAB_WOT:"Web of trust",TAB_NETWORK:"Network",TAB_BLOCKS:"Blocks",CURRENCY_SHORT_DESCRIPTION:"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.",NETWORK_RULES_DIVIDER:"Network rules",CURRENCY_NAME:"Currency name",MEMBERS:"Members count",MEMBERS_VARIATION:"Variation since {{duration|formatDuration}} (since last UD)",MONEY_DIVIDER:"Money",MASS:"Monetary mass",SHARE:"Money share",UD:"Universal Dividend",C_ACTUAL:"Current growth",MEDIAN_TIME:"Current blockchain time",POW_MIN:"Common difficulty",MONEY_RULES_DIVIDER:"Rules of currency",C_RULE:"Theoretical growth target",UD_RULE:"Universal dividend (formula)",DT_REEVAL:"Period between two re-evaluation of the UD",REEVAL_SYMBOL:"reeval",DT_REEVAL_VALUE:"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date of first reevaluation of the UD",SIG_QTY_RULE:"Required number of certifications to become a member",SIG_STOCK:"Maximum number of certifications sent by a member",SIG_PERIOD:"Minimum delay between 2 certifications sent by one and the same issuer.",SIG_WINDOW:"Maximum delay before a certification will be treated",SIG_VALIDITY:"Lifetime of a certification that has been treated",MS_WINDOW:"Maximum delay before a pending membership will be treated",MS_VALIDITY:"Lifetime of a membership that has been treated",STEP_MAX:"Maximum distance between a newcomer and each referring members.",WOT_RULES_DIVIDER:"Rules for web of trust",SENTRIES:"Required number of certifications (given <b>and</b> received) to become a referring member",SENTRIES_FORMULA:"Required number of certifications to become a referring member (formula)",XPERCENT:"Minimum percent of referring member to reach to match the distance rule",AVG_GEN_TIME:"The average time between 2 blocks",CURRENT:"current",MATH_CEILING:"CEILING",DISPLAY_ALL_RULES:"Display all rules?",BTN_SHOW_LICENSE:"Show license",WOT_DIVIDER:"Web of trust"},LICENSE:{TITLE:"Currency license",BTN_DOWNLOAD:"Download file",NO_LICENSE_FILE:"License file not found."}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain time",LOADING_PEERS:"Loading peers...",NODE_ADDRESS:"Address:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Pre-release (latest stable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> available",WS2PID:"Identifier:",PRIVATE_ACCESS:"Private access",POW_PREFIX:"Proof of work prefix:",ENDPOINTS:{BMAS:"Secure endpoint (SSL)",BMATOR:"TOR endpoint",WS2P:"WS2P endpoint",ES_USER_API:"Cesium+ data node"}},INFO:{ONLY_SSL_PEERS:"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode."}},PEER:{PEERS:"Peers",SIGNED_ON_BLOCK:"Signed on block",MIRROR:"mirror",MIRRORS:"Mirrors",MIRROR_PEERS:"Mirror peers",PEER_LIST:"Peer's list",MEMBERS:"Members",MEMBER_PEERS:"Member peers",ALL_PEERS:"All peers",DIFFICULTY:"Difficulty",API:"API",CURRENT_BLOCK:"Block #",POPOVER_FILTER_TITLE:"Filter",OFFLINE:"Offline",OFFLINE_PEERS:"Offline peers",BTN_SHOW_PEER:"Show peer",VIEW:{TITLE:"Peer",OWNER:"Owned by ",SHOW_RAW_PEERING:"See peering document",SHOW_RAW_CURRENT_BLOCK:"See current block (raw format)",LAST_BLOCKS:"Last blocks",KNOWN_PEERS:"Known peers :",GENERAL_DIVIDER:"General information",ERROR:{LOADING_TOR_NODE_ERROR:"Could not get peer data, using the TOR network.",LOADING_NODE_ERROR:"Could not get peer data"}}},WOT:{SEARCH_HELP:"Search (member or public key)",SEARCH_INIT_PHASE_WARNING:"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...",REGISTERED_SINCE:"Registered on",REGISTERED_SINCE_BLOCK:"Registered since block #",NO_CERTIFICATION:"No validated certification",NO_GIVEN_CERTIFICATION:"No given certification",NOT_MEMBER_PARENTHESIS:"(non-member)",IDENTITY_REVOKED_PARENTHESIS:"(identity revoked)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(being revoked)",EXPIRE_IN:"Expires",NOT_WRITTEN_EXPIRE_IN:"Deadline<br/>treatment",EXPIRED:"Expired",PSEUDO:"Pseudonym",SIGNED_ON_BLOCK:"Emitted on block #{{block}}",WRITTEN_ON_BLOCK:"Written on block #{{block}}",GENERAL_DIVIDER:"General information",NOT_MEMBER_ACCOUNT:"Non-member account",NOT_MEMBER_ACCOUNT_HELP:"This is a simple wallet, with no pending membership application.",TECHNICAL_DIVIDER:"Technical data",BTN_CERTIFY:"Certify",BTN_YES_CERTIFY:"Yes, certify",BTN_SELECT_AND_CERTIFY:"New certification",ACCOUNT_OPERATIONS:"Account operations",VIEW:{POPOVER_SHARE_TITLE:"Identity {{title}}"},LOOKUP:{TITLE:"Registry",NEWCOMERS:"New members:",NEWCOMERS_COUNT:"{{count}} members",PENDING:"Pending registrations:",PENDING_COUNT:"{{count}} pending registrations",REGISTERED:"Registered {{time | formatFromNow}}",MEMBER_FROM:"Member since {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Latest members",BTN_PENDING:"Pending registrations",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",NO_PENDING:"No pending registrations.",NO_NEWCOMERS:"No members."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Search"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Received certifications",LIST:"Details of received certifications",PENDING_LIST:"Pending certifications",RECEIVED:"Received certifications",RECEIVED_BY:"Certifications received by {{uid}}",ERROR:"Received certifications in error",SENTRY_MEMBER:"Referring member"},OPERATIONS:{TITLE:"{{uid}} - Operations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications sent",SUMMARY:"Sent certifications",LIST:"Details of sent certifications",PENDING_LIST:"Pending certifications",SENT:"Sent certifications",SENT_BY:"Certifications sent by {{uid}}",ERROR:"Sent certifications with error"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Login',SCRYPT_FORM_HELP:"Please enter your credentials. <br> Remember to check the public key for your account.",PUBKEY_FORM_HELP:"Please enter a public account key:",FILE_FORM_HELP:"Choose the keychain file to use:",SCAN_FORM_HELP:"Scan the QR code of a wallet.",SALT:"Identifier",SALT_HELP:"Identifier",SHOW_SALT:"Display identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Don't have an account yet?",HAVE_ACCOUNT_QUESTION:"Already have an account ?",CREATE_ACCOUNT:"Create an account",CREATE_FREE_ACCOUNT:"Create a free account",FORGOTTEN_ID:"Forgot password?",ASSOCIATED_PUBKEY:"Public key :",BTN_METHODS:"Other methods",BTN_METHODS_DOTS:"Change method...",METHOD_POPOVER_TITLE:"Methods",MEMORIZE_AUTH_FILE:"Memorize this keychain during the navigation session",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.',BTN_RELOGIN:"Sign In",IDLE_WARNING:"You will be logout... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Secret and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key only",SCAN:"Scan a QR code"},SCRYPT:{SIMPLE:"Light salt",DEFAULT:"Standard salt",SECURE:"Secure salt",HARDEST:"Hardest salt",EXTREME:"Extreme salt",USER:"Personal value",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating...",HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Authentification',METHOD_LABEL:"Méthode d'authentification",BTN_AUTH:"S'authentifier",SCRYPT_FORM_HELP:"Veuillez vous authentifier :",ERROR:{SCRYPT_DEFAULT:"Sallage simple (par défaut)",SCRYPT_ADVANCED:"Sallage avancé",FILE:"Fichier de trousseau"}},ACCOUNT:{TITLE:"My Account",BALANCE:"Balance",LAST_TX:"Latest validated transactions",BALANCE_ACCOUNT:"Account balance",NO_TX:"No transaction",SHOW_MORE_TX:"Show more",SHOW_ALL_TX:"Show all",TX_FROM_DATE:"(current limit to {{fromTime|medianFromNowShort}})",PENDING_TX:"Pending transactions",VALIDATING_TX:"Transactions being validated",ERROR_TX:"Transaction not executed",ERROR_TX_SENT:"Sent transactions",PENDING_TX_RECEIVED:"Transactions awaiting receipt",EVENTS:"Events",OUT_DISTANCED:"Your current certifications come from a group too isolated from the <a ng-click=\"showHelpModal('wot')\"> Web of Trust</a> (WoT): the <a ng-click=\"showHelpModal('distance_rule')\">maximum distance rule</a> is violated.<br/>You must obtain certifications from another area of the Web of Trust, or wait for it to tighten.",WAITING_MEMBERSHIP:"Membership application sent. Waiting validation.",WAITING_CERTIFICATIONS:"You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.",WAITING_CERTIFICATIONS_HELP:'To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click="showLicenseModal()">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click="openLink($event, $root.settings.userForumUrl)">the user forum</a>.',WILL_MISSING_CERTIFICATIONS:"You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)",WILL_NEED_RENEW_MEMBERSHIP:"Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a> before then.",NEED_RENEW_MEMBERSHIP:"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED:"You are no longer a member because your membership <b>has been canceled</b> for lack of certifications. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.",NO_WAITING_MEMBERSHIP:"No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\"doQuickFix('membership')\">send the membership application</a>.",CERTIFICATION_COUNT:"Received certifications",CERTIFICATION_COUNT_SHORT:"Certifications",SIG_STOCK:"Stock of certifications to give",BTN_RECEIVE_MONEY:"Receive",BTN_SELECT_ALTERNATIVES_IDENTITIES:"Switch to another identity...",BTN_FIX_MEMBERSHIP:"Resubmit membership request...",BTN_MEMBERSHIP_RENEW:"Renew membership",BTN_MEMBERSHIP_RENEW_DOTS:"Renew membership...",BTN_MEMBERSHIP_OUT_DOTS:"Revoke membership...",BTN_SECURITY_DOTS:"Sign-in and security...",BTN_SHOW_DETAILS:"Display technical data",LOCKED_OUTPUTS_POPOVER:{TITLE:"Locked amount",DESCRIPTION:"Here are the conditions for unlocking this amount:",DESCRIPTION_MANY:"This transaction consists of several parts, of which the unlock conditions are:",LOCKED_AMOUNT:"Conditions for the amount:"},NEW:{TITLE:"Registration",INTRO_WARNING_TIME:"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).",INTRO_WARNING_SECURITY:"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.",INTRO_WARNING_SECURITY_HELP:"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...",INTRO_HELP:"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.",REGISTRATION_NODE:"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.",REGISTRATION_NODE_HELP:"If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.",SELECT_ACCOUNT_TYPE:"Choose the type of account to create:",MEMBER_ACCOUNT:"Member account",MEMBER_ACCOUNT_TITLE:"Create a member account",MEMBER_ACCOUNT_HELP:"If you are not yet registered as an individual (one account possible per individual).",WALLET_ACCOUNT:"Simple wallet",WALLET_ACCOUNT_TITLE:"Create a wallet",WALLET_ACCOUNT_HELP:"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.",SALT_WARNING:"Choose a identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!",PASSWORD_WARNING:"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!",PSEUDO_WARNING:"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>",PSEUDO:"Pseudonym",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Confirm",SALT_CONFIRM_HELP:"Confirm the identifier",PASSWORD_CONFIRM:"Confirm",PASSWORD_CONFIRM_HELP:"Confirm the password",SLIDE_6_TITLE:"Confirmation:",COMPUTING_PUBKEY:"Computing...",LAST_SLIDE_CONGRATULATION:"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Warning:</b> your identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?',CHECKING_PSEUDO:"Checking...",PSEUDO_AVAILABLE:"This pseudonym is available",PSEUDO_NOT_AVAILABLE:"This pseudonym is not available",INFO_LICENSE:"To be able to adhere to the currency, we ask you to kindly read and accept this license.",BTN_ACCEPT:"I accept",BTN_ACCEPT_LICENSE:"I accept the license"},POPUP_REGISTER:{TITLE:"Enter a pseudonym",HELP:"A pseudonym is needed to let other members find you."},SECURITY:{ADD_QUESTION:"Add custom question",BTN_CLEAN:"Clean",BTN_RESET:"Reset",DOWNLOAD_REVOKE:"Save a revocation file",DOWNLOAD_REVOKE_HELP:"Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.",GENERATE_KEYFILE:"Generate my keychain file ...",GENERATE_KEYFILE_HELP:"Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!",KEYFILE_FILENAME:"keychain-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey",MEMBERSHIP_IN:"Register as member...",MEMBERSHIP_IN_HELP:"Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.",SEND_IDENTITY:"Publish identity...",SEND_IDENTITY_HELP:"Allows you to associate a pseudonym to this account, but <b>without applying for membership</b> to become a member. This is not very useful because the validity of this pseudonym association is limited in time.",HELP_LEVEL:"Choose <strong> at least {{nb}} questions </strong> :",LEVEL:"Security level",LOW_LEVEL:'Low <span class="hidden-xs">(2 questions minimum)</span>',MEDIUM_LEVEL:'Medium <span class="hidden-xs">(4 questions minimum)</span>',QUESTION_1:"What was your best friend's name when you were a teen ?",QUESTION_2:"What was the name of your first pet ?",QUESTION_3:"What is the first meal you have learned to cook ?",QUESTION_4:"What is the first movie you saw in the cinema?",QUESTION_5:"Where did you go the first time you flew ?",QUESTION_6:"What was your favorite elementary school teacher's name ?",QUESTION_7:"What would you consider the ideal job ?",QUESTION_8:"Which children's book do you prefer?",QUESTION_9:"What was the model of your first vehicle?",QUESTION_10:"What was your nickname when you were a child ?",QUESTION_11:"What was your favorite movie character or actor when you were a student ?",QUESTION_12:"What was your favorite singer or band when you were a student ?",QUESTION_13:"In which city did your parents meet ?",QUESTION_14:"What was the name of your first boss ?",QUESTION_15:"What is the name of the street where you grew up ?",QUESTION_16:"What is the name of the first beach where you go swim ?",QUESTION_17:"QWhat is the first album you bought ?",QUESTION_18:"What is the name of your favorite sport team ?",QUESTION_19:"What was your grand-father's job ?",RECOVER_ID:"Recover my password...",RECOVER_ID_HELP:"If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.",REVOCATION_WITH_FILE:"Rekoke my member account...",REVOCATION_WITH_FILE_DESCRIPTION:"If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.",REVOCATION_WITH_FILE_HELP:"To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.",REVOCATION_WALLET:"Revoke this account immediately",REVOCATION_WALLET_HELP:"Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.",REVOCATION_FILENAME:"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",SAVE_ID:"Save my credentials...",SAVE_ID_HELP:"Creating a backup file, to <b>retrieve your password</b> (and the identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.",STRONG_LEVEL:'Strong <span class="hidden-xs ">(6 questions minimum)</span>',TITLE:"Account and security"},FILE_NAME:"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Date",AMOUNT:"Amount",COMMENT:"Comment"}},TRANSFER:{TITLE:"Transfer",SUB_TITLE:"Transfer money",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add comment?",MODAL:{TITLE:"Transfer"}},ERROR:{POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"Value is too short (min {{minLength]] characters).",FIELD_TOO_SHORT_WITH_LENGTH:"This field value is too short.",FIELD_TOO_LONG:"Value is exceeding max length.",FIELD_TOO_LONG_WITH_LENGTH:"Value is too long (max {{maxLength}} characters).",FIELD_MIN:"Minimum value: {{min}}",FIELD_MAX:"Maximal value: {{max}}",FIELD_ACCENT:"Commas and accent characters not allowed",FIELD_NOT_NUMBER:"Value is not a number",FIELD_NOT_INT:"Value is not an integer",FIELD_NOT_EMAIL:"Email adress not valid",PASSWORD_NOT_CONFIRMED:"Must match previous password.",SALT_NOT_CONFIRMED:"Must match previous identifier.",SEND_IDENTITY_FAILED:"Error while trying to register.",SEND_CERTIFICATION_FAILED:"Could not certify identity.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"You could not send certification, because your account is <b>not a member account</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.",NOT_MEMBER_FOR_CERTIFICATION:"Your account is not a member account yet.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"This account could not be certified. No registration found, or need to renew.",LOGIN_FAILED:"Error while sign in.",LOAD_IDENTITY_FAILED:"Could not load identity.",LOAD_REQUIREMENTS_FAILED:"Could not load identity requirements.",SEND_MEMBERSHIP_IN_FAILED:"Error while sending registration as member.",SEND_MEMBERSHIP_OUT_FAILED:"Error while sending membership revocation.",REFRESH_WALLET_DATA:"Could not refresh wallet.",GET_CURRENCY_PARAMETER:"Could not get currency parameters.",GET_CURRENCY_FAILED:"Could not load currency. Please retry later.",SEND_TX_FAILED:"Could not send transaction.",ALL_SOURCES_USED:"Please wait the next block computation (All transaction sources has been used).",NOT_ENOUGH_SOURCES:"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Error while creating your member account.",RESTORE_WALLET_DATA_ERROR:"Error while reloading settings from local storage",LOAD_WALLET_DATA_ERROR:"Error while loading wallet data.",COPY_CLIPBOARD_FAILED:"Could not copy to clipboard",TAKE_PICTURE_FAILED:"Could not get picture.",SCAN_FAILED:"Could not scan QR code.",SCAN_UNKNOWN_FORMAT:"Code not recognized.",WOT_LOOKUP_FAILED:"Search failed.",LOAD_PEER_DATA_FAILED:"Duniter peer not accessible. Please retry later.",NEED_LOGIN_FIRST:"Please sign in first.",AMOUNT_REQUIRED:"Amount is required.",AMOUNT_NEGATIVE:"Negative amount not allowed.",NOT_ENOUGH_CREDIT:"Not enough credit.",INVALID_NODE_SUMMARY:"Unreachable peer or invalid address",INVALID_USER_ID:"Field 'pseudonym' must not contains spaces or special characters.",INVALID_COMMENT:"Field 'reference' has a bad format.",INVALID_PUBKEY:"Public key has a bad format.",IDENTITY_REVOKED:"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.",IDENTITY_PENDING_REVOCATION:"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.",IDENTITY_INVALID_BLOCK_HASH:"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.",IDENTITY_EXPIRED:"This identity has expired: this person must re-apply <b>before</b> being certified.",IDENTITY_SANDBOX_FULL:"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).",IDENTITY_NOT_FOUND:"Identity not found",WOT_PENDING_INVALID_BLOCK_HASH:"Membership not valid.",WALLET_INVALID_BLOCK_HASH:"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\"doQuickFix('renew')\">renew your application for membership</a> to fix this issue.",WALLET_IDENTITY_EXPIRED:"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\"doQuickFix('fixIdentity')\">re-issue your identity</a> to resolve this issue.",WALLET_REVOKED:"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.",WALLET_HAS_NO_SELF:"Your identity must first have been published, and not expired.",AUTH_REQUIRED:"Authentication required.",AUTH_INVALID_PUBKEY:"The public key does not match the connected account.",AUTH_INVALID_SCRYPT:"Invalid username or password.",AUTH_INVALID_FILE:"Invalid keychain file.",AUTH_FILE_ERROR:"Failed to open keychain file",IDENTITY_ALREADY_CERTIFY:"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).",UNABLE_TO_CERTIFY_TITLE:"Unable to certify",LOAD_NEWCOMERS_FAILED:"Unable to load new members.",LOAD_PENDING_FAILED:"Unable to load pending registrations.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member</b> in order to perform this action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"You must have <b>published your identity</b> in order to perform this action.",GET_BLOCK_FAILED:"Error while getting block",INVALID_BLOCK_HASH:"Block not found (incorrect hash)",DOWNLOAD_REVOCATION_FAILED:"Error while downloading revocation file.",REVOCATION_FAILED:"Error while trying to revoke the identity.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Wrong identifier or password ",RECOVER_ID_FAILED:"Could not recover password",LOAD_FILE_FAILED:"Unable to load file",NOT_VALID_REVOCATION_FILE:"Invalid revocation file (wrong file format)",NOT_VALID_SAVE_ID_FILE:"Invalid credentials backup file (wrong file format)",NOT_VALID_KEY_FILE:"Invalid keychain file (unrecognized format)",EXISTING_ACCOUNT:"Your identifiers correspond to an already existing account, whose <a ng-click=\"showHelpModal('pubkey')\">public key</a> is:",EXISTING_ACCOUNT_REQUEST:"Please modify your credentials so that they correspond to an unused account.",GET_LICENSE_FILE_FAILED:"Unable to get license file",CHECK_NETWORK_CONNECTION:"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Identity successfully signed",NOT_ENOUGH_CREDIT:"Not enough credit",TRANSFER_SENT:"Transfer request successfully sent",COPY_TO_CLIPBOARD_DONE:"Copy succeeded",MEMBERSHIP_OUT_SENT:"Membership revocation sent",NOT_NEED_MEMBERSHIP:"Already a member.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"This identity will soon lack certification (at least {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocation sent successfully",REVOCATION_SENT_WAITING_PROCESS:"Revocation <b>has been sent successfully</b>. It is awaiting processing.",FEATURES_NOT_IMPLEMENTED:"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)",EMPTY_TX_HISTORY:"No operations to export"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Warning</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Security warning</b>',CERTIFY_RULES_TITLE_UID:"Certify {{uid}}",CERTIFY_RULES:'<b class="assertive">Don\'t certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?',FULLSCREEN:"View the application in full screen?",EXIT_APP:"Close the application ?",TRANSFER:"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li></ul><br/><b>Are-you sure you want to do this transfer?</b>",MEMBERSHIP_OUT:"This operation is <b>irreversible</b>.<br/></br/><b>Are you sure you want to terminate your membership?</b>",MEMBERSHIP_OUT_2:"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>terminate your membership</b>?",LOGIN_UNUSED_WALLET_TITLE:"Typing error?",LOGIN_UNUSED_WALLET:"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.",FIX_IDENTITY:"The pseudonym <b>{{uid}}</b> will be published again, replacing the old publication that has expired.<br/></br/><b>Are you sure</b> you want to continue?",FIX_MEMBERSHIP:"Your application for membership will be sent.<br/></br/><b>Are you sure?</b>",RENEW_MEMBERSHIP:"Your membership will be renewed.<br/></br/><b>Are you sure?</b>",REVOKE_IDENTITY:"You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated pseudonym <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to revoke this identity?",REVOKE_IDENTITY_2:"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>revoke this identity</b>?",NOT_NEED_RENEW_MEMBERSHIP:"Your membership does not need to be renewed (it will only expire in {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Are you sure you</b> want to renew your membership?",SAVE_BEFORE_LEAVE:"Do you want to <b>save your changes</b> before leaving the page?",SAVE_BEFORE_LEAVE_TITLE:"Changes not saved",LOGOUT:"Are you sure you want to logout?",USE_FALLBACK_NODE:"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?"},DOWNLOAD:{POPUP_TITLE:"<b>Revocation file</b>",POPUP_REVOKE_MESSAGE:"To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>"},HELP:{TITLE:"Online help",JOIN:{SECTION:"Join",SALT:'The identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class="text-italic">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good identifier must be sufficiently long (8 characters at the very least) and as original as possible.',PASSWORD:"The password is very important. Together with the identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.",PSEUDO:'A pseudonym is used only when joining as <span class="text-italic">member</span>. It is always associated with a wallet (by its <span class="text-italic">public key</span>).<br/>It is published on the network so that other users may identify it, certify or send money to the account.<br/>A pseudonym must be unique among all members (current and past).'},LOGIN:{SECTION:"Log in",PUBKEY:"Account public key",PUBKEY_DEF:'The public key of the keychain is generated from the entered identifiers (any), but does not correspond to an account already used.<br/><b>Make sure your public key is the same as your account</b>. Otherwise, you will be logged into an account that is probably never used, as the risk of collision with an existing account is very small.<br/><a href="https://en.wikipedia.org/wiki/Elliptic_curve_cryptography" target="_ system">Learn more about cryptography</a> by public key.',METHOD:"Méthodes de connexion",METHOD_DEF:"Plusieurs options sont disponibles pour vous connecter à un portfeuille :<br/> - La connexion <b>par sallage (simple ou avancé)</b> mélange votre mot de passe grâce à l'identifiant secret, pour limiter les tentatives de piratge par force brute (par exemple à partir de mots connus).<br/> - La connexion <b>par clé publique</b> évite de saisir vos identifiants, qui vous seront demandé seulement le moment venu lors d'une opération sur le compte.<br/> - La connexion <b>par fichier de trousseau</b> va lire les clés (publique et privée) du compte, depuis un fichier, sans besoin de saisir d'identifiants. Plusieurs formats de fichier sont possibles."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the identifier and the password.",MEMBER:"Member",MEMBER_DEF:'A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class="text-italic">currency parameters</span>.',CURRENCY_RULES:"Currency rules",CURRENCY_RULES_DEF:'The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class="text-italic">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href="#/app/currency">See current parameters</a>.',BLOCKCHAIN:"Blockchain",BLOCKCHAIN_DEF:'The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class="text-italic">currency rules</span>.<br/><a href="http://en.duniter.org/presentation/" target="_blank">Read more about Duniter</a> and the working of its blockchain.',UNIVERSAL_DIVIDEND_DEF:'The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class="text-italic">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href="http://trm.creationmonetaire.info" target="_system">Read more about RTM</a> and open money.'},TIP:{MENU_BTN_CURRENCY:"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.",CURRENCY_WOT:"The <b>member count</b> shows the <b>community's weight and evolution</b>.",CURRENCY_MASS:"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).",CURRENCY_UNIT_RELATIVE:"The unit used here (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>",CURRENCY_CHANGE_UNIT:"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).",CURRENCY_CHANGE_UNIT_TO_RELATIVE:"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, which is relative to the Universal Dividend (the amount co-produced by each member).",CURRENCY_RULES:"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.",MENU_BTN_NETWORK:"Menu <b>{{'MENU.NETWORK'|translate}}</b> allows discovery of <b>network's state<b>.",NETWORK_BLOCKCHAIN:"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.",NETWORK_PEERS:"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.",NETWORK_PEERS_BLOCK_NUMBER:"This <b>number</b> (in green) indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.",NETWORK_PEERS_PARTICIPATE:'<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre). <a target="_new" href="{{installDocUrl}}" target="_system">Read the installation manual >></a>.',MENU_BTN_ACCOUNT:"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.",MENU_BTN_ACCOUNT_MEMBER:"Here you can consult your account status, transaction history and your certifications.",WALLET_CERTIFICATIONS:"Click here to reveiw the details of your certifications (given and received).",WALLET_RECEIVED_CERTIFICATIONS:"Click here to review the details of your <b>received certifications</b>.",WALLET_GIVEN_CERTIFICATIONS:"Click here to review the details of your <b>given certifications</b>.",WALLET_BALANCE:"Your account <b>balance</b> is shown here.",WALLET_BALANCE_RELATIVE:"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.",WALLET_BALANCE_CHANGE_UNIT:"You can <b>change the unit</b> in which amounts are shown in <b><i class=\"icon ion-android-settings\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.",WALLET_PUBKEY:"This is your account public key. You can communicate it to a third party so that it more easily identifies your account.",WALLET_SEND:"Issue a payment in just a few clicks.",WALLET_SEND_NO_MONEY:"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)",WALLET_OPTIONS:"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!",WALLET_RECEIVED_CERTS:"This shows the list of persons that certified you.",WALLET_CERTIFY:"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.",WALLET_CERT_STOCK:"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.",MENU_BTN_TX_MEMBER:"<b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.",MENU_BTN_TX:"View the history of <b>your transactions</b> here and send new payments.",MENU_BTN_WOT:"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).",WOT_SEARCH_TEXT_XS:"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.",WOT_SEARCH_TEXT:"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.",WOT_SEARCH_RESULT:"Simply click a user row to view the details sheet.",WOT_VIEW_CERTIFICATIONS:"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.",WOT_VIEW_CERTIFICATIONS_COUNT:"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.",WOT_VIEW_CERTIFICATIONS_CLICK:"Click here to open <b>a list of all certifications</b> given to and by this identity.",WOT_VIEW_CERTIFY:"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.",CERTIFY_RULES:"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!",MENU_BTN_SETTINGS:"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.",HEADER_BAR_BTN_PROFILE:"Click here to access your <b>user profile</b>",SETTINGS_CHANGE_UNIT:"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).",END_LOGIN:"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!",END_NOT_LOGIN:"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> below."}}}),e.translations("eo-EO",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"dato: {{build}}",PUBKEY:"Publika ŝlosilo",MEMBER:"Membro",BLOCK:"Bloko",BTN_OK:"OK",BTN_YES:"Jes",BTN_NO:"Ne",BTN_SEND:"Sendi",BTN_SEND_MONEY:"Fari elspezon",BTN_SEND_MONEY_SHORT:"Elspezo",BTN_SAVE:"Konservi",BTN_YES_SAVE:"Jes, Konservi",BTN_YES_CONTINUE:"Jes, Daŭrigi",BTN_SHOW:"Vidi",BTN_SHOW_PUBKEY:"Afiŝi la publikan ŝlosilon",BTN_RELATIVE_UNIT:"Afiŝi la sumojn en UD?",BTN_BACK:"Reiro",BTN_NEXT:"Sekva",BTN_IMPORT:"Enporti",BTN_CANCEL:"Nuligi",BTN_CLOSE:"Fermi",BTN_LATER:"Poste",BTN_LOGIN:"Konektiĝi",BTN_LOGOUT:"Malkonektiĝo",BTN_ADD_ACCOUNT:"Nova konto",BTN_SHARE:"Diskonigi",BTN_EDIT:"Modifi",BTN_DELETE:"Forigi",BTN_ADD:"Aldoni",BTN_SEARCH:"Traserĉi",BTN_REFRESH:"Aktualigi",BTN_RETRY:"Rekomenci",BTN_START:"Komenci",BTN_CONTINUE:"Daŭrigi",BTN_CREATE:"Krei",BTN_UNDERSTOOD:"Mi komprenis",BTN_OPTIONS:"Kromeblecoj",BTN_HELP_TOUR:"Gvidata vizito",BTN_HELP_TOUR_SCREEN:"Malkovri tiun ĉi paĝon",BTN_DOWNLOAD:"Elŝuti",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Elŝuti la konto-tabelon",BTN_MODIFY:"Modifi",CHOOSE_FILE:"Almetu vian dosieron <br/>aŭ klaku por selekti ĝin",DAYS:"tagoj",NO_ACCOUNT_QUESTION:"Ankoraŭ sen konto? Kreu ĝin senpage!",SEARCH_NO_RESULT:"Neniu rezulto trovita",LOADING:"Bonvolu pacienci...",LOADING_WAIT:"Bonvolu pacienci...<br/><small>(Atendo pri disponebleco de la nodo)</small>",SEARCHING:"Serĉanta...",FROM:"De",TO:"Al",COPY:"Kopii",LANGUAGE:"Lingvo",UNIVERSAL_DIVIDEND:"Universala dividendo",UD:"UD",DATE_PATTERN:"DD/MM/YY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(malplena)",UID:"Pseŭdonimo",ENABLE:"Aktiva",DISABLE:"Malaktiva",RESULTS_LIST:"Rezultoj",RESULTS_COUNT:"{{count}} rezultoj",EXECUTION_TIME:"plenumita en {{duration|formatDurationMs}}",SHOW_VALUES:"Afiŝi la signojn klare?",POPOVER_ACTIONS_TITLE:"Kromeblecoj",POPOVER_FILTER_TITLE:"Filtriloj",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",POPOVER_SHARE:{TITLE:"Diskonigi",SHARE_ON_TWITTER:"Diskonigi ĉe Twitter",SHARE_ON_FACEBOOK:"Diskonigi ĉe Facebook",SHARE_ON_DIASPORA:"Diskonigi ĉe Diaspora*",SHARE_ON_GOOGLEPLUS:"Diskonigi ĉe Google+"},FILE:{DATE:"Dato:",TYPE:"Tipo:",SIZE:"Amplekso:",VALIDATING:"Validiĝanta..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Elekti la fonton:",BTN_PICTURE_GALLERY:"Bildaro",BTN_PICTURE_CAMERA:"<b>Kamerao</b>"},MENU:{HOME:"Hejmpaĝo",WOT:"Kontaro",CURRENCY:"Mono",ACCOUNT:"Mia konto",WALLETS:"Miaj monujoj",TRANSFER:"Elspezo",SCAN:"Skani",SETTINGS:"Parametroj",NETWORK:"Reto",TRANSACTIONS:"Miaj spezoj"},ABOUT:{TITLE:"Prie",LICENSE:"Programo <b>libera</b> (licenco GNU AGPLv3).",LATEST_RELEASE:"Ekzistas <b>pli freŝdata versio</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Bonvolu ĝisdatigi {{'COMMON.APP_NAME'|translate}} (lasta versio: <b>v{{version}}</b>)",CODE:"Fonto-kodo:",OFFICIAL_WEB_SITE:"Oficiala retejo:",DEVELOPERS:"Programita de:",FORUM:"Forumo:",DEV_WARNING:"Averto",DEV_WARNING_MESSAGE:"Tiu ĉi programo daŭre estas programiĝanta.<br/>Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn!",DEV_WARNING_MESSAGE_SHORT:"Tiu ĉi programo daŭre estas programiĝanta.",REPORT_ISSUE:"Sciigi problemon"},HOME:{TITLE:"Cesium",MESSAGE:"Bonvenon ĉe {{'COMMON.APP_NAME'|translate}}!",MESSAGE_CURRENCY:"Interŝanĝi per {{currency|abbreviate}} fariĝas... tre simple!",BTN_CURRENCY:"Esplori la monon {{name|abbreviate}}",BTN_ABOUT:"Prie",BTN_HELP:"Ret-helpo",REPORT_ISSUE:"fuŝaĵo",NOT_YOUR_ACCOUNT_QUESTION:"Vi ne posedas la konton<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?",BTN_CHANGE_ACCOUNT:"Malkonektu tiun ĉi konton",CONNECTION_ERROR:'Nodo <b>{{server}}</b> neatingebla por aliri la monon, aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ ŝanĝu nodon <a class="positive" ng-click="doQuickFix(\'settings\')">ĉe la parametroj</a>.'},SETTINGS:{TITLE:"Parametroj",DISPLAY_DIVIDER:"Afiŝado",STORAGE_DIVIDER:"Stokado",NETWORK_SETTINGS:"Reto",PEER:"Adreso de la nodo Duniter",PEER_SHORT:"Adreso de la nodo",PEER_CHANGED_TEMPORARY:"Adreso provizore uzata",USE_LOCAL_STORAGE:"Aktivigi lokan stokadon",USE_LOCAL_STORAGE_HELP:"Ebligas konservi viajn parametrojn",ENABLE_HELPTIP:"Aktivigi la rilatigajn help-vezikojn",ENABLE_UI_EFFECTS:"Aktivigi la vid-efikojn",HISTORY_SETTINGS:"Miaj spezoj",DISPLAY_UD_HISTORY:"Afiŝi la produktitajn dividendojn?",AUTHENTICATION_SETTINGS:"Aŭtentigado",AUTO_LOGOUT:"Aŭtomata malaŭtentigado",AUTO_LOGOUT_OPTION_NEVER:"Neniam",AUTO_LOGOUT_OPTION_SECONDS:"Post {{value}} sekundoj",AUTO_LOGOUT_OPTION_MINUTE:"Post {{value}} minuto",AUTO_LOGOUT_OPTION_MINUTES:"Post {{value}} minutoj",AUTO_LOGOUT_OPTION_HOUR:"Post {{value}} horo",AUTO_LOGOUT_HELP:"Daŭro de senaktiveco antaŭ malkonektiĝo",REMEMBER_ME:"Memori min?",REMEMBER_ME_HELP:"Ebligas resti ĉiam konektita.",PLUGINS_SETTINGS:"Krom-programoj",BTN_RESET:"Restarigi la originajn valorojn",EXPERT_MODE:"Aktivigi la spertan moduson",EXPERT_MODE_HELP:"Ebligas pli detalan afiŝadon",POPUP_PEER:{TITLE:"Nodo Duniter",HOST:"Adreso",HOST_HELP:"Adreso : servilo:konektujo",USE_SSL:"Sekurigita?",USE_SSL_HELP:"(SSL-ĉifrado)",BTN_SHOW_LIST:"Listo de la nodoj"}},BLOCKCHAIN:{HASH:"Haketo: {{hash}}",VIEW:{HEADER_TITLE:"Bloko #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Nuna bloko",TITLE:"Bloko #{{number|formatInteger}}",COMPUTED_BY:"Kalkulita de la nodo de",SHOW_RAW:"Vidi la kompletan dosieron",TECHNICAL_DIVIDER:"Teknikaj informoj",VERSION:"Versio de la daten-strukturo",HASH:"Kalkulita haketo",UNIVERSAL_DIVIDEND_HELP:"Mono kunproduktita de ĉiu el la {{membersCount}} membroj",EMPTY:"Neniu dateno en tiu ĉi bloko",POW_MIN:"Minimuma malfacileco",POW_MIN_HELP:"Malfacileco trudita por la haket-kalkulo",DATA_DIVIDER:"Darenoj",IDENTITIES_COUNT:"Novaj identecoj",JOINERS_COUNT:"Novaj membroj",ACTIVES_COUNT:"Revalidigoj",ACTIVES_COUNT_HELP:"Membroj revalidigintaj sian membrecon",LEAVERS_COUNT:"Membroj elirintaj",LEAVERS_COUNT_HELP:"Membroj ne plu dezirantaj atestaĵon",EXCLUDED_COUNT:"Membroj eksigitaj",EXCLUDED_COUNT_HELP:"Malnovaj membroj eksigitaj pro nerevalidiĝo aŭ manko de atestaĵoj",REVOKED_COUNT:"Nuligitaj identecoj",REVOKED_COUNT_HELP:"Tiuj kontoj ne plu povos esti membroj",TX_COUNT:"Spezoj",CERT_COUNT:"Atestaĵoj",TX_TO_HIMSELF:"Operacio pri monŝanĝo",TX_OUTPUT_UNLOCK_CONDITIONS:"Kondiĉoj por malblokado",TX_OUTPUT_OPERATOR:{AND:"kaj",OR:"aŭ"},TX_OUTPUT_FUNCTION:{SIG:"<b>Subskribo</b> de ",XHX:"<b>Pasvorto</b>, el kiu SHA256 =",CSV:"Blokita dum",CLTV:"Blokita ĝis"}},LOOKUP:{TITLE:"Blokoj",NO_BLOCK:"Neniu bloko",LAST_BLOCKS:"Lastaj blokoj:",BTN_COMPACT:"Densigi"}},CURRENCY:{VIEW:{TITLE:"Mono",TAB_CURRENCY:"Mono",TAB_WOT:"Reto de fido",TAB_NETWORK:"Reto",TAB_BLOCKS:"Blokoj",CURRENCY_SHORT_DESCRIPTION:"{{currency|abbreviate}} estas <b>libera mono</b>, kiu ekis {{firstBlockTime|formatFromNow}}. Ĝi nombras nun <b>{{N}} membrojn</b>, kiuj produktas kaj ricevas <a ng-click=\"showHelpModal('ud')\">Universalan Dividendon</a> (UD), ĉiun {{dt|formatPeriod}}n.",NETWORK_RULES_DIVIDER:"Reguloj de la reto",CURRENCY_NAME:"Nomo de la mono",MEMBERS:"Nombro de membroj",MEMBERS_VARIATION:"Variado post la lasta UD",MONEY_DIVIDER:"Mono",MASS:"Mona maso",SHARE:"Maso por membro",UD:"Universala dividendo",C_ACTUAL:"Nuna kreskado",MEDIAN_TIME:"Horo de la blokĉeno",POW_MIN:"Minimuma nivelo pri malfacileco de kalkulo",MONEY_RULES_DIVIDER:"Reguloj de la mono",C_RULE:"Teoria kreskado celata",UD_RULE:"Kalkulo de la universala dividendo",DT_REEVAL:"Periodo de revalorigo de la UD",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Ĉiuj <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Dato de la unua revalorigo",SIG_QTY_RULE:"Nombro de necesaj atestaĵoj por fariĝi membro",SIG_STOCK:"Maksimuma nombro da senditaj atestaĵoj por membro",SIG_PERIOD:"Minimuma daŭro de atendado inter 2 sinsekvaj atestaĵoj senditaj de sama persono",SIG_WINDOW:"Limdaŭro por akcepti atestaĵon",SIG_VALIDITY:"Vivdaŭro de atestaĵo, kiu estis akceptita",MS_WINDOW:"Limdaŭro por akcepti aliĝ-peton kiel membron",MS_VALIDITY:"Vivdaŭro de aliĝo, kiu estis akceptita",STEP_MAX:"Maksimuma distanco, per la atestaĵoj, inter nova eniranto kaj la referencaj membroj",WOT_RULES_DIVIDER:"Reguloj de la reto de fido",SENTRIES:"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro",SENTRIES_FORMULA:"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro (formulo)",XPERCENT:"Minimuma procento da referencaj membroj atingenda por konformiĝi al la regulo pri distanco",AVG_GEN_TIME:"Meza daŭro inter du blokoj",CURRENT:"nuna",MATH_CEILING:"PLAFONO",DISPLAY_ALL_RULES:"Afiŝi ĉiujn regulojn?",BTN_SHOW_LICENSE:"Vidi la licencon",WOT_DIVIDER:"Reto de fido"},LICENSE:{TITLE:"Licenco de la mono",BTN_DOWNLOAD:"Elŝuti la dosieron",NO_LICENSE_FILE:"Dosiero pri licenco ne trovita."}},NETWORK:{VIEW:{MEDIAN_TIME:"Horo de la blokĉeno",LOADING_PEERS:"Nodoj ŝarĝiĝantaj...",NODE_ADDRESS:"Adreso:",SOFTWARE:"Programo",WARN_PRE_RELEASE:"Antaŭ-versio (lasta stabila versio: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Versio <b>{{version}}</b> disponebla",WS2PID:"Identigilo:",PRIVATE_ACCESS:"Privata aliro",POW_PREFIX:"Prefikso pri labor-pruvo:",ENDPOINTS:{BMAS:"Sekurigita interfaco (SSL)",BMATOR:"Reta interfaco TOR",WS2P:"Interfaco WS2P",ES_USER_API:"Nodo de datenoj Cesium+"}},INFO:{ONLY_SSL_PEERS:"La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS."}},PEER:{PEERS:"Nodoj",SIGNED_ON_BLOCK:"Skribita en la bloko",MIRROR:"spegulo",MIRRORS:"Speguloj",MIRROR_PEERS:"Spegul-nodoj",PEER_LIST:"Listo de la nodoj",MEMBERS:"Membroj",MEMBER_PEERS:"Membro-nodoj",ALL_PEERS:"Ĉiuj nodoj",DIFFICULTY:"Malfacileco",API:"API",CURRENT_BLOCK:"Bloko #",POPOVER_FILTER_TITLE:"Filtrilo",OFFLINE:"Nekonektita",OFFLINE_PEERS:"Nekonektitaj nodoj",BTN_SHOW_PEER:"Vidi la nodon",VIEW:{TITLE:"Nodo",OWNER:"Apartenas al",SHOW_RAW_PEERING:"Vidi la samrangan dokumenton",SHOW_RAW_CURRENT_BLOCK:"Vidi la lastan blokon (kompleta strukturo)",LAST_BLOCKS:"Lastaj blokoj konataj",KNOWN_PEERS:"Konataj nodoj:",GENERAL_DIVIDER:"Ĝeneralaj informoj",ERROR:{LOADING_TOR_NODE_ERROR:"Neeblas ricevi la informojn de la nodo. La limdaŭro de atendado estas transpasita.",LOADING_NODE_ERROR:"Neeblas ricevi la informojn de la nodo"}}},WOT:{SEARCH_HELP:"Traserĉado (pseŭdo aŭ publika ŝlosilo)",SEARCH_INIT_PHASE_WARNING:"Dum la periodo de antaŭ-aliĝo, la traserĉado de la atendantaj aliĝoj <b>povas esti longa</b>. Bonvolu pacienci...",REGISTERED_SINCE:"Enskribita la",REGISTERED_SINCE_BLOCK:"Enskribita en la bloko #",NO_CERTIFICATION:"Neniu atestaĵo validigita",NO_GIVEN_CERTIFICATION:"Neniu atestaĵo sendita",NOT_MEMBER_PARENTHESIS:"(ne membro)",IDENTITY_REVOKED_PARENTHESIS:"(identeco nuligita)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(nuliĝanta)",EXPIRE_IN:"Finiĝo",NOT_WRITTEN_EXPIRE_IN:"Limdato<br/>de traktado",EXPIRED:"Finiĝinta",PSEUDO:"Pseŭdonimo",SIGNED_ON_BLOCK:"Sendita en la bloko #{{block}}",WRITTEN_ON_BLOCK:"Enskribita en la bloko #{{block}}",GENERAL_DIVIDER:"Ĝeneralaj informoj",NOT_MEMBER_ACCOUNT:"Simpla konto (ne membro)",NOT_MEMBER_ACCOUNT_HELP:"Temas pri simpla monujo, sen aliĝ-peto atendanta.",TECHNICAL_DIVIDER:"Teknikaj informoj",BTN_CERTIFY:"Atesti",BTN_YES_CERTIFY:"Jes, atesti",BTN_SELECT_AND_CERTIFY:"Nova atestaĵo",ACCOUNT_OPERATIONS:"Spezoj en la konto",VIEW:{POPOVER_SHARE_TITLE:"Identeco {{title}}"},LOOKUP:{TITLE:"Kontaro",NEWCOMERS:"Novaj membroj:",NEWCOMERS_COUNT:"{{count}} membroj",PENDING:"Atendantaj enskribiĝoj",PENDING_COUNT:"{{count}} atendantaj enskribiĝoj",REGISTERED:"Enskribita {{time | formatFromNow}}",MEMBER_FROM:"Membro depost {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Novaj membroj",BTN_PENDING:"Atendantaj enskribiĝoj",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",NO_PENDING:"Neniu enskribiĝo atendanta.",NO_NEWCOMERS:"Neniu membro."},CONTACTS:{TITLE:"Kontaktoj"},MODAL:{TITLE:"Traserĉado"},CERTIFICATIONS:{TITLE:"{{uid}} - Atestaĵoj",SUMMARY:"Ricevitaj atestaĵoj",LIST:"Detalo pri la ricevitaj atestaĵoj",PENDING_LIST:"Atestaĵoj atendantaj traktadon",RECEIVED:"Ricevitaj atestaĵoj",RECEIVED_BY:"Atestaĵoj ricevitaj de {{uid}}",ERROR:"Atestaĵoj erare ricevitaj",SENTRY_MEMBER:"Referenca membro"},OPERATIONS:{TITLE:"{{uid}} - Spezoj"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Senditaj atestaĵoj",SUMMARY:"Senditaj atestaĵoj",LIST:"Detalo pri la senditaj atestaĵoj",PENDING_LIST:"Atestaĵoj atendantaj traktadon",SENT:"Senditaj atestaĵoj",SENT_BY:"Atestaĵoj senditaj de {{uid}}",ERROR:"Atestaĵoj erare senditaj"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Konektiĝo',SCRYPT_FORM_HELP:"Bonvolu tajpi viajn identigilojn.<br>Pensu kontroli, ke la publika ŝlosilo estas tiu de via konto.",PUBKEY_FORM_HELP:"Bonvolu tajpi publikan ŝlosilon de konto:",FILE_FORM_HELP:"Elektu la ŝlosilaro-dosieron uzotan:",SCAN_FORM_HELP:"Skani la QR-kodon de monujo.",SALT:"Identigilo",SALT_HELP:"Identigilo",SHOW_SALT:"Afiŝi la identigilon?",PASSWORD:"Pasvorto",PASSWORD_HELP:"Pasvorto",PUBKEY_HELP:"Ekzemple: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Vi ankoraŭ ne havas konton?",HAVE_ACCOUNT_QUESTION:"Vi jam havas konton?",CREATE_ACCOUNT:"Krei konton...",CREATE_FREE_ACCOUNT:"Krei konton senpage",FORGOTTEN_ID:"Pasvorto forgesita?",ASSOCIATED_PUBKEY:"Publika ŝlosilo de la ŝlosilaro:",BTN_METHODS:"Aliaj metodoj",BTN_METHODS_DOTS:"Ŝanĝi metodon...",METHOD_POPOVER_TITLE:"Metodoj",MEMORIZE_AUTH_FILE:"Memorigi tiun ŝlosilaron por la daŭro de la sesio de retumado",SCRYPT_PARAMETERS:"Parametroj (Skripto):",AUTO_LOGOUT:{TITLE:"Informo",
|
||
MESSAGE:'<i class="ion-android-time"></i> Vi estis <b>malkonektita</b> aŭtomate, pro tro longa senaktiveco.',BTN_RELOGIN:"Rekonektiĝi",IDLE_WARNING:"Vi estos malkonektita... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Identigilo kaj pasvorto",SCRYPT_ADVANCED:"Sperta salumado",FILE:"Dosiero pri ŝlosilaro",PUBKEY:"Publika ŝlosilo aŭ pseŭdonimo",SCAN:"Skani QR-kodon"},SCRYPT:{SIMPLE:"Malpeza salumado",DEFAULT:"Kutima salumado",SECURE:"Sekura salumado",HARDEST:"Plej sekura salumado",EXTREME:"Ekstrema salumado",USER:"Personigita salumado",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{HELP:"Atendita strukturo de dosiero: <b>.yml</b> aŭ <b>.dunikey</b> (tipo PubSec, WIF aŭ EWIF)."}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Aŭtentigado',METHOD_LABEL:"Metodo por aŭtentiĝi",BTN_AUTH:"Aŭtentiĝi",SCRYPT_FORM_HELP:"Bonvolu aŭtentiĝi:",ERROR:{SCRYPT_DEFAULT:"Simpla salumado (implicite)",SCRYPT_ADVANCED:"Sperta salumado",FILE:"Dosiero pri ŝlosilaro"}},ACCOUNT:{TITLE:"Mia konto",BALANCE:"Saldo",LAST_TX:"Lastaj spezoj",BALANCE_ACCOUNT:"Konto-saldo",NO_TX:"Neniu spezo",SHOW_MORE_TX:"Afiŝi pli",SHOW_ALL_TX:"Afiŝi ĉion",TX_FROM_DATE:"(nuna limo je {{fromTime|medianFromNowShort}})",PENDING_TX:"Spezoj atendantaj traktadon",ERROR_TX:"Spezoj ne realigitaj",ERROR_TX_SENT:"Senditaj spezoj malsukcesintaj",PENDING_TX_RECEIVED:"Spezoj atendantaj ricevon",EVENTS:"Okazaĵoj",WAITING_MEMBERSHIP:"Aliĝo-peto sendita. Atendanta akcepton.",WAITING_CERTIFICATIONS:"Vi devas akiri {{needCertificationCount}} atestaĵo(j)n por fariĝi membro.",WILL_MISSING_CERTIFICATIONS:"Baldaŭ <b>mankos al vi atestaĵoj</b> (almenaŭ {{willNeedCertificationCount}} estas necesaj)",WILL_NEED_RENEW_MEMBERSHIP:"Via aliĝo kiel membro <b>estas finiĝonta {{membershipExpiresIn|formatDurationTo}}</b>. Pensu <a ng-click=\"doQuickFix('renew')\">revalidigi vian aliĝon</a> ĝis tiam..",NEED_RENEW_MEMBERSHIP:"Vi ne plu estas membro de la mono, ĉar <b>via aliĝo finiĝis</b>. Pensu <a ng-click=\"doQuickFix('renew')\">revalidigi vian aliĝon</a>.",CERTIFICATION_COUNT:"Ricevitaj atestaĵoj",CERTIFICATION_COUNT_SHORT:"Atestaĵoj",SIG_STOCK:"Senditaj atestaĵoj",BTN_RECEIVE_MONEY:"Enkasigi",BTN_MEMBERSHIP_IN_DOTS:"Fariĝi membro...",BTN_MEMBERSHIP_RENEW:"Revalidigi la aliĝon",BTN_MEMBERSHIP_RENEW_DOTS:"Revalidigi la aliĝon...",BTN_MEMBERSHIP_OUT_DOTS:"Ĉesigi la aliĝon...",BTN_SEND_IDENTITY_DOTS:"Publikigi sian identecon...",BTN_SECURITY_DOTS:"Konto kaj sekureco...",BTN_SHOW_DETAILS:"Afiŝi la teknikajn informojn",LOCKED_OUTPUTS_POPOVER:{TITLE:"Sumo blokita",DESCRIPTION:"Jen la kondiĉoj de malblokado de tiu sumo:",DESCRIPTION_MANY:"Tiu spezo entenas plurajn partojn, pri kiuj la kondiĉoj de malblokado estas:",LOCKED_AMOUNT:"Kondiĉoj por la sumo:"},NEW:{TITLE:"Enskribiĝo",INTRO_WARNING_TIME:"La kreado de konto ĉe {{name|capitalize}} estas tre simpla. Bonvolu tamen dediĉi sufiĉe da tempo por ĝuste efektivigi tiun proceduron (por ne forgesi la identigilojn, pasvortojn, ktp.).",INTRO_WARNING_SECURITY:"Kontrolu ke la aparatoj, kiujn vi nun uzas (komputilo, tabuleto, telefono), <b>estas sekurigitaj kaj fidindaj</b>.",INTRO_WARNING_SECURITY_HELP:"Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, sesio protektita per pasvorto aŭ PIN-kodo, ktp.",INTRO_HELP:"Alklaku <b>{{'COMMON.BTN_START'|translate}}</b> por ekigi la kreadon de konto. Vi estos gvidata paŝon post paŝo.",REGISTRATION_NODE:"Via aliĝo estos registrita tra la nodo Duniter <b>{{server}}</b>, kiu dissendos ĝin poste al la cetero de la mon-reto.",REGISTRATION_NODE_HELP:"Se vi ne fidas tiun nodon, bonvolu ŝanĝi ĝin <a ng-click=\"doQuickFix('settings')\">en la parametroj</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Elektu la tipon de konto kreota:",MEMBER_ACCOUNT:"Membro-konto",MEMBER_ACCOUNT_TITLE:"Kreado de membro-konto",MEMBER_ACCOUNT_HELP:"Se vi ankoraŭ ne enskribiĝis kiel individuo (nur unu konto eblas por unu individuo). Tia konto ebligas kunprodukti la monon, ricevante <b> universalan dividendon</b> ĉiun {{parameters.dt|formatPeriod}}n.",WALLET_ACCOUNT:"Simpla monujo",WALLET_ACCOUNT_TITLE:"Kreado de monujo",WALLET_ACCOUNT_HELP:"Por ĉiuj aliaj kazoj, ekzemple se vi bezonas plian konton.<br/>Neniu universala dividendo estos kreita per tia konto.",SALT_WARNING:"Elektu vian sekretan identigilon.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu ĝin</b>: kaze de perdo, neniu alia povos aliri vian konton!",PASSWORD_WARNING:"Elektu pasvorton.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu tiun pasvorton</b: kaze de perdo, neniu alia povos aliri vian konton!",PSEUDO_WARNING:"Elektu pseŭdonimon.<br/>Ĝi utilas al la aliaj membroj, por identigi vin pli facile.<div class='hidden-xs'><br/>Ĝi <b>ne povos esti modifita</b>, sen rekrei konton.</div><br/><br/>Ĝi entenu <b>nek spacon, nek diakritan literon (kun supersigno, ktp.)</b>.<div class='hidden-xs'><br/>Ekzemple: <span class='gray'>NataljaBelulino, JohanoStelaro, ktp.</span>",PSEUDO:"Pseŭdonimo",PSEUDO_HELP:"Pseŭdonimo",SALT_CONFIRM:"Konfirmo",SALT_CONFIRM_HELP:"Konfirmo de la sekreta identigilo",PASSWORD_CONFIRM:"Konfirmo",PASSWORD_CONFIRM_HELP:"Konfirmo de la pasvorto",SLIDE_6_TITLE:"Konfirmo:",COMPUTING_PUBKEY:"Kalkulanta...",LAST_SLIDE_CONGRATULATION:"Vi tajpis ĉiujn necesajn informojn: Gratulon!<br/>Vi nun povas <b>sendi la peton por kreado</b> de la konto.</b><br/><br/>Por informo, la publika ŝlosilo ĉi-sube identigos vian estontan konton.<br/>Ĝi povos estis sciigita al aliuloj por ricevi iliajn pagojn.<br/><b>Ne estas devige</b> noti ĝin nun, vi ankaŭ povos fari tion poste.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Averto:</b> la sekreta identigilo, la pasvorto kaj la pseŭdonimo ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras sendi tiun ĉi aliĝo-peton?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Averto:</b> la sekreta identigilo kaj la pasvorto ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras daŭrigi per tiuj ĉi identigiloj?',CHECKING_PSEUDO:"Kontrolo...",PSEUDO_AVAILABLE:"Pseŭdonimo disponebla",PSEUDO_NOT_AVAILABLE:"Pseŭdonimo ne disponebla",INFO_LICENSE:"Antaŭ ol krei membro-konton, <b>bonvolu legi kaj akcepti la licencon</b> pri uzado de la mono:",BTN_ACCEPT:"Mi akceptas",BTN_ACCEPT_LICENSE:"Mi akceptas la licencon"},POPUP_REGISTER:{TITLE:"Elektu pseŭdonimon",HELP:"Pseŭdonimo estas deviga por fariĝi membro."},SECURITY:{ADD_QUESTION:"Aldoni personigitan demandon",BTN_CLEAN:"Malplenigi",BTN_RESET:"Restartigi",DOWNLOAD_REVOKE:"Konservi mian dosieron pri nuligo",DOWNLOAD_REVOKE_HELP:"Disponi dosieron pri nuligo estas grave, ekzemple kaze de perdo de viaj identigiloj. Ĝi ebligas al vi <b>elirigi tiun konton el la reto de fido</b>, tiel ke ĝi refariĝu simpla monujo.",HELP_LEVEL:"Por krei konserv-dosieron pri viaj identigiloj, elektu <strong> almenaŭ {{nb}} demandojn:</strong>",LEVEL:"Nivelo de sekureco",LOW_LEVEL:'Malforta <span class="hidden-xs">(2 demandoj minimume)</span>',MEDIUM_LEVEL:'Meza <span class="hidden-xs">(4 demandoj minimume)</span>',QUESTION_1:"Kiel nomiĝis via plej bona amik.in.o, kiam vi estis adoleskant.in.o?",QUESTION_2:"Kiel nomiĝis via unua hejm-besto?",QUESTION_3:"Kiun pladon vi unue lernis kuiradi?",QUESTION_4:"Kiun filmon vi unue spektis en kinejo?",QUESTION_5:"Kien vi iris la unuan fojon, kiam vi vojaĝis per aviadilo?",QUESTION_6:"Kiel nomiĝis via preferata instruist.i.no en bazlernejo?",QUESTION_7:"Kio estus laŭ vi la ideala profesio?",QUESTION_8:"Kiun libron por infanoj vi preferas?",QUESTION_9:"Kio estis la marko de via unua veturilo?",QUESTION_10:"Kio estis via kromnomo, kiam vi estis infano?",QUESTION_11:"Kiun rolant.in.on aŭ aktor.in.on vi preferis en kino, kiam vi estis student.in.o?",QUESTION_12:"Kiun kanzonist.ino.n aŭ muzikgrupon vi preferis, kiam vi estis student.in.o?",QUESTION_13:"En kiu urbo renkontiĝis viaj gepatroj?",QUESTION_14:"Kiel nomiĝis via unua ĉefo?",QUESTION_15:"Kiel nomiĝas la strato, kie vi kreskis?",QUESTION_16:"Kiel nomiĝas la marbordo, kie vi unuafoje baniĝis?",QUESTION_17:"Kiun muzik-albumon vi unuafoje aĉetis?",QUESTION_18:"Kiel nomiĝas via preferata sporto-teamo?",QUESTION_19:"Kio estis la profesio de via avo?",RECOVER_ID:"Retrovi mian pasvorton...",RECOVER_ID_HELP:"Se vi disponas <b>konserv-dosieron pri viaj identigiloj</b>, vi povas retrovi ilin respondante ĝuste viajn personajn demandojn.",REVOCATION_WITH_FILE:"Nuligi mian membro-konton...",REVOCATION_WITH_FILE_HELP:"Se vi <b>definitive perdis viajn identigilojn</b> pri via membro-konto (aŭ ke la sekureco de la konto estas endanĝerigita), vi povas uzi <b>la dosieron pri nuligo</b> de la konto por <b>trudi ties definitivan eliradon el la reto de fido</b>.",REVOCATION_WALLET:"Nuligi tiun ĉi konton tuj",REVOCATION_WALLET_HELP:"Peti la nuligon de via identeco estigas la <b>eliradon el la reto de fido</b> (definitivan por la pseŭdonimo kaj la publika ŝlosilo kunligitaj). La konto ne plu povos produkti Universalan Dividendon.<br/>Vi tamen daŭre povos konektiĝi al ĝi, kiel al simpla monujo.",REVOCATION_FILENAME:"nuligo-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",SAVE_ID:"Konservi miajn identigilojn...",SAVE_ID_HELP:"Kreado de konserv-dosiero, por <b>retrovi vian pasvorton</b> (kaj la sekretan identigilon) <b>kaze de forgeso</b>. La dosiero estas <b>sekurigita</b> (ĉifrita) dank'al personaj demandoj.",STRONG_LEVEL:'Forta <span class="hidden-xs ">(6 demandoj minimume)</span>',TITLE:"Konto kaj sekureco"},FILE_NAME:"{{currency}} - Konto-tabelo {{pubkey|formatPubkey}} je {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Dato",AMOUNT:"Sumo",COMMENT:"Komento"}},TRANSFER:{TITLE:"Elspezo",SUB_TITLE:"Fari elspezon",FROM:"De",TO:"Al",AMOUNT:"Sumo",AMOUNT_HELP:"Sumo",COMMENT:"Komento",COMMENT_HELP:"Komento",BTN_SEND:"Sendi",BTN_ADD_COMMENT:"Aldoni komenton?",MODAL:{TITLE:"Elspezo"}},ERROR:{POPUP_TITLE:"Eraro",UNKNOWN_ERROR:"Eraro nekonata",CRYPTO_UNKNOWN_ERROR:"Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.",FIELD_REQUIRED:"Deviga kampo",FIELD_TOO_SHORT:"Signaro tro mallonga",FIELD_TOO_SHORT_WITH_LENGTH:"Signaro tro mallonga ({{minLength}} signoj minimume)",FIELD_TOO_LONG:"Signaro tro longa",FIELD_TOO_LONG_WITH_LENGTH:"Signaro tro longa ({{maxLength}} signoj maksimume)",FIELD_MIN:"Minimuma longeco: {{min}}",FIELD_MAX:"Maksimuma longeco: {{max}}",FIELD_ACCENT:"Diakritaj literoj kaj komoj ne permesataj",FIELD_NOT_NUMBER:"Nombra valoro atendata",FIELD_NOT_INT:"Entjera nombro atendata",FIELD_NOT_EMAIL:"Retadreso nevalida",PASSWORD_NOT_CONFIRMED:"Ne kongruas kun la pasvorto",SALT_NOT_CONFIRMED:"Ne kongruas kun la sekreta identigilo",SEND_IDENTITY_FAILED:"Aliĝo malsukcesa",SEND_CERTIFICATION_FAILED:"Atestado malsukcesa",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Vi ne povas efektivigi atestadon, ĉar via konto <b>ne estas membro</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"Vi ne povas efektivigi atestadon, ĉar via konto ankoraŭ ne estas membro.<br/><br/>Ankoraŭ mankas al vi atestaĵoj, aŭ tiuj ĉi ankoraŭ ne estis validigitaj.",NOT_MEMBER_FOR_CERTIFICATION:"Via konto ankoraŭ ne estas membro.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Konto ne atestebla. Neniu aliĝo-peto estis farita, aŭ la aliĝo ne estis revalidigita.",LOGIN_FAILED:"Eraro dum konektiĝo.",LOAD_IDENTITY_FAILED:"Eraro por ŝarĝi la identecon.",LOAD_REQUIREMENTS_FAILED:"Eraro por ŝarĝi la antaŭ-necesaĵoj de la identeco.",SEND_MEMBERSHIP_IN_FAILED:"Malsukceso pri la provado eniri la komunumon.",SEND_MEMBERSHIP_OUT_FAILED:"Malsukceso pri la ĉesigo de la aliĝo.",REFRESH_WALLET_DATA:"Malsukceso pri la ĝisdatigo de la monujo.",GET_CURRENCY_PARAMETER:"Malsukceso por ricevi la regulojn de la mono.",GET_CURRENCY_FAILED:"Ne eblis ŝarĝi la monon. Bonvolu reprovi pli poste.",SEND_TX_FAILED:"Elspezado malsukcesa.",ALL_SOURCES_USED:"Bonvolu atendi la kalkulon de la venonta bloko (ĉiuj viaj monfontoj estis uzitaj).",NOT_ENOUGH_SOURCES:"Ne sufiĉe da mono por sendi tiun ĉi sumon per ununura spezo.<br/>Maksimuma sumo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Malsukceso por krei la membro-konton.",RESTORE_WALLET_DATA_ERROR:"Malsukceso por reŝarĝi la parametrojn de la loka stokaĵo",LOAD_WALLET_DATA_ERROR:"Malsukceso por ŝarĝi la datenojn de la monujo.",COPY_CLIPBOARD_FAILED:"Ne eblis kopii la valoron.",TAKE_PICTURE_FAILED:"Malsukceso por ricevi la foton.",SCAN_FAILED:"Malsukceso por skani la QR-kodon.",SCAN_UNKNOWN_FORMAT:"Kodo nerekonata.",WOT_LOOKUP_FAILED:"Serĉado malsukcesa.",LOAD_PEER_DATA_FAILED:"Ne eblis legi la nodon Duniter. Bonvolu reprovi poste.",NEED_LOGIN_FIRST:"Bonvolu unue konektiĝi.",AMOUNT_REQUIRED:"La monsumo estas deviga.",AMOUNT_NEGATIVE:"Negativa sumo nepermesata.",NOT_ENOUGH_CREDIT:"Saldo nesufiĉa.",INVALID_NODE_SUMMARY:"Nodo neatingebla aŭ adreso nevalida.",INVALID_USER_ID:"La pseŭdonimo devas enteni nek spacon nek signon specialan aŭ kun supersigno.",INVALID_COMMENT:"La kampo 'referenco' ne devas enteni literojn kun supersigno.",INVALID_PUBKEY:"La publika ŝlosilo ne havas la atenditan strukturon.",IDENTITY_REVOKED:"Tiu ĉi identeco <b>estis nuligita</b>. Ĝi ne plu povas fariĝi membro.",IDENTITY_PENDING_REVOCATION:"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.",IDENTITY_INVALID_BLOCK_HASH:"Tiu ĉi aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto): tiu persono devas refari sian aliĝo-peton <b>antaŭ ol</b> esti atestita.",IDENTITY_EXPIRED:"La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.",IDENTITY_SANDBOX_FULL:"La nodo Duniter uzata de Cesium ne plu povas ricevi novajn identecojn, ĉar ĝia atendo-vico estas plena.<br/><br/>Bonvolu reprovi poste aŭ ŝanĝi la nodon (per la menuo <b>Parametroj</b>).",IDENTITY_NOT_FOUND:"Identeco ne trovita.",WOT_PENDING_INVALID_BLOCK_HASH:"Aliĝo ne valida.",WALLET_INVALID_BLOCK_HASH:"Via aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto).<br/>Vi devas <a ng-click=\"doQuickFix('fixMembership')\">sendi novan peton</a> por solvi tiun ĉi problemon.",WALLET_IDENTITY_EXPIRED:"La publikigo de <b>via identeco finiĝis</b>.<br/>Vi devas <a ng-click=\"doQuickFix('fixIdentity')\">publikigi denove vian identecon</a> por solvi tiun ĉi problemon.",WALLET_REVOKED:"Via identeco estis <b>nuligita</b>: nek via pseŭdonimo nek via publika ŝlosilo povos esti uzata en la estonteco por membro-konto.",WALLET_HAS_NO_SELF:"Via identeco devas unue esti publikigita, kaj ne esti finiĝinta.",AUTH_REQUIRED:"Aŭtentigado necesa.",AUTH_INVALID_PUBKEY:"La publika ŝlosilo ne rilatas al la konektita konto.",AUTH_INVALID_SCRYPT:"Identigilo aŭ pasvorto nevalida.",AUTH_INVALID_FILE:"Dosiero pri ŝlosilaro nevalida.",AUTH_FILE_ERROR:"Malsukceso por malfermi la dosieron pri ŝlosilaro.",IDENTITY_ALREADY_CERTIFY:"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado daŭre validas (finiĝo {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado atendas traktadon (limdato de traktado {{expiresIn|formatDurationTo}}).",UNABLE_TO_CERTIFY_TITLE:"Atestado neebla",LOAD_NEWCOMERS_FAILED:"Malsukceso por ŝarĝi la novajn membrojn.",LOAD_PENDING_FAILED:"Malsukceso por ŝarĝi la atendantajn aliĝojn.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vi devas <b>esti membro</b> por rajti efektivigi tiun ĉi agon.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Via identeco devas <b>jam esti publikigita</b>, por ke vi rajtu efektivigi tiun ĉi agon.",GET_BLOCK_FAILED:"Malsukceso por ricevi la blokon.",INVALID_BLOCK_HASH:"Bloko ne trovita (haketo malsama)",DOWNLOAD_REVOCATION_FAILED:"Malsukceso por elŝuti la dosieron pri nuligo.",REVOCATION_FAILED:"Malsukceso pri nuligo.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Sekreta identigilo aŭ pasvorto malĝusta.",RECOVER_ID_FAILED:"Malsukceso por ricevi la identigilojn",LOAD_FILE_FAILED:"Malsukceso por ŝarĝi la dosieron",NOT_VALID_REVOCATION_FILE:"Dosiero pri nuligo ne valida (malĝusta strukturo de dosiero)",NOT_VALID_SAVE_ID_FILE:"Dosiero pri konservado ne valida (malĝusta strukturo de dosiero)",NOT_VALID_KEY_FILE:"Dosiero pri ŝlosilaro ne valida (strukturo ne rekonata)",EXISTING_ACCOUNT:"Viaj identigiloj rilatas al jam ekzistanta konto, kies <a ng-click=\"showHelpModal('pubkey')\">publika ŝlosilo</a> estas:",EXISTING_ACCOUNT_REQUEST:"Bonvolu modifi viajn identigilojn, por ke ili rilatu al ne uzata konto.",GET_LICENSE_FILE_FAILED:"La ricevo de la dosiero pri licenco ne eblis.",CHECK_NETWORK_CONNECTION:"Neniu nodo ŝajnas atingebla.<br/><br/>Bonvolu <b>kontroli vian retkonekton</b>."},INFO:{POPUP_TITLE:"Informo",CERTIFICATION_DONE:"Atestaĵo sendita",NOT_ENOUGH_CREDIT:"Saldo nesufiĉa",TRANSFER_SENT:"Elspezo sendita",COPY_TO_CLIPBOARD_DONE:"Kopio efektivigita",MEMBERSHIP_OUT_SENT:"Eksiĝo sendita",NOT_NEED_MEMBERSHIP:"Vi jam estas membro.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Al tiu ĉi identeco baldaŭ mankos atestaĵoj (almenaŭ {{willNeedCertificationCount}}).",REVOCATION_SENT:"Nuligo sendita",REVOCATION_SENT_WAITING_PROCESS:"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.",FEATURES_NOT_IMPLEMENTED:"Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)",EMPTY_TX_HISTORY:"Neniu spezo elportota"},CONFIRM:{POPUP_TITLE:"<b>Konfirmo</b>",POPUP_WARNING_TITLE:"<b>Averto</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Averto pri sekureco</b>',CERTIFY_RULES_TITLE_UID:"Atesti {{uid}}",CERTIFY_RULES:'<b class="assertive">NE atestu</b> konton, se vi pensas ke:<br/><br/><ul><li>1.) ĝi ne rilatas al persono <b>fizika kaj vivanta</b>.<li>2.) ĝia posedanto <b>havas alian konton</b> jam atestitan.<li>3.) ĝia posedanto malobservas (vole aŭ ne) la regulon 1 aŭ 2 (ekzemple atestante falsajn kontojn aŭ duoblajn).</ul><br/><b>Ĉu vi certas,</b> ke vi tamen volas atesti tiun ĉi identecon?',FULLSCREEN:"Afiŝi la programon plen-ekrane?",EXIT_APP:"Fermi la programon?",TRANSFER:"<b>Resumo de la elspezo</b> :<br/><br/><ul><li> - De: {{from}}</li><li> - Al: <b>{{to}}</b></li><li> - Sumo: <b>{{amount}} {{unit}}</b></li><li> - Komento: <i>{{comment}}</i></li></ul><br/><b>Ĉu vi certas, ke vi volas efektivigi tiun ĉi elspezon?</b>",MEMBERSHIP_OUT:"Tiu ĉi ago estas <b>neinversigebla</b>.<br/></br/>Ĉu vi certas, ke vi volas <b>nuligi vian membro-konton</b>?",MEMBERSHIP_OUT_2:"Tiu ĉi ago estas <b>neinversigebla</b> !<br/><br/>Ĉu vi vere certas, ke vi volas <b>nuligi vian aliĝon</b> kiel membron?",LOGIN_UNUSED_WALLET_TITLE:"Tajperaro?",LOGIN_UNUSED_WALLET:"La konektita konto ŝajnas <b>neaktiva</b>.<br/><br/>Temas probable pri <b>tajperaro</b> en viaj konekto-identigiloj. Bonvolu rekomenci, kontrolante ke <b>la publika ŝlosilo estas tiu de via konto</b>.",FIX_IDENTITY:"La pseŭdonimo <b>{{uid}}</b> estos denove publikigita, anstataŭigante la malnovan publikigon, kiu finiĝis.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?",FIX_MEMBERSHIP:"Via aliĝo-peto kiel membro tuj estos resendita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?",RENEW_MEMBERSHIP:"Via aliĝo kiel membro tuj estos revalidigita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?",REVOKE_IDENTITY:"Vi estas <b>nuligonta definitive tiun ĉi identecon</b>.<br/><br/>La publika ŝlosilo kaj la ligita pseŭdonimo <b>neniam plu povos esti uzataj</b> (por membro-konto). <br/></br/><b>Ĉu vi certas</b>, ke vi volas definitive nuligi tiun ĉi konton?",REVOKE_IDENTITY_2:"Tiu ĉi ago estas <b>neinversigebla</b>!<br/><br/>Ĉu vi vere certas, ke vi volas <b>definitive nuligi</b> tiun ĉi konton?",NOT_NEED_RENEW_MEMBERSHIP:"Via aliĝo ne bezonas esti revalidigita (ĝi finiĝos nur post {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Ĉu vi certas</b>, ke vi volas revalidigi vian aliĝon?",SAVE_BEFORE_LEAVE:"Ĉu vi volas <b>konservi viajn modifojn</b> antaŭ ol eliri el la paĝo?",SAVE_BEFORE_LEAVE_TITLE:"Modifoj ne registritaj",LOGOUT:"Ĉu vi certas, ke vi volas malkonektiĝi?",USE_FALLBACK_NODE:"Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?"},DOWNLOAD:{POPUP_TITLE:"<b>Dosiero pri nuligo</b>",POPUP_REVOKE_MESSAGE:"Por sekurigi vian konton, bonvolu elŝuti la <b>dokumenton pri konto-nuligo</b>. Ĝi ebligos al vi eventuale nuligi vian konton (kaze de konto-ŝtelo, ŝanĝo de identigilo, konto erare kreita, ktp.).<br/><br/><b>Bonvolu stoki ĝin en sekura loko.</b>"},HELP:{TITLE:"Ret-helpo",JOIN:{SECTION:"Enskribiĝo",SALT:'La sekreta identigilo estas tre grava. Ĝi utilas por miksi la pasvorton, antaŭ ol ĝi servos por kalkuli la <span class="text-italic">publikan ŝlosilon</span> de via konto (ties numeron) kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas nuntempe planita por retrovi ĝin kaze de perdo.<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona sekreta identigilo devas esti sufiĉe longa (kun almenaŭ 8 signoj) kaj kiel eble plej originala.',PASSWORD:"La pasvorto estas tre grava. Kun la sekreta identigilo, ĝi servas por kalkuli la numeron (la publikan ŝlosilon) de via konto, kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas planita por retrovi ĝin kaze de perdo (krom se oni generas konserv-dosieron).<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona pasvorto entenas (ideale) almenaŭ 8 signojn, inter kiuj estas almenaŭ unu majusklo kaj unu cifero.",PSEUDO:'La pseŭdonimo estas utila nur kaze de enskribiĝo kiel <span class="text-italic">membro</span>. Ĝi ĉiam estas ligita kun monujo (tra ĝia <span class="text-italic">publika ŝlosilo</span>).<br/>Ĝi estas publikigita en la reto, tiel ke la aliaj uzantoj povu identigi ĝin, atesti ĝin aŭ sendi monon al ĝia konto.<br/>Pseŭdonimo devas esti unika ene de la membroj (<u>nunaj</u> kaj eksaj).'},LOGIN:{SECTION:"Konekto",PUBKEY:"Publika ŝlosilo de la ŝlosilaro",PUBKEY_DEF:'La publika ŝlosilo de la ŝlosilaro estas kreita per la tajpitaj identigiloj (iuj ajn), sen ke ili necese rilatu al konto jam uzata.<br/><b>Atente kontrolu, ke la publika ŝlosilo estas tiu de via konto</b>. Alikaze, vi estos konektita al konto probable neniam uzita, la risko de kolizio kun ekzistanta konto estante tre eta.<br/><a href="https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique" target="_system">Scii pli pri kriptografio</a> per publika ŝlosilo.',METHOD:"Konekto-metodoj",METHOD_DEF:'Pluraj eblecoj disponeblas por konekti vin al monujo:<br/> - La konekto <b>per salumado (simpla aŭ sperta)</b> miksas vian pasvorton dank\'al la sekreta identigilo, por limigi la provojn de <a href="https://fr.wikipedia.org/wiki/Attaque_par_force_brute" target="_system">kodrompado per kruda forto</a> (ekzemple per konataj vortoj.<br/> - La konekto <b>per publika ŝlosilo</b> evitigas tajpi viajn identigilojn, kiuj estos petataj de vi, nur kiam venos la momento dum operacio ĉe la konto.<br/> - La konekto <b>per dosiero pri ŝlosilaro</b> legas la ŝlosilojn (publikan kaj privatan) de la konto, per dosiero, sen la bezono tajpi identigilojn. Pluraj strukturoj de dosiero eblas.'},GLOSSARY:{SECTION:"Glosaro",PUBKEY_DEF:'Publika ŝlosilo identigas monujon, kiu povas identigi membron aŭ rilati al anonima monujo. Ĉe Cesium la publika ŝlosilo estas kalkulita (implicite) dank\'al la sekreta identigilo kaj la pasvorto.<br/><a href="https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique" target="_system">Scii pli pri kriptografio</a> per publika ŝlosilo.',MEMBER:"Membro",MEMBER_DEF:'Membro estas homa persono fizika kaj vivanta, kiu deziras libere partopreni en la mona komunumo. Li/ŝi kunproduktas universalan dividendon, laŭ periodo kaj sumo tiel difinitaj kiel en la <span class="text-italic">reguloj de la mono</span>',CURRENCY_RULES:"Reguloj de la mono",CURRENCY_RULES_DEF:'La reguloj de la mono estas difinitaj definitive. Ili fiksas la funkciadon de la mono: la kalkulon de la universala dividendo, la nombron de necesaj atestaĵoj por esti membro, la maksimuman nombron da atestaĵoj, kiujn povas doni unu membro, ktp. <a href="#/app/currency">Vidi la nuntempajn regulojn</a>.<br/>La nemodifo de la reguloj tra la tempo eblas per uzado de <span class="text-italic">Blokĉeno</span>, kiu entenas kaj plenumas tiujn regulojn, kaj konstante kontrolas ties ĝustan aplikadon.',BLOCKCHAIN:'Ĉeno de blokoj (<span class="text-italic">Blokchain/Blokĉeno</span>)',BLOCKCHAIN_DEF:'La Blokĉeno estas malcentrigita sistemo, kiu, kaze de Duniter, servas por enteni kaj plenumi la <span class="text-italic">regulojn de la mono</span>.<br/><a href="https://duniter.org/fr/comprendre/" target="_system">Scii pli pri Duniter</a> kaj la funkciado de ties blokĉeno.',UNIVERSAL_DIVIDEND_DEF:'La Universala Dividendo (UD) estas la kvanto de mono kunkreita de ĉiu membro, laŭ la periodo kaj kalkulo difinitaj en la <span class="text-italic">reguloj de la mono</span>.<br/>Por ĉiu perioda dato, la membroj ricevas en sian konton la saman kvanton da nova mono.<br/><br/>La UD spertas regulan kreskon, por resti justa inter la membroj (nunaj kaj venontaj), kalkulitan depende de la meza vivespero, kiel estas demonstrite en la Teorio Relativa pri la Mono (TRM).<br/><a href="http://trm.creationmonetaire.info" target="_system">Scii pli pri la TRM</a> kaj la liberaj monoj.'},TIP:{MENU_BTN_CURRENCY:"La menuo <b>{{'MENU.CURRENCY'|translate}}</b> ebligas konsulti la <b>regulojn de la mono</b> kaj ties staton.",CURRENCY_WOT:"La <b>nombro de membroj</b> montras la gravecon de la komunumo kaj ebligas <b>sekvi ties evoluon</b>.",CURRENCY_MASS:"Sekvu ĉi tie la <b>ĉioman kvanton da mono</b> ekzistanta kaj ties <b>mezan distribuon</b> por membro.<br/><br/>Tio ĉi ebligas taksi la <b>gravecon de iu sumo</b>, kompare kun tio, kion <b>posedas la aliuloj</b> en sia konto (mezume).",CURRENCY_UNIT_RELATIVE:"La unuo uzata (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifas, ke la sumoj en {{currency|capitalize}} estis dividitaj per la <b> Universala Dividendo</b> (UD).<br/><br/><small>Tiu relativa unuo estas <b>trafa</b>, ĉar stabila malgraŭ la kvanto de mono, kiu kreskas seninterrompe.</small>",CURRENCY_CHANGE_UNIT:"La kromaĵo <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> ebligas <b>ŝanĝi la unuon</b>, por vidigi la sumojn <b>rekte en {{currency|capitalize}}</b> (prefere ol en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).",CURRENCY_CHANGE_UNIT_TO_RELATIVE:"La kromaĵo <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> ebligas <b>ŝanĝi la unuon</b>, por vidigi la sumojn en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, tio estas rilate al la Universala Dividendo (la sumo kunproduktita de ĉiu membro).",CURRENCY_RULES:"La <b>reguloj</b> de la mono fiksas ties funkciadon <b>ĝustan kaj antaŭvideblan</b>.<br/><br/>Vera DNA de la mono, ili igas sian monan kodon <b>legebla kaj travidebla</b>.",MENU_BTN_NETWORK:"La menuo <b>{{'MENU.NETWORK'|translate}}</b> ebligas konsulti la staton de la reto.",NETWORK_BLOCKCHAIN:"Ĉiuj operacioj pri la mono estas registritaj en granda konto-libro <b>publika kaj nefalsigebla</b>, ankaŭ nomata <b>blokĉeno</b> (<em>BlockChain</em> en la angla).",NETWORK_PEERS:"La <b>nodoj</b> videblaj ĉi tie rilatas al la <b>komputiloj, kiuj ĝisdatigas kaj kontrolas</b> la blokĉenon.<br/><br/>Ju pli estas nodoj, des pli la mono havas administradon <b>malcentrigitan</b> kaj fidindan.",NETWORK_PEERS_BLOCK_NUMBER:"Tiu ĉi <b>numero</b> (verda) indikas la <b>lastan blokon validigitan</b> por tiu ĉi nodo (lasta paĝo skribita en la granda konto-libro).<br/><br/>La verda koloro indikas, ke tiu ĉi bloko estas validigita ankaŭ de <b>la plej multaj el la aliaj nodoj</b>.",NETWORK_PEERS_PARTICIPATE:'<b>Ĉiu membro</b>, ekipita per komputilo kun interreto, <b>povas partopreni aldonante nodon</b>. Sufiĉas <b>instali la programon Duniter</b> (libera kaj senpaga). <a href="{{installDocUrl}}" target="_system">Vidi la gvidilon pri instalado >></a>.',MENU_BTN_ACCOUNT:"La menuo <b>{{'ACCOUNT.TITLE'|translate}}</b> ebligas aliri la administradon de via konto.",MENU_BTN_ACCOUNT_MEMBER:"Konsultu ĉi tie la staton de via konto kaj la informojn pri viaj atestaĵoj.",WALLET_CERTIFICATIONS:"Alklaku ĉi tien por konsulti la detalon pri viaj atestaĵoj (ricevitaj kaj senditaj).",WALLET_RECEIVED_CERTIFICATIONS:"Alklaku ĉi tien por konsulti la detalon pri viaj <b>ricevitaj atestaĵoj</b>.",WALLET_GIVEN_CERTIFICATIONS:"Alklaku ĉi tien por konsulti la detalon pri viaj <b>senditaj atestaĵoj</b>.",WALLET_BALANCE:"La <b>saldo</b> de via konto afiŝiĝas tie ĉi.",WALLET_BALANCE_RELATIVE:"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>La uzata unuo (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifas, ke la sumo en {{currency|capitalize}} estis dividita per la <b>Universala Dividendo</b> (UD) kunkreita de ĉiu membro.<br/><br/>Nuntempe 1 UD valoras {{currentUD|formatInteger}} {{currency|capitalize}}j.",WALLET_BALANCE_CHANGE_UNIT:"Vi povos <b>ŝanĝi la unuon</b> afiŝitan por la sumoj en la <b><i class=\"icon ion-android-settings\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Ekzemple por vidigi la sumojn <b>rekte en {{currency|capitalize}}</b>, prefere ol en relativa unuo.",WALLET_PUBKEY:"Jen la publika ŝlosilo de via konto. Vi povas sciigi ĝin al aliulo, por ke li identigu pli simple vian konton.",WALLET_SEND:"Efektivigi pagon per kelkaj klakoj.",WALLET_SEND_NO_MONEY:"Efektivigi pagon per kelkaj klakoj.<br/>(Via saldo ankoraŭ ne permesas tion)",WALLET_OPTIONS:"Tiu ĉi butono ebligas aliri la <b>agojn pri aliĝo</b> kaj sekureco.<br/><br/>Ne forgesu okulumi al ĝi!",WALLET_RECEIVED_CERTS:"Afiŝiĝos ĉi tie la listo de la personoj, kiuj atestis vin.",WALLET_CERTIFY:"La butono <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> ebligas elekti identecon kaj atesti ĝin.<br/><br/>Nur uzantoj <b>jam membroj</b> povas atesti aliajn.",WALLET_CERT_STOCK:"Via stoko da atestaĵoj (senditaj) estas limigita je <b>{{sigStock}} atestaĵoj</b>.<br/><br/>Tiu stoko plu evoluas laŭ la tempo, samtempe kiam la atestaĵoj malvalidiĝas.",MENU_BTN_TX_MEMBER:"La menuo <b>{{'MENU.TRANSACTIONS'|translate}}</b> ebligas konsulti vian konton, la liston de viaj spezoj, kaj sendi pagon.",MENU_BTN_TX:"Konsultu ĉi tie <b>la liston de viaj spezoj</b> kaj efektivigu novajn operaciojn.",MENU_BTN_WOT:"La menuo <b>{{'MENU.WOT'|translate}}</b> ebligas traserĉi inter la <b>uzantoj</b> de la mono (membroj aŭ ne).",WOT_SEARCH_TEXT_XS:"Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de pseŭdonimo</b> (aŭ de publika ŝlosilo).<br/><br/>La serĉado ekos aŭtomate.",WOT_SEARCH_TEXT:"Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de de pseŭdonimo</b> (aŭ de publika ŝlosilo). <br/><br/>Premu poste sur la klavon <b>Enigi</b> por ekigi la serĉadon.",WOT_SEARCH_RESULT:"Vidigu la detalan slipon simple <b>alklakante</b> linion.",WOT_VIEW_CERTIFICATIONS:"La linio <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> montras kiom da membroj validigis tiun ĉi identecon.<br/><br/>Tiuj atestaĵoj pruvas, ke la konto apartenas al <b>persono homa kaj vivanta</b>, havanta <b>neniun alian membro-konton</b>.",WOT_VIEW_CERTIFICATIONS_COUNT:"Necesas almenaŭ <b>{{sigQty}} atestaĵoj</b> por fariĝi membro kaj ricevi la <b>Universalan Dividendon</b>.",WOT_VIEW_CERTIFICATIONS_CLICK:"Alklaki ĉi tien ebligas malfermi <b>la liston de ĉiuj atestaĵoj</b> de la identeco (ricevitaj kaj senditaj).",WOT_VIEW_CERTIFY:"La butono <b>{{'WOT.BTN_CERTIFY'|translate}}</b> ebligas aldoni vian atestaĵon al tiu identeco.",CERTIFY_RULES:"<b>Atenton:</b> Atestu nur <b>personojn fizikajn vivantajn</b>, posedantajn neniun alian membro-konton.<br/><br/>La sekureco de la mono dependas de ĉies atentego!",MENU_BTN_SETTINGS:"La <b>{{'MENU.SETTINGS'|translate}}</b> ebligos al vi agordi la programon.",HEADER_BAR_BTN_PROFILE:"Alklaku ĉi tien por aliri vian <b>uzanto-profilon.</b>",SETTINGS_CHANGE_UNIT:"Vi povos <b>ŝanĝi la afiŝ-unuon</b> de la sumoj alklakante ĉi-supren.<br/><br/>- Malaktivigu la kromaĵon por afiŝi sumojn en {{currency|capitalize}}.<br/>- Aktivigu la kromaĵon por relativa afiŝado en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (ĉiuj sumoj estos <b>dividitaj</b> per la Universala Dividendo aktuala).",END_LOGIN:"Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Bonan daŭrigon al vi, en la nova mondo de la<b>libera ekonomio</b>!",END_NOT_LOGIN:"Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Se vi deziras partopreni en la mono {{currency|capitalize}}, sufiĉos al vi alklaki <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> ĉi-sube."}}}),e.translations("fr-FR",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"date : {{build}}",PUBKEY:"Clé publique",MEMBER:"Membre",BLOCK:"Bloc",BTN_OK:"OK",BTN_YES:"Oui",BTN_NO:"Non",BTN_SEND:"Envoyer",BTN_SEND_MONEY:"Faire un virement",BTN_SEND_MONEY_SHORT:"Virement",BTN_SAVE:"Enregistrer",BTN_YES_SAVE:"Oui, Enregistrer",BTN_YES_CONTINUE:"Oui, Continuer",BTN_SHOW:"Voir",BTN_SHOW_PUBKEY:"Afficher la clé publique",BTN_RELATIVE_UNIT:"Afficher les montants en DU ?",BTN_BACK:"Retour",BTN_NEXT:"Suivant",BTN_IMPORT:"Importer",BTN_CANCEL:"Annuler",BTN_CLOSE:"Fermer",BTN_LATER:"Plus tard",BTN_LOGIN:"Se connecter",BTN_LOGOUT:"Déconnexion",BTN_ADD_ACCOUNT:"Nouveau compte",BTN_SHARE:"Partager",BTN_EDIT:"Modifier",BTN_DELETE:"Supprimer",BTN_ADD:"Ajouter",BTN_SEARCH:"Rechercher",BTN_REFRESH:"Actualiser",BTN_RETRY:"Recommencer",BTN_START:"Commencer",BTN_CONTINUE:"Continuer",BTN_CREATE:"Créer",BTN_UNDERSTOOD:"J'ai compris",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Visite guidée",BTN_HELP_TOUR_SCREEN:"Découvrir cet écran",BTN_DOWNLOAD:"Télécharger",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Télécharger le relevé du compte",BTN_MODIFY:"Modifier",CHOOSE_FILE:"Déposez votre fichier <br/>ou cliquez pour le sélectionner",DAYS:"jours",NO_ACCOUNT_QUESTION:"Pas encore de compte ? Créez-en un gratuitement !",SEARCH_NO_RESULT:"Aucun résultat trouvé",LOADING:"Veuillez patienter...",LOADING_WAIT:"Veuillez patienter...<br/><small>(Attente de disponibilité du noeud)</small>",SEARCHING:"Recherche en cours...",FROM:"De",TO:"À",COPY:"Copier",LANGUAGE:"Langue",UNIVERSAL_DIVIDEND:"Dividende universel",UD:"DU",DATE_PATTERN:"DD/MM/YY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(vide)",UID:"Pseudonyme",ENABLE:"Activé",DISABLE:"Désactivé",RESULTS_LIST:"Résultats",RESULTS_COUNT:"{{count}} résultats",EXECUTION_TIME:"exécuté en {{duration|formatDurationMs}}",SHOW_VALUES:"Afficher les valeurs en clair ?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filtres",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",POPOVER_SHARE:{TITLE:"Partager",SHARE_ON_TWITTER:"Partager sur Twitter",SHARE_ON_FACEBOOK:"Partager sur Facebook",SHARE_ON_DIASPORA:"Partager sur Diaspora*",SHARE_ON_GOOGLEPLUS:"Partager sur Google+"},FILE:{DATE:"Date :",TYPE:"Type :",SIZE:"Taille :",VALIDATING:"Validation en cours..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choisir la source :",BTN_PICTURE_GALLERY:"Galerie",BTN_PICTURE_CAMERA:"<b>Caméra</b>"},MENU:{HOME:"Accueil",WOT:"Annuaire",CURRENCY:"Monnaie",ACCOUNT:"Mon compte",WALLETS:"Mes portefeuilles",TRANSFER:"Virement",SCAN:"Scanner",SETTINGS:"Paramètres",NETWORK:"Réseau",TRANSACTIONS:"Mes opérations"},ABOUT:{TITLE:"À propos",LICENSE:"Application <b>libre</b> (Licence GNU AGPLv3).",LATEST_RELEASE:"Il existe une <b>version plus récente</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Veuillez mettre à jour {{'COMMON.APP_NAME'|translate}} (dernière version : <b>v{{version}}</b>)",CODE:"Code source :",OFFICIAL_WEB_SITE:"Site web officiel :",DEVELOPERS:"Développé par :",FORUM:"Forum :",DEV_WARNING:"Avertissement",DEV_WARNING_MESSAGE:"Cette application est toujours en développement.<br/>N'hésitez pas à nous remonter les anomalies rencontrées !",DEV_WARNING_MESSAGE_SHORT:"Cette application est toujours en développement.",REPORT_ISSUE:"Remonter un problème"},HOME:{TITLE:"Cesium",MESSAGE:"Bienvenue sur {{'COMMON.APP_NAME'|translate}} !",MESSAGE_CURRENCY:"Échanger en {{currency|abbreviate}} devient... juste simple !",BTN_CURRENCY:"Explorer la monnaie {{name|abbreviate}}",BTN_ABOUT:"à propos",BTN_HELP:"Aide en ligne",REPORT_ISSUE:"anomalie",NOT_YOUR_ACCOUNT_QUESTION:"Vous n'êtes pas propriétaire du compte<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?",BTN_CHANGE_ACCOUNT:"Déconnecter ce compte",CONNECTION_ERROR:'Nœud <b>{{server}}</b> d\'accès à la monnaie injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud <a class="positive" ng-click="doQuickFix(\'settings\')">dans les paramètres</a>.'},SETTINGS:{TITLE:"Paramètres",DISPLAY_DIVIDER:"Affichage",STORAGE_DIVIDER:"Stockage",NETWORK_SETTINGS:"Réseau",PEER:"Adresse du nœud Duniter",PEER_SHORT:"Adresse du nœud",PEER_CHANGED_TEMPORARY:"Adresse utilisée temporairement",USE_LOCAL_STORAGE:"Activer le stockage local",USE_LOCAL_STORAGE_HELP:"Permet de sauvegarder vos paramètres",ENABLE_HELPTIP:"Activer les bulles d'aide contextuelles",ENABLE_UI_EFFECTS:"Activer les effets visuels",HISTORY_SETTINGS:"Mes opérations",DISPLAY_UD_HISTORY:"Afficher les dividendes produits ?",AUTHENTICATION_SETTINGS:"Authentification",AUTO_LOGOUT:"Déconnexion automatique",AUTO_LOGOUT_OPTION_NEVER:"Jamais",AUTO_LOGOUT_OPTION_SECONDS:"Après {{value}} secondes",AUTO_LOGOUT_OPTION_MINUTE:"Après {{value}} minute",AUTO_LOGOUT_OPTION_MINUTES:"Après {{value}} minutes",AUTO_LOGOUT_OPTION_HOUR:"Après {{value}} heure",AUTO_LOGOUT_HELP:"Délai d'inactivité avant déconnexion",REMEMBER_ME:"Se souvenir de moi ?",REMEMBER_ME_HELP:"Permet de rester toujours connecté.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restaurer les valeurs par défaut",EXPERT_MODE:"Activer le mode expert",EXPERT_MODE_HELP:"Permet un affichage plus détaillé",POPUP_PEER:{TITLE:"Nœud Duniter",HOST:"Adresse",HOST_HELP:"Adresse : serveur:port",USE_SSL:"Sécurisé ?",USE_SSL_HELP:"(Chiffrement SSL)",BTN_SHOW_LIST:"Liste des noeuds"}},BLOCKCHAIN:{HASH:"Hash : {{hash}}",VIEW:{HEADER_TITLE:"Bloc #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Bloc courant",TITLE:"Bloc #{{number|formatInteger}}",COMPUTED_BY:"Calculé par le noeud de",SHOW_RAW:"Voir le fichier brut",TECHNICAL_DIVIDER:"Informations techniques",VERSION:"Version du format",HASH:"Hash calculé",UNIVERSAL_DIVIDEND_HELP:"Monnaie co-produite par chacun des {{membersCount}} membres",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Difficulté minimale",POW_MIN_HELP:"Difficulté imposée pour le calcul du hash",DATA_DIVIDER:"Données",IDENTITIES_COUNT:"Nouvelles identités",JOINERS_COUNT:"Nouveaux membres",ACTIVES_COUNT:"Renouvellements",ACTIVES_COUNT_HELP:"Membres ayant renouvelé leur adhésion",LEAVERS_COUNT:"Membres sortants",LEAVERS_COUNT_HELP:"Membres ne souhaitant plus de certification",EXCLUDED_COUNT:"Membres exclus",EXCLUDED_COUNT_HELP:"Anciens membres exclus par non renouvellement ou manque de certifications",REVOKED_COUNT:"Identités révoquées",REVOKED_COUNT_HELP:"Ces comptes ne pourront plus être membres",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Opération de change",TX_OUTPUT_UNLOCK_CONDITIONS:"Conditions de déblocage",TX_OUTPUT_OPERATOR:{AND:"et",OR:"ou"},TX_OUTPUT_FUNCTION:{SIG:"<b>Signature</b> de ",XHX:"<b>Mot de passe</b>, dont SHA256 =",CSV:"Bloqué pendant",CLTV:"Bloqué jusqu'à"}},LOOKUP:{TITLE:"Blocs",NO_BLOCK:"Aucun bloc",LAST_BLOCKS:"Derniers blocs :",BTN_COMPACT:"Compacter"}},CURRENCY:{VIEW:{TITLE:"Monnaie",TAB_CURRENCY:"Monnaie",TAB_WOT:"Toile de confiance",TAB_NETWORK:"Réseau",TAB_BLOCKS:"Blocs",CURRENCY_SHORT_DESCRIPTION:"{{currency|abbreviate}} est une <b>monnaie libre</b>, démarrée {{firstBlockTime|formatFromNow}}. Elle compte actuellement <b>{{N}} membres</b>, qui produisent et perçoivent un <a ng-click=\"showHelpModal('ud')\">Dividende Universel</a> (DU), chaque {{dt|formatPeriod}}.",NETWORK_RULES_DIVIDER:"Règles du réseau",CURRENCY_NAME:"Nom de la monnaie",MEMBERS:"Nombre de membres",MEMBERS_VARIATION:"Variation depuis le dernier DU",MONEY_DIVIDER:"Monnaie",MASS:"Masse monétaire",SHARE:"Masse par membre",UD:"Dividende universel",C_ACTUAL:"Croissance actuelle",MEDIAN_TIME:"Heure de la blockchain",POW_MIN:"Niveau minimal de difficulté de calcul",MONEY_RULES_DIVIDER:"Règles de la monnaie",C_RULE:"Croissance théorique cible",UD_RULE:"Calcul du dividende universel",DT_REEVAL:"Période de revalorisation du DU",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Tous les <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date de la 1ère revalorisation",SIG_QTY_RULE:"Nombre de certifications requises pour devenir membre",SIG_STOCK:"Nombre maximal de certifications émises par membre",SIG_PERIOD:"Délai minimal d'attente entre 2 certifications successives émises par une même personne",SIG_WINDOW:"Délai limite de prise en compte d'une certification",SIG_VALIDITY:"Durée de vie d'une certification qui a été prise en compte",MS_WINDOW:"Délai limite de prise en compte d'une demande d'adhésion comme membre",MS_VALIDITY:"Durée de vie d'une adhésion qui a été prise en compte",STEP_MAX:"Distance maximale, par les certifications, entre un nouvel entrant et les membres référents",WOT_RULES_DIVIDER:"Règles de la toile de confiance",SENTRIES:"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent",SENTRIES_FORMULA:"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent (formule)",XPERCENT:"Pourcentage minimum de membres référents à atteindre pour respecter la règle de distance",AVG_GEN_TIME:"Temps moyen entre deux blocs",CURRENT:"actuel",MATH_CEILING:"PLAFOND",DISPLAY_ALL_RULES:"Afficher toutes les règles ?",BTN_SHOW_LICENSE:"Voir la licence",WOT_DIVIDER:"Toile de confiance"},LICENSE:{TITLE:"Licence de la monnaie",BTN_DOWNLOAD:"Télécharger le fichier",NO_LICENSE_FILE:"Fichier de licence non trouvé."}},NETWORK:{VIEW:{MEDIAN_TIME:"Heure de la blockchain",LOADING_PEERS:"Chargement des noeuds...",NODE_ADDRESS:"Adresse :",SOFTWARE:"Logiciel",WARN_PRE_RELEASE:"Pré-version (dernière version stable : <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> disponible",WS2PID:"Identifiant :",PRIVATE_ACCESS:"Accès privé",POW_PREFIX:"Préfixe de preuve de travail :",ENDPOINTS:{BMAS:"Interface sécurisée (SSL)",BMATOR:"Interface réseau TOR",WS2P:"Interface WS2P",ES_USER_API:"Noeud de données Cesium+"}},INFO:{ONLY_SSL_PEERS:"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS."}},PEER:{PEERS:"Nœuds",SIGNED_ON_BLOCK:"Signé sur le bloc",MIRROR:"miroir",MIRRORS:"Miroirs",MIRROR_PEERS:"Nœuds miroirs",PEER_LIST:"Liste des nœuds",MEMBERS:"Membres",MEMBER_PEERS:"Nœuds membres",ALL_PEERS:"Tous les nœuds",DIFFICULTY:"Difficulté",API:"API",CURRENT_BLOCK:"Bloc #",POPOVER_FILTER_TITLE:"Filtre",OFFLINE:"Hors ligne",OFFLINE_PEERS:"Nœuds hors ligne",BTN_SHOW_PEER:"Voir le nœud",VIEW:{TITLE:"Nœud",OWNER:"Appartient à",SHOW_RAW_PEERING:"Voir la fiche de pair",SHOW_RAW_CURRENT_BLOCK:"Voir le dernier bloc (format brut)",LAST_BLOCKS:"Derniers blocs connus",KNOWN_PEERS:"Nœuds connus :",GENERAL_DIVIDER:"Informations générales",ERROR:{LOADING_TOR_NODE_ERROR:"Récupération des informations du noeud impossible. Le délai d'attente est dépassé.",LOADING_NODE_ERROR:"Récupération des informations du noeud impossible"}}},WOT:{SEARCH_HELP:"Recherche (pseudo ou clé publique)",SEARCH_INIT_PHASE_WARNING:"Durant la phase de pré-inscription, la recherche des inscriptions en attente <b>peut être longue</b>. Merci de patienter...",REGISTERED_SINCE:"Inscrit le",REGISTERED_SINCE_BLOCK:"Inscrit au bloc #",NO_CERTIFICATION:"Aucune certification validée",NO_GIVEN_CERTIFICATION:"Aucune certification émise",NOT_MEMBER_PARENTHESIS:"(non membre)",IDENTITY_REVOKED_PARENTHESIS:"(identité révoquée)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(en cours de révocation)",EXPIRE_IN:"Expiration",NOT_WRITTEN_EXPIRE_IN:"Date limite<br/>de traitement",EXPIRED:"Expiré",PSEUDO:"Pseudonyme",SIGNED_ON_BLOCK:"Emise au bloc #{{block}}",WRITTEN_ON_BLOCK:"Ecrite au bloc #{{block}}",GENERAL_DIVIDER:"Informations générales",NOT_MEMBER_ACCOUNT:"Compte simple (non membre)",NOT_MEMBER_ACCOUNT_HELP:"Il s'agit d'un simple portefeuille, sans demande d'adhésion en attente.",TECHNICAL_DIVIDER:"Informations techniques",BTN_CERTIFY:"Certifier",BTN_YES_CERTIFY:"Oui, certifier",BTN_SELECT_AND_CERTIFY:"Nouvelle certification",ACCOUNT_OPERATIONS:"Opérations sur le compte",VIEW:{POPOVER_SHARE_TITLE:"Identité {{title}}"},LOOKUP:{TITLE:"Annuaire",NEWCOMERS:"Nouveaux membres :",NEWCOMERS_COUNT:"{{count}} membres",PENDING:"Inscriptions en attente :",PENDING_COUNT:"{{count}} inscriptions en attente",REGISTERED:"Inscrit {{time | formatFromNow}}",MEMBER_FROM:"Membre depuis {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Nouveaux membres",BTN_PENDING:"Inscriptions en attente",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",NO_PENDING:"Aucune inscription en attente.",NO_NEWCOMERS:"Aucun membre."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Recherche"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Certifications reçues",LIST:"Détail des certifications reçues",PENDING_LIST:"Certifications en attente de traitement",RECEIVED:"Certifications reçues",RECEIVED_BY:"Certifications reçues par {{uid}}",ERROR:"Certifications reçues en erreur",SENTRY_MEMBER:"Membre référent"},OPERATIONS:{TITLE:"{{uid}} - Opérations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications émises",SUMMARY:"Certifications émises",LIST:"Détail des certifications émises",PENDING_LIST:"Certifications en attente de traitement",SENT:"Certifications émises",SENT_BY:"Certifications émises par {{uid}}",ERROR:"Certifications émises en erreur"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Connexion',SCRYPT_FORM_HELP:"Veuillez saisir vos identifiants.<br>Pensez à vérifier que la clé publique est celle de votre compte.",PUBKEY_FORM_HELP:"Veuillez saisir une clé publique de compte :",FILE_FORM_HELP:"Choisissez le fichier de trousseau à utiliser :",SCAN_FORM_HELP:"Scanner le QR code d'un portefeuille.",SALT:"Identifiant",SALT_HELP:"Identifiant",SHOW_SALT:"Afficher l'identifiant ?",PASSWORD:"Mot de passe",PASSWORD_HELP:"Mot de passe",PUBKEY_HELP:"Exemple : « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Vous n'avez pas encore de compte ?",HAVE_ACCOUNT_QUESTION:"Vous avez déjà un compte ?",CREATE_ACCOUNT:"Créer un compte...",CREATE_FREE_ACCOUNT:"Créer un compte gratuitement",FORGOTTEN_ID:"Mot de passe oublié ?",ASSOCIATED_PUBKEY:"Clé publique du trousseau :",BTN_METHODS:"Autres méthodes",BTN_METHODS_DOTS:"Changer de méthode...",METHOD_POPOVER_TITLE:"Méthodes",MEMORIZE_AUTH_FILE:"Mémoriser ce trousseau le temps de la session de navigation",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> Vous avez été <b>déconnecté</b> automatiquement, suite à une inactivité prolongée.',BTN_RELOGIN:"Me reconnecter",IDLE_WARNING:"Vous allez être déconnecté... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Identifiant et mot de passe",SCRYPT_ADVANCED:"Salage avancé",FILE:"Fichier de trousseau",PUBKEY:"Clé publique ou pseudonyme",SCAN:"Scanner un QR code"},SCRYPT:{SIMPLE:"Salage léger",DEFAULT:"Salage standard",SECURE:"Salage sûr",HARDEST:"Salage le plus sûr",EXTREME:"Salage extrême",USER:"Salage personnalisé",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{HELP:"Format de fichier attendu : <b>.yml</b> ou <b>.dunikey</b> (type PubSec, WIF ou EWIF)."}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Authentification',METHOD_LABEL:"Méthode d'authentification",BTN_AUTH:"S'authentifier",SCRYPT_FORM_HELP:"Veuillez vous authentifier :",ERROR:{SCRYPT_DEFAULT:"Salage simple (par défaut)",SCRYPT_ADVANCED:"Salage avancé",FILE:"Fichier de trousseau"}},ACCOUNT:{TITLE:"Mon compte",BALANCE:"Solde",LAST_TX:"Dernières transactions",BALANCE_ACCOUNT:"Solde du compte",NO_TX:"Aucune transaction",SHOW_MORE_TX:"Afficher plus",SHOW_ALL_TX:"Afficher tout",TX_FROM_DATE:"(limite actuelle à {{fromTime|formatFromNowShort}})",PENDING_TX:"Transactions en cours de traitement",ERROR_TX:"Transactions non exécutées",ERROR_TX_SENT:"Transactions envoyées en échec",PENDING_TX_RECEIVED:"Transactions en attente de réception",EVENTS:"Evénements",WAITING_MEMBERSHIP:"Demande d'adhésion envoyée. En attente d'acceptation.",WAITING_CERTIFICATIONS:"Vous devez obtenir {{needCertificationCount}} certification(s) pour devenir membre.",WILL_MISSING_CERTIFICATIONS:"Vous allez bientôt <b>manquer de certifications</b> (au moins {{willNeedCertificationCount}} sont nécessaires)",WILL_NEED_RENEW_MEMBERSHIP:"Votre adhésion comme membre <b>va expirer {{membershipExpiresIn|formatDurationTo}}</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a> d'ici là.",NEED_RENEW_MEMBERSHIP:"Vous n'êtes plus membre, car votre adhésion <b>a expiré</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",CERTIFICATION_COUNT:"Certifications reçues",CERTIFICATION_COUNT_SHORT:"Certifications",SIG_STOCK:"Certifications envoyées",BTN_RECEIVE_MONEY:"Encaisser",BTN_MEMBERSHIP_IN_DOTS:"Devenir membre...",BTN_MEMBERSHIP_RENEW:"Renouveler l'adhésion",BTN_MEMBERSHIP_RENEW_DOTS:"Renouveler l'adhésion...",BTN_MEMBERSHIP_OUT_DOTS:"Arrêter l'adhésion...",BTN_SEND_IDENTITY_DOTS:"Publier son identité...",BTN_SECURITY_DOTS:"Compte et sécurité...",BTN_SHOW_DETAILS:"Afficher les infos techniques",LOCKED_OUTPUTS_POPOVER:{TITLE:"Montant verrouillé",DESCRIPTION:"Voici les conditions de déverrouillage de ce montant :",DESCRIPTION_MANY:"Cette transaction est composée de plusieurs parties, dont voici les conditions de déverrouillage :",LOCKED_AMOUNT:"Conditions pour le montant :"},NEW:{TITLE:"Inscription",INTRO_WARNING_TIME:"La création d'un compte sur {{name|capitalize}} est très simple. Veuillez néanmoins prendre suffisament de temps pour faire correctement cette formalité (pour ne pas oublier les identifiants, mots de passe, etc.).",INTRO_WARNING_SECURITY:"Vérifier que le matériel que vous utilisez actuellement (ordinateur, tablette, téléphone) <b>est sécurisé et digne de confiance</b>.",INTRO_WARNING_SECURITY_HELP:"Anti-virus à jour, pare-feu activé, session protégée par mot de passe ou code pin, etc.",INTRO_HELP:"Cliquez sur <b>{{'COMMON.BTN_START'|translate}}</b> pour débuter la création de compte. Vous serez guidé étape par étape.",REGISTRATION_NODE:"Votre inscription sera enregistrée via le noeud Duniter <b>{{server}}</b>, qui le diffusera ensuite au reste du réseau de la monnaie.",REGISTRATION_NODE_HELP:"Si vous ne faites pas confiance à ce noeud, veuillez en changer <a ng-click=\"doQuickFix('settings')\">dans les paramètres</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Choisissez le type de compte à créer :",MEMBER_ACCOUNT:"Compte membre",MEMBER_ACCOUNT_TITLE:"Création d'un compte membre",MEMBER_ACCOUNT_HELP:"Si vous n'êtes pas encore inscrit en tant qu'individu (un seul compte possible par individu). Ce compte permet de co-produire la monnaie, en recevant un <b>dividende universel</b> chaque {{parameters.dt|formatPeriod}}.",WALLET_ACCOUNT:"Simple portefeuille",WALLET_ACCOUNT_TITLE:"Création d'un portefeuille",WALLET_ACCOUNT_HELP:"Pour tous les autres cas, par exemple si vous avez besoin d'un compte supplémentaire.<br/>Aucun dividende universel ne sera créé par ce compte.",SALT_WARNING:"Choisissez votre identifiant.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez-le bien</b>.<br/>En cas de perte, plus personne ne pourra accéder à votre compte !",PASSWORD_WARNING:"Choisissez un mot de passe.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez bien ce mot de passe</b>.<br/>En cas de perte, plus personne ne pourra accéder à votre compte !",PSEUDO_WARNING:"Choisissez un pseudonyme.<br/>Il sert aux autres membres, pour vous identifier plus facilement.<div class='hidden-xs'><br/>Il <b>ne pourra pas être modifié</b>, sans refaire un compte.</div><br/><br/>Il ne doit contenir <b>ni espace, ni de caractère accentué</b>.<div class='hidden-xs'><br/>Exemple : <span class='gray'>SophieDupond, MarcelChemin, etc.</span>",PSEUDO:"Pseudonyme",PSEUDO_HELP:"Pseudonyme",SALT_CONFIRM:"Confirmation",SALT_CONFIRM_HELP:"Confirmation de l'identifiant",PASSWORD_CONFIRM:"Confirmation",PASSWORD_CONFIRM_HELP:"Confirmation du mot de passe",SLIDE_6_TITLE:"Confirmation :",COMPUTING_PUBKEY:"Calcul en cours...",LAST_SLIDE_CONGRATULATION:"Vous avez saisi toutes les informations nécessaires : Bravo !<br/>Vous pouvez maintenant <b>envoyer la demande de création</b> de compte.</b><br/><br/>Pour information, la clé publique ci-dessous identifiera votre futur compte.<br/>Elle pourra être communiquée à des tiers pour recevoir leur paiement.<br/><b>Il n'est pas obligatoire</b> de la noter ici, vous pourrez également le faire plus tard.",CONFIRMATION_MEMBER_ACCOUNT:"<b class=\"assertive\">Avertissement :</b> l'identifiant, le mot de passe et le pseudonyme ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir envoyer cette demande d'inscription ?",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Avertissement :</b> l\'identifiant et le mot de passe ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir continuer avec ces identifiants ?',CHECKING_PSEUDO:"Vérification...",PSEUDO_AVAILABLE:"Pseudonyme disponible",PSEUDO_NOT_AVAILABLE:"Pseudonyme non disponible",INFO_LICENSE:"Avant de créer un compte membre, <b>veuillez lire et accepter la licence</b> d'usage de la monnaie :",BTN_ACCEPT:"J'accepte",BTN_ACCEPT_LICENSE:"J'accepte la licence"},POPUP_REGISTER:{TITLE:"Choisissez un pseudonyme",HELP:"Un pseudonyme est obligatoire pour devenir membre."},SECURITY:{ADD_QUESTION:"Ajouter une question personnalisée",BTN_CLEAN:"Vider",BTN_RESET:"Réinitialiser",DOWNLOAD_REVOKE:"Sauvegarder mon fichier de révocation",DOWNLOAD_REVOKE_HELP:"Disposer d'un fichier de révocation est important, par exemple en cas de perte de vos identifiants. Il vous permet de <b>sortir ce compte de la toile de confiance</b>, en redevenant ainsi un simple portefeuille.",HELP_LEVEL:"Pour générer un fichier de sauvegarde de vos identifiants, choisissez <strong> au moins {{nb}} questions :</strong>",LEVEL:"Niveau de sécurité",LOW_LEVEL:'Faible <span class="hidden-xs">(2 questions minimum)</span>',MEDIUM_LEVEL:'Moyen <span class="hidden-xs">(4 questions minimum)</span>',QUESTION_1:"Comment s'appelait votre meilleur ami lorsque vous étiez adolescent ?",QUESTION_2:"Comment s'appelait votre premier animal de compagnie ?",QUESTION_3:"Quel est le premier plat que vous avez appris à cuisiner ?",QUESTION_4:"Quel est le premier film que vous avez vu au cinéma ?",QUESTION_5:"Où êtes-vous allé la première fois que vous avez pris l'avion ?",QUESTION_6:"Comment s'appelait votre instituteur préféré à l'école primaire ?",QUESTION_7:"Quel serait selon vous le métier idéal ?",QUESTION_8:"Quel est le livre pour enfants que vous préférez ?",QUESTION_9:"Quel était le modèle de votre premier véhicule ?",QUESTION_10:"Quel était votre surnom lorsque vous étiez enfant ?",QUESTION_11:"Quel était votre personnage ou acteur de cinéma préféré lorsque vous étiez étudiant ?",QUESTION_12:"Quel était votre chanteur ou groupe préféré lorsque vous étiez étudiant ?",QUESTION_13:"Dans quelle ville vos parents se sont-ils rencontrés ?",QUESTION_14:"Comment s'appelait votre premier patron ?",QUESTION_15:"Quel est le nom de la rue où vous avez grandi ?",QUESTION_16:"Quel est le nom de la première plage où vous vous êtes baigné ?",QUESTION_17:"Quel est le premier album que vous avez acheté ?",QUESTION_18:"Quel est le nom de votre équipe de sport préférée ?",QUESTION_19:"Quel était le métier de votre grand-père ?",RECOVER_ID:"Retrouver mon mot de passe...",RECOVER_ID_HELP:"Si vous disposez d'un <b>fichier de sauvegarde de vos identifiants</b>, vous pouvez les retrouver en répondant correctement à vos questions personnelles.",REVOCATION_WITH_FILE:"Révoquer mon compte membre...",REVOCATION_WITH_FILE_HELP:"Si vous avez <b>définitivement perdu vos identifiants</b> de compte membre (ou que la sécurité du compte est compromise), vous pouvez utiliser <b>le fichier de révocation</b> du compte pour <b>forcer sa sortie définitive de la toile de confiance</b>.",REVOCATION_WALLET:"Révoquer immédiatement ce compte",REVOCATION_WALLET_HELP:"Demander la révocation de votre identité entraîne la <b>sortie de la toile de confiance</b> (définitive pour le pseudonyme et la clé publique associés). Le compte ne pourra plus produire de Dividende Universel.<br/>Vous pourrez toutefois encore vous y connecter, comme à un simple portefeuille.",REVOCATION_FILENAME:"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",SAVE_ID:"Sauvegarder mes identifiants...",SAVE_ID_HELP:"Création d'un fichier de sauvegarde, pour <b>retrouver votre mot de passe</b> (et l'identifiant) <b>en cas de d'oubli</b>. Le fichier est <b>sécurisé</b> (chiffré) à l'aide de questions personnelles.",STRONG_LEVEL:'Fort <span class="hidden-xs ">(6 questions minimum)</span>',TITLE:"Compte et sécurité"},FILE_NAME:"{{currency}} - Relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Date",AMOUNT:"Montant",COMMENT:"Commentaire"}},TRANSFER:{TITLE:"Virement",SUB_TITLE:"Faire un virement",FROM:"De",TO:"À",AMOUNT:"Montant",AMOUNT_HELP:"Montant",COMMENT:"Commentaire",COMMENT_HELP:"Commentaire",BTN_SEND:"Envoyer",BTN_ADD_COMMENT:"Saisir un commentaire ?",MODAL:{TITLE:"Virement"}},ERROR:{POPUP_TITLE:"Erreur",UNKNOWN_ERROR:"Erreur inconnue",CRYPTO_UNKNOWN_ERROR:"Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.",FIELD_REQUIRED:"Champ obligatoire",FIELD_TOO_SHORT:"Valeur trop courte",FIELD_TOO_SHORT_WITH_LENGTH:"Valeur trop courte ({{minLength}} caractères min)",FIELD_TOO_LONG:"Valeur trop longue",FIELD_TOO_LONG_WITH_LENGTH:"Valeur trop longue ({{maxLength}} caractères max)",FIELD_MIN:"Valeur minimale : {{min}}",FIELD_MAX:"Valeur maximale : {{max}}",FIELD_ACCENT:"Caractères accentués et virgules non autorisés",FIELD_NOT_NUMBER:"Valeur numérique attendue",FIELD_NOT_INT:"Valeur entière attendue",FIELD_NOT_EMAIL:"Adresse email non valide",PASSWORD_NOT_CONFIRMED:"Ne correspond pas au mot de passe",SALT_NOT_CONFIRMED:"Ne correspond pas à l'identifiant",SEND_IDENTITY_FAILED:"Echec de l'inscription",SEND_CERTIFICATION_FAILED:"Echec de la certification",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Vous ne pouvez pas effectuer de certification, car votre compte n'est <b>pas membre</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"Vous ne pouvez pas effectuer de certification, car votre compte n'est pas encore membre.<br/><br/>Il vous manque encore des certifications, ou bien celles-ci n'ont pas encore été validées.",NOT_MEMBER_FOR_CERTIFICATION:"Votre compte n'est pas encore membre.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Compte non certifiable. Aucune demande d'adhésion n'a été faite, ou bien elle n'a pas été renouvelée.",LOGIN_FAILED:"Erreur lors de la connexion.",LOAD_IDENTITY_FAILED:"Erreur de chargement de l'identité.",LOAD_REQUIREMENTS_FAILED:"Erreur de chargement des prérequis de l'identité.",SEND_MEMBERSHIP_IN_FAILED:"Echec de la tentative d'entrée dans la communauté.",SEND_MEMBERSHIP_OUT_FAILED:"Echec de l'arrêt de l'adhésion.",REFRESH_WALLET_DATA:"Echec du rafraîchissement du portefeuille.",GET_CURRENCY_PARAMETER:"Echec de la récupération des règles de la monnaie.",GET_CURRENCY_FAILED:"Chargement de la monnaie impossible. Veuillez réessayer plus tard.",SEND_TX_FAILED:"Echec du virement.",ALL_SOURCES_USED:"Veuillez attendre le calcul du prochain bloc (toutes vos sources de monnaie ont été utilisées).",NOT_ENOUGH_SOURCES:"Pas assez de change pour envoyer ce montant en une seule transaction.<br/>Montant maximum : {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Echec de la création du compte membre.",RESTORE_WALLET_DATA_ERROR:"Echec du rechargement des paramètres depuis le stockage local",LOAD_WALLET_DATA_ERROR:"Echec du chargement des données du portefeuille.",COPY_CLIPBOARD_FAILED:"Copie de la valeur impossible.",TAKE_PICTURE_FAILED:"Echec de la récupération de la photo.",SCAN_FAILED:"Echec du scan de QR Code",SCAN_UNKNOWN_FORMAT:"Code non reconnu.",WOT_LOOKUP_FAILED:"Echec de la recherche",LOAD_PEER_DATA_FAILED:"Lecture du nœud Duniter impossible. Veuillez réessayer ultérieurement.",NEED_LOGIN_FIRST:"Veuillez d'abord vous connecter.",AMOUNT_REQUIRED:"Le montant est obligatoire.",AMOUNT_NEGATIVE:"Montant négatif non autorisé.",NOT_ENOUGH_CREDIT:"Crédit insuffisant.",INVALID_NODE_SUMMARY:"Nœud injoignable ou adresse invalide.",INVALID_USER_ID:"Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.",INVALID_COMMENT:"Le champ 'référence' ne doit pas contenir de caractères accentués.",INVALID_PUBKEY:"La clé publique n'a pas le format attendu.",IDENTITY_REVOKED:"Cette identité <b>a été révoquée {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). Elle ne peut plus devenir membre.",IDENTITY_PENDING_REVOCATION:"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement. La certification est donc désactivée.",IDENTITY_INVALID_BLOCK_HASH:"Cette demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé) : cette personne doit renouveler sa demande d'adhésion <b>avant</b> d'être certifiée.",IDENTITY_EXPIRED:"La publication de cette identité a expiré : cette personne doit effectuer une nouvelle demande d'adhésion <b>avant</b> d'être certifiée.",IDENTITY_SANDBOX_FULL:"Le nœud Duniter utilisé par Cesium ne peut plus recevoir de nouvelles identités, car sa file d'attente est pleine.<br/><br/>Veuillez réessayer ultérieurement ou changer de nœud (via le menu <b>Paramètres</b>).",IDENTITY_NOT_FOUND:"Identité non trouvée",WOT_PENDING_INVALID_BLOCK_HASH:"Adhésion non valide.",WALLET_INVALID_BLOCK_HASH:"Votre demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé).<br/>Vous devez <a ng-click=\"doQuickFix('fixMembership')\">envoyer une nouvelle demande</a> pour résoudre ce problème.",WALLET_IDENTITY_EXPIRED:"La publication de <b>votre identité a expiré</b>.<br/>Vous devez <a ng-click=\"doQuickFix('fixIdentity')\">publier à nouveau votre identité</a> pour résoudre ce problème.",WALLET_REVOKED:"Votre identité a été <b>révoquée</b> : ni votre pseudonyme ni votre clef publique ne pourront être utilisés à l'avenir pour un compte membre.",WALLET_HAS_NO_SELF:"Votre identité doit d'abord avoir été publiée, et ne pas être expirée.",AUTH_REQUIRED:"Authentification requise.",AUTH_INVALID_PUBKEY:"La clé publique ne correspond pas au compte connecté.",AUTH_INVALID_SCRYPT:"Identifiant ou mot de passe invalide.",AUTH_INVALID_FILE:"Fichier de trousseau invalide.",AUTH_FILE_ERROR:"Echec de l'ouverture du fichier de trousseau",IDENTITY_ALREADY_CERTIFY:"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est encore valide (expiration {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est en attente de traitement (date limite de traitement {{expiresIn|formatDurationTo}}).",UNABLE_TO_CERTIFY_TITLE:"Certification impossible",LOAD_NEWCOMERS_FAILED:"Echec du chargement des nouveaux membres.",LOAD_PENDING_FAILED:"Echec du chargement des inscriptions en attente.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vous devez <b>être membre</b> pour pouvoir effectuer cette action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Vous devez avoir <b>publié votre identité</b> pour pouvoir effectuer cette action.",GET_BLOCK_FAILED:"Echec de la récupération du bloc",INVALID_BLOCK_HASH:"Bloc non trouvé (hash différent)",DOWNLOAD_REVOCATION_FAILED:"Echec du téléchargement du fichier de révocation.",REVOCATION_FAILED:"Echec de la révocation.",SALT_OR_PASSWORD_NOT_CONFIRMED:"identifiant ou mot de passe incorrect",RECOVER_ID_FAILED:"Echec de la récupération des identifiants",LOAD_FILE_FAILED:"Echec du chargement du fichier",NOT_VALID_REVOCATION_FILE:"Fichier de révocation non valide (mauvais format de fichier)",NOT_VALID_SAVE_ID_FILE:"Fichier de récupération non valide (mauvais format de fichier)",NOT_VALID_KEY_FILE:"Fichier de trousseau non valide (format non reconnu)",EXISTING_ACCOUNT:"Vos identifiants correspondent à un compte déjà existant, dont la <a ng-click=\"showHelpModal('pubkey')\">clef publique</a> est :",EXISTING_ACCOUNT_REQUEST:"Veuillez modifier vos identifiants afin qu'ils correspondent à un compte non utilisé.",GET_LICENSE_FILE_FAILED:"Récupération du fichier de licence impossible",CHECK_NETWORK_CONNECTION:"Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connexion Internet</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Certification envoyée",NOT_ENOUGH_CREDIT:"Crédit insuffisant",TRANSFER_SENT:"Virement envoyé",COPY_TO_CLIPBOARD_DONE:"Copie effectuée",MEMBERSHIP_OUT_SENT:"Résiliation envoyée",NOT_NEED_MEMBERSHIP:"Vous êtes déjà membre.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Cette identité va bientôt manquer de certifications (au moins {{willNeedCertificationCount}}).",REVOCATION_SENT:"Révocation envoyée",REVOCATION_SENT_WAITING_PROCESS:"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement.",FEATURES_NOT_IMPLEMENTED:"Cette fonctionnalité est encore en cours de développement.<br/>Pourquoi ne pas <b>contribuer à Cesium</b>, pour l'obtenir plus rapidement ?)",EMPTY_TX_HISTORY:"Aucune opération à exporter"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Avertissement</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Avertissement de sécurité</b>',CERTIFY_RULES_TITLE_UID:"Certifier {{uid}}",CERTIFY_RULES:'<b class="assertive">Ne PAS certifier</b> un compte si vous pensez que :<br/><br/><ul><li>1.) il ne correspond pas à une personne <b>physique et vivante</b>.<li>2.) son propriétaire <b>possède un autre compte</b> déjà certifié.<li>3.) son propriétaire viole (volontairement ou non) la règle 1 ou 2 (par exemple en certifiant des comptes factices ou en double).</ul><br/><b>Êtes-vous sûr</b> de vouloir néanmoins certifier cette identité ?',FULLSCREEN:"Afficher l'application en plein écran ?",EXIT_APP:"Fermer l'application ?",TRANSFER:"<b>Récapitulatif du virement</b> :<br/><br/><ul><li> - De : {{from}}</li><li> - A : <b>{{to}}</b></li><li> - Montant : <b>{{amount}} {{unit}}</b></li><li> - Commentaire : <i>{{comment}}</i></li></ul><br/><b>Êtes-vous sûr de vouloir effectuer ce virement ?</b>",MEMBERSHIP_OUT:"Cette opération est <b>irréversible</b>.<br/></br/>Êtes-vous sûr de vouloir <b>résilier votre compte membre</b> ?",MEMBERSHIP_OUT_2:"Cette opération est <b>irréversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>résilier votre adhésion</b> comme membre ?",LOGIN_UNUSED_WALLET_TITLE:"Erreur de saisie ?",LOGIN_UNUSED_WALLET:"Le compte connecté semble <b>inactif</b>.<br/><br/>Il s'agit probablement d'une <b>erreur de saisie</b> dans vos identifiants de connexion. Veuillez recommencer, en vérifiant que <b>la clé publique est celle de votre compte</b>.",FIX_IDENTITY:"Le pseudonyme <b>{{uid}}</b> va être publié à nouveau, en remplacement de l'ancienne publication qui a expiré.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?",FIX_MEMBERSHIP:"Votre demande d'adhésion comme membre va être renvoyée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?",RENEW_MEMBERSHIP:"Votre adhésion comme membre va être renouvelée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?",REVOKE_IDENTITY:"Vous allez <b>révoquer définitivement cette identité</b>.<br/><br/>La clé publique et le pseudonyme associés <b>ne pourront plus jamais être utilisés</b> (pour un compte membre). <br/></br/><b>Êtes-vous sûr</b> de vouloir révoquer définitivement ce compte ?",REVOKE_IDENTITY_2:"Cette opération est <b>irreversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>révoquer définitivement</b> ce compte ?",NOT_NEED_RENEW_MEMBERSHIP:"Votre adhésion n'a pas besoin d'être renouvelée (elle n'expirera que dans {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Êtes-vous sûr</b> de vouloir renouveler votre adhésion ?",SAVE_BEFORE_LEAVE:"Voulez-vous <b>sauvegarder vos modifications</b> avant de quitter la page ?",SAVE_BEFORE_LEAVE_TITLE:"Modifications non enregistrées",LOGOUT:"Êtes-vous de vouloir vous déconnecter ?",USE_FALLBACK_NODE:"Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?"},DOWNLOAD:{POPUP_TITLE:"<b>Fichier de révocation</b>",POPUP_REVOKE_MESSAGE:"Pour sécuriser votre compte, veuillez télécharger le <b>document de révocation de compte</b>. Il vous permettra le cas échéant d'annuler votre compte (en cas d'un vol de compte, d'un changement d'identifiant, d'un compte créé à tort, etc.).<br/><br/><b>Veuillez le stocker en lieu sûr.</b>"},HELP:{TITLE:"Aide en ligne",JOIN:{SECTION:"Inscription",SALT:"L'identifiant sert à vous identifier sur votre compte gchange.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est actuellement prévu pour le retrouver en cas de perte.<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon identifiant doit être suffisamment long (au moins 8 caractères) et le plus original possible.",PASSWORD:"Le mot de passe est très essentiel pour accéder à votre compte.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est actuellement prévu pour le retrouver en cas de perte (sauf à générer un fichier de sauvegarde).<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon mot de passe contient (idéalement) au moins 8 caractères, dont au moins une majuscule et un chiffre.",PSEUDO:'Le pseudonyme est utilisé uniquement dans le cas d\'inscription comme <span class="text-italic">membre</span>. Il est toujours associé à un portefeuille (via sa <span class="text-italic">clé publique</span>).<br/>Il est publié sur le réseau, afin que les autres utilisateurs puisse l\'identifier, le certifier ou envoyer de la monnaie sur le compte.<br/>Un pseudonyme doit être unique au sein des membres (<u>actuels</u> et anciens).'},LOGIN:{SECTION:"Connexion",PUBKEY:"Clé publique du trousseau",PUBKEY_DEF:'La clef publique du trousseau est générée à partir des identifiants saisis (n\'importe lesquels), sans pour autant qu\'ils correspondent à un compte déjà utilisé.<br/><b>Vérifiez attentivement que la clé publique est celle de votre compte</b>. Dans le cas contraire, vous serez connecté à un compte probablement jamais utilisé, le risque de collision avec un compte existant étant infime.<br/><a href="https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique" target="_system">En savoir plus sur la cryptographie</a> par clé publique.',METHOD:"Méthodes de connexion",METHOD_DEF:'Plusieurs options sont disponibles pour vous connecter à un portefeuille :<br/> - La connexion <b>par salage (simple ou avancé)</b> mélange votre mot de passe grâce à l\'identifiant, pour limiter les tentatives de <a href="https://fr.wikipedia.org/wiki/Attaque_par_force_brute" target="_system">piratage par force brute</a> (par exemple à partir de mots connus).<br/> - La connexion <b>par clé publique</b> évite de saisir vos identifiants, qui vous seront demandés seulement le moment venu lors d\'une opération sur le compte.<br/> - La connexion <b>par fichier de trousseau</b> va lire les clés (publique et privée) du compte, depuis un fichier, sans besoin de saisir d\'identifiants. Plusieurs formats de fichier sont possibles.'},GLOSSARY:{SECTION:"Glossaire",PUBKEY_DEF:"Une clé publique identifie un compte. Elle est calculée grâce à l'identifiant et au mot de passe.",MEMBER:"Membre",MEMBER_DEF:'Un membre est une personne humaine physique et vivante, désireuse de participer librement à la communauté monétaire. Elle perçoit un dividende universel, suivant une période et un montant tels que définis dans les <span class="text-italic">règles de la monnaie</span>',CURRENCY_RULES:"Règles de la monnaie",CURRENCY_RULES_DEF:'Les règles de la monnaie sont définies une fois pour toutes. Elle fixe le fonctionnement de la monnaie : le calcul du dividende universel, le nombre de certifications nécessaires pour être membre, le nombre de certifications maximal qu\'un membre peut donner, etc. <a href="#/app/currency">Voir les règles actuelles</a>.<br/>La non modification des règles dans le temps est possible par l\'utilisation d\'une <span class="text-italic">BlockChain</span> qui porte et exécute ces règles, et en vérifie constamment la bonne application.',BLOCKCHAIN:'Chaîne de blocs (<span class="text-italic">Blockchain</span>)',BLOCKCHAIN_DEF:'La BlockChain est un système décentralisé, qui, dans le cas de Duniter, sert à porter et exécuter les <span class="text-italic">règles de la monnaie</span>.<br/><a href="https://duniter.org/fr/comprendre/" target="_system">En savoir plus sur Duniter</a> et le fonctionnement de sa blockchain.',UNIVERSAL_DIVIDEND_DEF:'Le Dividende Universel (DU) est la quantité de monnaie co-créée par chaque membre, suivant la période et le calcul définis dans les <span class="text-italic">règles de la monnaie</span>.<br/>A chaque échéance, les membres reçoivent sur leur compte la même quantité de nouvelle monnaie.<br/><br/>Le DU subit une croissance régulière, pour rester juste entre les membres (actuels et à venir), calculée en fonction de l\'espérance de vie moyenne, telle que démontré dans la Thérorie Relative de la Monnaie (TRM).<br/><a href="http://trm.creationmonetaire.info" target="_system">En savoir plus sur la TRM</a> et les monnaies libres.'},TIP:{MENU_BTN_CURRENCY:"Le menu <b>{{'MENU.CURRENCY'|translate}}</b> permet la consultation des <b>règles de la monnaie</b> et de son état.",CURRENCY_WOT:"Le <b>nombre de membres</b> montre l'importance de la communauté et permet de <b>suivre son évolution</b>.",CURRENCY_MASS:"Suivez ici la <b>quantité totale de monnaie</b> existante et sa <b>répartition moyenne</b> par membre.<br/><br/>Ceci permet de juger de l'<b>importance d'un montant</b>, vis à vis de ce que <b>possède les autres</b> sur leur compte (en moyenne).",CURRENCY_UNIT_RELATIVE:"L'unité utilisée (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifie que les montants en {{currency|capitalize}} ont été divisés par le <b>Dividende Universel</b> (DU).<br/><br/><small>Cette unité relative est <b>pertinente</b>, car stable malgré la quantitié de monnaie qui augmente en permanence.</small>",CURRENCY_CHANGE_UNIT:"L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants <b>directement en {{currency|capitalize}}</b> (plutôt qu'en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).",CURRENCY_CHANGE_UNIT_TO_RELATIVE:"L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, c'est-à-dire relativement au Dividende Universel (le montant co-produit par chaque membre).",CURRENCY_RULES:"Les <b>règles</b> de la monnaie fixent son fonctionnement <b>exact et prévisible</b>.<br/><br/>Véritable ADN de la monnaie, elles rendent son code monétaire <b>lisible et transparent</b>.",MENU_BTN_NETWORK:"Le menu <b>{{'MENU.NETWORK'|translate}}</b> permet la consultation de l'état du réseau.",NETWORK_BLOCKCHAIN:"Toutes les opérations de la monnaie sont enregistrées dans un grand livre de compte <b>public et infalsifiable</b>, appelé aussi <b>chaîne de blocs</b> (<em>BlockChain</em> en anglais).",NETWORK_PEERS:"Les <b>nœuds</b> visibles ici correspondent aux <b>ordinateurs qui actualisent et contrôlent</b> la chaîne de blocs.<br/><br/>Plus il y a de nœuds, plus la monnaie a une gestion <b>décentralisée</b> et digne de confiance.",NETWORK_PEERS_BLOCK_NUMBER:"Ce <b>numéro</b> (en vert) indique le <b>dernier bloc validé</b> pour ce nœud (dernière page écrite dans le grand livre de comptes).<br/><br/>La couleur verte indique que ce bloc est également validé par <b>la plupart des autres nœuds</b>.",NETWORK_PEERS_PARTICIPATE:'<b>Chaque membre</b>, équipé d\'un ordinateur avec Internet, <b>peut participer en ajoutant un nœud</b>. Il suffit d\'<b>installer le logiciel Duniter</b> (libre et gratuit). <a href="{{installDocUrl}}" target="_system">Voir le manuel d\'installation >></a>.',MENU_BTN_ACCOUNT:"Le menu <b>{{'ACCOUNT.TITLE'|translate}}</b> permet d'accéder à la gestion de votre compte.",MENU_BTN_ACCOUNT_MEMBER:"Consultez ici l'état de votre compte et les informations sur vos certifications.",WALLET_CERTIFICATIONS:"Cliquez ici pour consulter le détail de vos certifications (reçues et émises).",WALLET_RECEIVED_CERTIFICATIONS:"Cliquez ici pour consulter le détail de vos <b>certifications reçues</b>.",WALLET_GIVEN_CERTIFICATIONS:"Cliquez ici pour consulter le détail de vos <b>certifications émises</b>.",WALLET_BALANCE:"Le <b>solde</b> de votre compte s'affiche ici.",WALLET_BALANCE_RELATIVE:"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unité utilisée (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifie que le montant en {{currency|capitalize}} a été divisé par le <b>Dividende Universel</b> (DU) co-créé par chaque membre.<br/><br/>Actuellement 1 DU vaut {{currentUD|formatInteger}} {{currency|capitalize}}s.",WALLET_BALANCE_CHANGE_UNIT:"Vous pourrez <b>changer l'unité</b> d'affichage des montants dans les <b><i class=\"icon ion-android-settings\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Par exemple pour visualiser les montants <b>directement en {{currency|capitalize}}</b>, plutôt qu'en unité relative.",WALLET_PUBKEY:"Voici la clé publique de votre compte. Vous pouvez la communiquer à un tiers afin qu'il identifie plus simplement votre compte.",WALLET_SEND:"Effectuer un paiement en quelques clics.",WALLET_SEND_NO_MONEY:"Effectuer un paiement en quelques clics.<br/>(Votre solde ne le permet pas encore)",WALLET_OPTIONS:"Ce bouton permet l'accès aux <b>actions d'adhésion</b> et de sécurité.<br/><br/>N'oubliez pas d'y jeter un oeil !",WALLET_RECEIVED_CERTS:"S'affichera ici la liste des personnes qui vous ont certifié.",WALLET_CERTIFY:"Le bouton <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permet de sélectionner une identité et de la certifier.<br/><br/>Seuls des utilisateurs <b>déjà membres</b> peuvent en certifier d'autres.",WALLET_CERT_STOCK:"Votre stock de certifications (émises) est limité à <b>{{sigStock}} certifications</b>.<br/><br/>Ce stock se renouvelle avec le temps, au fur et à mesure que les certifications s'invalident.",MENU_BTN_TX_MEMBER:"Le menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> permet de consulter votre solde, l'historique vos transactions, et d'envoyer un paiement.",MENU_BTN_TX:"Consultez ici <b>l'historique de vos transactions</b> et effectuez de nouvelles opérations.",MENU_BTN_WOT:"Le menu <b>{{'MENU.WOT'|translate}}</b> permet de rechercher parmi les <b>utilisateurs</b> de la monnaie (membre ou non).",WOT_SEARCH_TEXT_XS:"Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique).<br/><br/>La recherche se lancera automatiquement.",WOT_SEARCH_TEXT:"Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique). <br/><br/>Appuyer ensuite sur <b>Entrée</b> pour lancer la recherche.",WOT_SEARCH_RESULT:"Visualisez la fiche détaillée simplement en <b>cliquant</b> sur une ligne.",WOT_VIEW_CERTIFICATIONS:"La ligne <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> montre combien de membres ont validé cette identité.<br/><br/>Ces certifications attestent que le compte appartient à <b>une personne humaine vivante</b> n'ayant <b>aucun autre compte membre</b>.",WOT_VIEW_CERTIFICATIONS_COUNT:"Il faut au moins <b>{{sigQty}} certifications</b> pour devenir membre et recevoir le <b>Dividende Universel</b>.",WOT_VIEW_CERTIFICATIONS_CLICK:"Un clic ici permet d'ouvrir <b>la liste de toutes les certifications</b> de l'identité (reçues et émises).",WOT_VIEW_CERTIFY:"Le bouton <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permet d'ajouter votre certification à cette identité.",CERTIFY_RULES:"<b>Attention :</b> Ne certifier que des <b>personnes physiques vivantes</b>, ne possèdant aucun autre compte membre.<br/><br/>La sécurité de la monnaie dépend de la vigilance de chacun !",MENU_BTN_SETTINGS:"Les <b>{{'MENU.SETTINGS'|translate}}</b> vous permettront de configurer l'application.",HEADER_BAR_BTN_PROFILE:"Cliquez ici pour accéder à votre <b>profil utilisateur</b>",SETTINGS_CHANGE_UNIT:"Vous pourrez <b>changer d'unité d'affichage</b> des montants en cliquant ci-dessus.<br/><br/>- Désactivez l'option pour un affichage des montants en {{currency|capitalize}}.<br/>- Activez l'option pour un affichage relatif en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (tous les montants seront <b>divisés</b> par le Dividende Universel courant).",END_LOGIN:"Cette visite guidée est <b>terminée</b> !<br/><br/>Bonne continuation à vous, dans le nouveau monde de l'<b>économie libre</b> !",END_NOT_LOGIN:"Cette visite guidée est <b>terminée</b> !<br/><br/>Si vous souhaitez rejoindre la monnaie {{currency|capitalize}}, il vous suffira de cliquer sur <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> ci-dessous."}}})}]),angular.module("cesium.plugins",["cesium.plugins.translations","cesium.plugins.templates","cesium.es.plugin","cesium.market.plugin","cesium.map.plugin","cesium.graph.plugin"]),angular.module("cesium.plugins.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{CATEGORY:"Category",CATEGORY_SELECT_HELP:"Select",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",BTN_LIKE:"I like",BTN_FOLLOW:"Follow",BTN_STOP_FOLLOW:"Stop following",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page",DISLIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page",VIEWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page",ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_REPORT_ABUSE_DOTS:"Report a problem or an abuse...",BTN_REMOVE_REPORTED_ABUSE:"Cancel my problem report",SUBMIT_BY:"Submitted by",GEO_DISTANCE_SEARCH:"Search distance",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publish",BTN_PICTURE_DELETE:"Delete",BTN_PICTURE_FAVORISE:"Default",BTN_PICTURE_ROTATE:"Rotate",BTN_ADD_PICTURE:"Add picture",NOTIFICATION:{TITLE:"New notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"You have {{count}} unread notification{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Mark all as read",NO_RESULT:"No notification",SHOW_ALL:"Show all",LOAD_NOTIFICATIONS_FAILED:"Could not load notifications"},REPORT_ABUSE:{TITLE:"Report a problem",SUB_TITLE:"Please explain briefly the problem:",REASON_HELP:"I explain the problem...",ASK_DELETE:"Request removal?",CONFIRM:{SENT:"Request sent. Thnak you!"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"My Profile",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Account for an organization",ORGANIZATION_ACCOUNT_HELP:"If you represent a company, association, etc.<br/>No universal dividend will be created by this account."},EVENT:{MEMBER_WITHOUT_PROFILE:'To obtain your certification more quickly, fill in <a ui-sref="app.user_edit_profile">your user profile</a>. Members will more easily put their trust in a verifiable identity.'},ERROR:{WS_CONNECTION_FAILED:"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggest identities to certify...",BTN_ASK_CERTIFICATIONS_DOTS:"Ask members to certify me...",BTN_ASK_CERTIFICATION:"Ask a certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggest certifications",HELP:"Select your suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Ask certifications",HELP:"Select recipients"},SEARCH:{DIVIDER_PROFILE:"Profile",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},VIEW:{STARS:"Trust level",STAR_HIT_COUNT:"{{total}} rate{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Rate this profile",BTN_STARS_REMOVE:"Remove my note",BTN_REDO_STAR_HELP:"Update your rate for this profile",BTN_FOLLOW:"Follow the activity of this profile",BTN_STOP_FOLLOW:"Stop following this profil"}},COMMENTS:{DIVIDER:"Comments",SHOW_MORE_COMMENTS:"Show previous comments",COMMENT_HELP:"Your comment, question...",COMMENT_HELP_REPLY_TO:"Your answer...",BTN_SEND:"Send",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Reply",REPLY_TO:"Respond to:",REPLY_TO_LINK:"In response to ",REPLY_TO_DELETED_COMMENT:"In response to a deleted comment",REPLY_COUNT:"{{replyCount}} responses",DELETED_COMMENT:"Comment deleted",MODIFIED_ON:"modified on {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modified then)",ERROR:{FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Reply",BTN_COMPOSE:"New message",BTN_WRITE:"Write",NO_MESSAGE_INBOX:"No message received",NO_MESSAGE_OUTBOX:"No message sent",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"You <b>received a message</b><br/>from"},LIST:{INBOX:"Inbox",OUTBOX:"Outbox",LAST_INBOX:"New messages",LAST_OUTBOX:"Sent messages",BTN_LAST_MESSAGES:"Recent messages",TITLE:"Private messages",SEARCH_HELP:"Search in messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Delete all messages"}},COMPOSE:{TITLE:"New message",TITLE_REPLY:"Reply",SUB_TITLE:"New message",TO:"To",OBJECT:"Object",OBJECT_HELP:"Object",ENCRYPTED_HELP:"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.",MESSAGE:"Message",MESSAGE_HELP:"Message content",CONTENT_CONFIRMATION:"No message content.<br/><br/>Are your sure you want to send this message?"},VIEW:{TITLE:"Message",SENDER:"Sent by",RECIPIENT:"Sent to",NO_CONTENT:"Empty message",DELETE:"Delete the message"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.",REMOVE_ALL:"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.",MARK_ALL_AS_READ:"Are you sure you want to <b>mark all message as read</b>?",USER_HAS_NO_PROFILE:"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?"},INFO:{MESSAGE_REMOVED:"Message successfully deleted",All_MESSAGE_REMOVED:"Messages successfully deleted",MESSAGE_SENT:"Message sent"},ERROR:{SEND_MSG_FAILED:"Error while sending message.",LOAD_MESSAGES_FAILED:"Error while loading messages.",LOAD_MESSAGE_FAILED:"Error while loading message.",MESSAGE_NOT_READABLE:"Unable to read message.",USER_NOT_RECIPIENT:"You are not the recipient of this message: unable to read it.",NOT_AUTHENTICATED_MESSAGE:"The authenticity of the message is not certain or its content is corrupted.",REMOVE_MESSAGE_FAILED:"Error while deleting message",MESSAGE_CONTENT_TOO_LONG:"Value too long ({{maxLength}} characters max).",MARK_AS_READ_FAILED:"Unable to mark the message as 'read'.",LOAD_NOTIFICATIONS_FAILED:"Error while loading messages notifications.",REMOVE_All_MESSAGES_FAILED:"Error while removing all messages.",MARK_ALL_AS_READ_FAILED:"Error while marking messages as read.",RECIPIENT_IS_MANDATORY:"Recipient is mandatory."}},REGISTRY:{CATEGORY:"Main activity",GENERAL_DIVIDER:"Basic information",LOCATION_DIVIDER:"Address",SOCIAL_NETWORKS_DIVIDER:"Social networks, web sites",TECHNICAL_DIVIDER:"Technical data",BTN_SHOW_WOT:"People",BTN_SHOW_WOT_HELP:"Search for people",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Search for pages",BTN_NEW:"New page",MY_PAGES:"My pages",NO_PAGE:"No page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"What, Who: hairdresser, Lili's restaurant, ...",BTN_ADD:"New",BTN_LAST_RECORDS:"Recent pages",BTN_ADVANCED_SEARCH:"Advanced search",BTN_OPTIONS:"Advanced search",TYPE:"Kind of organization",LOCATION_HELP:"Where: City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent pages",LAST_RECORD_COUNT_LOCATION:"{{count}} recent page{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent page{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Advanced options?"}},VIEW:{TITLE:"Registry",CATEGORY:"Main activity:",LOCATION:"Address:",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this reference?<br/><br/>This is irreversible."},TYPE:{TITLE:"New page",SELECT_TYPE:"Kind of organization:",ENUM:{SHOP:"Local shops",COMPANY:"Company",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edit",TITLE_NEW:"New page",RECORD_TYPE:"Kind of organization",RECORD_TITLE:"Name",RECORD_TITLE_HELP:"Name",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Describe activity",RECORD_ADDRESS:"Street",RECORD_ADDRESS_HELP:"Street, building...",RECORD_CITY:"City",RECORD_CITY_HELP:"City, Country",RECORD_SOCIAL_NETWORKS:"Social networks and web site",RECORD_PUBKEY:"Public key",RECORD_PUBKEY_HELP:"Public key to receive payments"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Loading main activities failed",LOAD_RECORD_FAILED:"Loading failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",REMOVE_RECORD_FAILED:"Deleting failed",SAVE_RECORD_FAILED:"Saving failed",RECORD_NOT_EXISTS:"Record not found",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Page successfully deleted",RECORD_SAVED:"Page successfully saved"}},PROFILE:{PROFILE_DIVIDER:"ğchange profile",PROFILE_DIVIDER_HELP:"It is related data, stored in the ğchange network.",NO_PROFILE_DEFINED:"No ğchange profile",BTN_ADD:"Create my profile",BTN_EDIT:"Edit my profile",BTN_DELETE:"Delete my profile",BTN_REORDER:"Reorder",UID:"Pseudonym",TITLE:"Lastname, FirstName",TITLE_HELP:"Name",DESCRIPTION:"About me",DESCRIPTION_HELP:"About me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"General data",SOCIAL_NETWORKS_DIVIDER:"Social networks and web site",STAR:"Trust level",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>, by clicking on the button below:",BTN_SELECT_FILE:"Choose an image",RESIZE_HELP:"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",RESULT_HELP:"<b>Here is the result</b> as seen on your profile:"},CONFIRM:{DELETE:"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Deleting profile failed",LOAD_PROFILE_FAILED:"Could not load user profile.",SAVE_PROFILE_FAILED:"Saving profile failed",INVALID_SOCIAL_NETWORK_FORMAT:"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Error while resizing picture"},INFO:{PROFILE_REMOVED:"Profile deleted",PROFILE_SAVED:"Profile saved"},HELP:{WARNING_PUBLIC_DATA:"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"geo-locate (recommended)?",LOADING_LOCATION:"Searching address...",LOCATION_DIVIDER:"Localisation",ADDRESS:"Address",ADDRESS_HELP:"Address (optional)",CITY:"City",CITY_HELP:"City, Country",DISTANCE:"Maximum distance around the city",DISTANCE_UNIT:"mi",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"City, Country",PROFILE_POSITION:"Profile position",MODAL:{TITLE:"Search address",SEARCH_HELP:"City, Country",ALTERNATIVE_RESULT_DIVIDER:"Alternative results for <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Required if a street has been filled",REQUIRED_FOR_LOCATION:"Required field to appear on the map",INVALID_FOR_LOCATION:"Unknown address",GEO_LOCATION_FAILED:"Unable to retrieve your current position. Please use the search button.",ADDRESS_LOCATION_FAILED:"Unable to retrieve the address position"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Online services",SUBSCRIPTION_DIVIDER_HELP:"Online services offer optional additional services, delegated to a third party.",BTN_ADD:"Add a service",BTN_EDIT:"Manage my services",NO_SUBSCRIPTION:"No service defined",SUBSCRIPTION_COUNT:"Services / Subscription",EDIT:{TITLE:"Online services",HELP_TEXT:"Manage your subscriptions and other online services here",PROVIDER:"Provider:"},TYPE:{ENUM:{EMAIL:"Receive email notifications"}},CONFIRM:{DELETE_SUBSCRIPTION:"Are you sur you want to <b>delete this subscription</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error while loading online services",ADD_SUBSCRIPTION_FAILED:"Error while adding subscription",UPDATE_SUBSCRIPTION_FAILED:"Error during subscription update",DELETE_SUBSCRIPTION_FAILED:"Error while deleting subscription"},MODAL_EMAIL:{TITLE:"Notification by email",HELP:"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.",EMAIL_LABEL:"Your email:",EMAIL_HELP:"john@domain.com",FREQUENCY_LABEL:"Frequency of notifications:",FREQUENCY_DAILY:"Daily",FREQUENCY_WEEKLY:"Weekly",PROVIDER:"Service Provider:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Document search",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Last documents :",LAST_DOCUMENTS:"Last documents",SHOW_QUERY:"Show query",HIDE_QUERY:"Hide query",HEADER_TIME:"Time/Hour",HEADER_ISSUER:"Issuer",HEADER_RECIPIENT:"Recipient",READ:"Read",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Title",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_REGISTERED:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."},TYPE:{USER_PROFILE:"Profile",MARKET_RECORD:"Ad",MARKET_COMMENT:"Comment on a ad",PAGE_RECORD:"Page",PAGE_COMMENT:"Comment on a page",GROUP_RECORD:"Group",GROUP_COMMENT:"Comment on a group"}},INFO:{REMOVED:"Deleted document"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this document</b>?",REMOVE_ALL:"Are you sure you want to <b>delete these documents</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error searching documents",REMOVE_FAILED:"Error deleting the document",REMOVE_ALL_FAILED:"Error deleting documents"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"User profiles, notifications, private messages",ENABLE_TOGGLE:"Enable extension?",ENABLE_MESSAGE_TOGGLE:"Enable messages?",ENABLE_SETTINGS_TOGGLE:"Enable remote storage for settings?",PEER:"Data peer address",POPUP_PEER:{TITLE:"Data peer",HELP:"Set the address of the peer to use:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Enable the types of notifications you want to receive:",ENABLE_TX_SENT:"Notify the validation of <b>sent payments</b>?",ENABLE_TX_RECEIVED:"Notify the validation of <b>received payments</b>?",ENABLE_CERT_SENT:"Notify the validation of <b>sent certifications</b>?",ENABLE_CERT_RECEIVED:"Notify the validation of <b>received certifications</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"New features",ASK_ENABLE:'Some new features are available: <ul><li> <b><i class="icon ion-person"></i> user profiles</b>;<li> <b><i class="icon ion-android-notifications"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"A recipient is required for encryption."}},ES_PEER:{NAME:"Name",DOCUMENTS:"Documents",SOFTWARE:"Software",DOCUMENT_COUNT:"Number of documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} subscribers to email notification"},EVENT:{NODE_STARTED:"Your node ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.",NODE_BMA_UP:"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.",MEMBER_JOIN:"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!",MEMBER_LEAVE:"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.",MEMBER_REVOKE:"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.",TX_SENT:'Your payment to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:'You received a payment from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:'Your <b>certification</b> to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',CERT_RECEIVED:'You have <b>received a certification</b> from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> data node?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">advanced settings</a>.',ES_MAX_UPLOAD_BODY_SIZE:"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos."}}),e.translations("en",{COMMON:{CATEGORY:"Category",CATEGORY_SELECT_HELP:"Select",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",BTN_LIKE:"I like",BTN_FOLLOW:"Follow",BTN_STOP_FOLLOW:"Stop following",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page",DISLIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page",VIEWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page",ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_REPORT_ABUSE_DOTS:"Report a problem or an abuse...",BTN_REMOVE_REPORTED_ABUSE:"Cancel my problem report",SUBMIT_BY:"Submitted by",GEO_DISTANCE_SEARCH:"Search distance",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publish",BTN_PICTURE_DELETE:"Delete",BTN_PICTURE_FAVORISE:"Default",BTN_PICTURE_ROTATE:"Rotate",BTN_ADD_PICTURE:"Add picture",NOTIFICATION:{TITLE:"New notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"You have {{count}} unread notification{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Mark all as read",NO_RESULT:"No notification",SHOW_ALL:"Show all",LOAD_NOTIFICATIONS_FAILED:"Could not load notifications"},REPORT_ABUSE:{TITLE:"Report a problem",SUB_TITLE:"Please explain briefly the problem:",REASON_HELP:"I explain the problem...",ASK_DELETE:"Request removal?",CONFIRM:{SENT:"Request sent. Thnak you!"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"My Profile",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Account for an organization",ORGANIZATION_ACCOUNT_HELP:"If you represent a company, association, etc.<br/>No universal dividend will be created by this account."},EVENT:{MEMBER_WITHOUT_PROFILE:'To obtain your certification more quickly, fill in <a ui-sref="app.user_edit_profile">your user profile</a>. Members will more easily put their trust in a verifiable identity.'},ERROR:{WS_CONNECTION_FAILED:"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggest identities to certify...",BTN_ASK_CERTIFICATIONS_DOTS:"Ask members to certify me...",BTN_ASK_CERTIFICATION:"Ask a certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggest certifications",HELP:"Select your suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Ask certifications",HELP:"Select recipients"},SEARCH:{DIVIDER_PROFILE:"Profile",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},VIEW:{STARS:"Trust level",STAR_HIT_COUNT:"{{total}} rate{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Rate this profile",BTN_STARS_REMOVE:"Remove my note",BTN_REDO_STAR_HELP:"Update your rate for this profile",BTN_FOLLOW:"Follow the activity of this profile",BTN_STOP_FOLLOW:"Stop following this profil"}},COMMENTS:{DIVIDER:"Comments",SHOW_MORE_COMMENTS:"Show previous comments",COMMENT_HELP:"Your comment, question...",COMMENT_HELP_REPLY_TO:"Your answer...",BTN_SEND:"Send",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Reply",REPLY_TO:"Respond to:",REPLY_TO_LINK:"In response to ",REPLY_TO_DELETED_COMMENT:"In response to a deleted comment",REPLY_COUNT:"{{replyCount}} responses",DELETED_COMMENT:"Comment deleted",MODIFIED_ON:"modified on {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modified then)",ERROR:{FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Reply",BTN_COMPOSE:"New message",BTN_WRITE:"Write",NO_MESSAGE_INBOX:"No message received",NO_MESSAGE_OUTBOX:"No message sent",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"You <b>received a message</b><br/>from"},LIST:{INBOX:"Inbox",OUTBOX:"Outbox",LAST_INBOX:"New messages",LAST_OUTBOX:"Sent messages",BTN_LAST_MESSAGES:"Recent messages",TITLE:"Private messages",SEARCH_HELP:"Search in messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Delete all messages"}},COMPOSE:{TITLE:"New message",TITLE_REPLY:"Reply",SUB_TITLE:"New message",TO:"To",OBJECT:"Object",OBJECT_HELP:"Object",ENCRYPTED_HELP:"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.",MESSAGE:"Message",MESSAGE_HELP:"Message content",CONTENT_CONFIRMATION:"No message content.<br/><br/>Are your sure you want to send this message?"},VIEW:{TITLE:"Message",SENDER:"Sent by",RECIPIENT:"Sent to",NO_CONTENT:"Empty message",DELETE:"Delete the message"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.",REMOVE_ALL:"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.",MARK_ALL_AS_READ:"Are you sure you want to <b>mark all message as read</b>?",USER_HAS_NO_PROFILE:"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?"},INFO:{MESSAGE_REMOVED:"Message successfully deleted",All_MESSAGE_REMOVED:"Messages successfully deleted",MESSAGE_SENT:"Message sent"},ERROR:{SEND_MSG_FAILED:"Error while sending message.",LOAD_MESSAGES_FAILED:"Error while loading messages.",LOAD_MESSAGE_FAILED:"Error while loading message.",MESSAGE_NOT_READABLE:"Unable to read message.",USER_NOT_RECIPIENT:"You are not the recipient of this message: unable to read it.",NOT_AUTHENTICATED_MESSAGE:"The authenticity of the message is not certain or its content is corrupted.",REMOVE_MESSAGE_FAILED:"Error while deleting message",MESSAGE_CONTENT_TOO_LONG:"Value too long ({{maxLength}} characters max).",MARK_AS_READ_FAILED:"Unable to mark the message as 'read'.",LOAD_NOTIFICATIONS_FAILED:"Error while loading messages notifications.",REMOVE_All_MESSAGES_FAILED:"Error while removing all messages.",MARK_ALL_AS_READ_FAILED:"Error while marking messages as read.",RECIPIENT_IS_MANDATORY:"Recipient is mandatory."}},REGISTRY:{CATEGORY:"Main activity",GENERAL_DIVIDER:"Basic information",LOCATION_DIVIDER:"Address",SOCIAL_NETWORKS_DIVIDER:"Social networks, web sites",TECHNICAL_DIVIDER:"Technical data",BTN_SHOW_WOT:"People",BTN_SHOW_WOT_HELP:"Search for people",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Search for pages",BTN_NEW:"New page",MY_PAGES:"My pages",NO_PAGE:"No page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"What, Who: hairdresser, Lili's restaurant, ...",BTN_ADD:"New",BTN_LAST_RECORDS:"Recent pages",BTN_ADVANCED_SEARCH:"Advanced search",BTN_OPTIONS:"Advanced search",TYPE:"Kind of organization",LOCATION_HELP:"Where: City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent pages",LAST_RECORD_COUNT_LOCATION:"{{count}} recent page{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent page{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Advanced options?"}},VIEW:{TITLE:"Registry",CATEGORY:"Main activity:",LOCATION:"Address:",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this reference?<br/><br/>This is irreversible."},TYPE:{TITLE:"New page",SELECT_TYPE:"Kind of organization:",ENUM:{SHOP:"Local shops",COMPANY:"Company",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edit",TITLE_NEW:"New page",RECORD_TYPE:"Kind of organization",RECORD_TITLE:"Name",RECORD_TITLE_HELP:"Name",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Describe activity",RECORD_ADDRESS:"Street",RECORD_ADDRESS_HELP:"Street, building...",RECORD_CITY:"City",RECORD_CITY_HELP:"City, Country",RECORD_SOCIAL_NETWORKS:"Social networks and web site",RECORD_PUBKEY:"Public key",RECORD_PUBKEY_HELP:"Public key to receive payments"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Loading main activities failed",LOAD_RECORD_FAILED:"Loading failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",REMOVE_RECORD_FAILED:"Deleting failed",SAVE_RECORD_FAILED:"Saving failed",RECORD_NOT_EXISTS:"Record not found",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Page successfully deleted",RECORD_SAVED:"Page successfully saved"}},PROFILE:{PROFILE_DIVIDER:"ğchange profile",PROFILE_DIVIDER_HELP:"It is related data, stored in the ğchange network.",NO_PROFILE_DEFINED:"No ğchange profile",BTN_ADD:"Create my profile",BTN_EDIT:"Edit my profile",BTN_DELETE:"Delete my profile",BTN_REORDER:"Reorder",UID:"Pseudonym",TITLE:"Lastname, FirstName",TITLE_HELP:"Name",DESCRIPTION:"About me",DESCRIPTION_HELP:"About me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"General data",SOCIAL_NETWORKS_DIVIDER:"Social networks and web site",STAR:"Trust level",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>, by clicking on the button below:",BTN_SELECT_FILE:"Choose an image",RESIZE_HELP:"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",RESULT_HELP:"<b>Here is the result</b> as seen on your profile:"},CONFIRM:{DELETE:"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Deleting profile failed",LOAD_PROFILE_FAILED:"Could not load user profile.",SAVE_PROFILE_FAILED:"Saving profile failed",INVALID_SOCIAL_NETWORK_FORMAT:"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Error while resizing picture"},INFO:{PROFILE_REMOVED:"Profile deleted",PROFILE_SAVED:"Profile saved"},HELP:{WARNING_PUBLIC_DATA:"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"geo-locate (recommended)?",LOADING_LOCATION:"Searching address...",LOCATION_DIVIDER:"Localisation",ADDRESS:"Address",ADDRESS_HELP:"Address (optional)",CITY:"City",CITY_HELP:"City, Country",DISTANCE:"Maximum distance around the city",DISTANCE_UNIT:"mi",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"City, Country",PROFILE_POSITION:"Profile position",MODAL:{TITLE:"Search address",SEARCH_HELP:"City, Country",ALTERNATIVE_RESULT_DIVIDER:"Alternative results for <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Required if a street has been filled",REQUIRED_FOR_LOCATION:"Required field to appear on the map",INVALID_FOR_LOCATION:"Unknown address",GEO_LOCATION_FAILED:"Unable to retrieve your current position. Please use the search button.",ADDRESS_LOCATION_FAILED:"Unable to retrieve the address position"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Online services",SUBSCRIPTION_DIVIDER_HELP:"Online services offer optional additional services, delegated to a third party.",BTN_ADD:"Add a service",BTN_EDIT:"Manage my services",NO_SUBSCRIPTION:"No service defined",SUBSCRIPTION_COUNT:"Services / Subscription",EDIT:{TITLE:"Online services",HELP_TEXT:"Manage your subscriptions and other online services here",PROVIDER:"Provider:"},TYPE:{ENUM:{EMAIL:"Receive email notifications"}},CONFIRM:{DELETE_SUBSCRIPTION:"Are you sur you want to <b>delete this subscription</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error while loading online services",ADD_SUBSCRIPTION_FAILED:"Error while adding subscription",UPDATE_SUBSCRIPTION_FAILED:"Error during subscription update",DELETE_SUBSCRIPTION_FAILED:"Error while deleting subscription"},MODAL_EMAIL:{TITLE:"Notification by email",HELP:"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.",EMAIL_LABEL:"Your email:",EMAIL_HELP:"john@domain.com",FREQUENCY_LABEL:"Frequency of notifications:",FREQUENCY_DAILY:"Daily",FREQUENCY_WEEKLY:"Weekly",PROVIDER:"Service Provider:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Document search",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Last documents :",LAST_DOCUMENTS:"Last documents",SHOW_QUERY:"Show query",HIDE_QUERY:"Hide query",HEADER_TIME:"Time/Hour",HEADER_ISSUER:"Issuer",HEADER_RECIPIENT:"Recipient",READ:"Read",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Title",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_REGISTERED:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."},TYPE:{USER_PROFILE:"Profile",MARKET_RECORD:"Ad",MARKET_COMMENT:"Comment on a ad",PAGE_RECORD:"Page",PAGE_COMMENT:"Comment on a page",GROUP_RECORD:"Group",GROUP_COMMENT:"Comment on a group"}},INFO:{REMOVED:"Deleted document"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this document</b>?",REMOVE_ALL:"Are you sure you want to <b>delete these documents</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error searching documents",REMOVE_FAILED:"Error deleting the document",REMOVE_ALL_FAILED:"Error deleting documents"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"User profiles, notifications, private messages",ENABLE_TOGGLE:"Enable extension?",ENABLE_MESSAGE_TOGGLE:"Enable messages?",ENABLE_SETTINGS_TOGGLE:"Enable remote storage for settings?",PEER:"Data peer address",POPUP_PEER:{TITLE:"Data peer",HELP:"Set the address of the peer to use:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Enable the types of notifications you want to receive:",ENABLE_TX_SENT:"Notify the validation of <b>sent payments</b>?",ENABLE_TX_RECEIVED:"Notify the validation of <b>received payments</b>?",ENABLE_CERT_SENT:"Notify the validation of <b>sent certifications</b>?",ENABLE_CERT_RECEIVED:"Notify the validation of <b>received certifications</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"New features",ASK_ENABLE:'Some new features are available: <ul><li> <b><i class="icon ion-person"></i> user profiles</b>;<li> <b><i class="icon ion-android-notifications"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"A recipient is required for encryption."}},ES_PEER:{NAME:"Name",DOCUMENTS:"Documents",SOFTWARE:"Software",DOCUMENT_COUNT:"Number of documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} subscribers to email notification"},EVENT:{NODE_STARTED:"Your node ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.",NODE_BMA_UP:"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.",MEMBER_JOIN:"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!",MEMBER_LEAVE:"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.",MEMBER_REVOKE:"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.",TX_SENT:'Your payment to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:'You received a payment from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:'Your <b>certification</b> to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',CERT_RECEIVED:'You have <b>received a certification</b> from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>',
|
||
NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> data node?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">advanced settings</a>.',ES_MAX_UPLOAD_BODY_SIZE:"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos."}}),e.translations("eo-EO",{COMMON:{CATEGORY:"Kategorio",CATEGORY_SELECT_HELP:"Elekti",CATEGORIES:"Kategorioj",CATEGORY_SEARCH_HELP:"Serĉado",COMMENT_HELP:"Komento",LAST_MODIFICATION_DATE:"Ĝisdatigita la",BTN_LIKE:"Mi ŝatas",BTN_FOLLOW:"Sekvi",BTN_STOP_FOLLOW:"Ne plu sekvi",LIKES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} ŝatis tiun ĉi paĝon",DISLIKES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} ne ŝatis tiun ĉi paĝon",VIEWS_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} konsultis tiun ĉi paĝon",FOLLOWS_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} sekvas tiun ĉi paĝon",ABUSES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} atentigis pri problemo",BTN_REPORT_ABUSE_DOTS:"Atentigi pri problemo aŭ misuzo...",BTN_REMOVE_REPORTED_ABUSE:"Nuligi mian atentigon",SUBMIT_BY:"Submetita de",GEO_DISTANCE_SEARCH:"Distanco por serĉado",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publikigi",BTN_PICTURE_DELETE:"Forigi",BTN_PICTURE_FAVORISE:"Precipa",BTN_PICTURE_ROTATE:"Turni",BTN_ADD_PICTURE:"Aldoni foton",NOTIFICATION:{TITLE:"Nova avizo | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vi havas {{count}} avizo{{count>0?'j':''}}n ne legita{{count>0?'j':''}}n"},NOTIFICATIONS:{TITLE:"Avizoj",MARK_ALL_AS_READ:"Ĉion marki legita",NO_RESULT:"Neniu avizo",SHOW_ALL:"Vidi ĉion",LOAD_NOTIFICATIONS_FAILED:"Malsukceso por ŝarĝi la avizojn"},REPORT_ABUSE:{TITLE:"Atentigi pri problemo",SUB_TITLE:"Bonvolu klarigi rapide la problemon:",REASON_HELP:"Mi klarigas la problemon...",ASK_DELETE:"Peti la forigon?",CONFIRM:{SENT:"Atentigo sendita. Dankon!"}}},MENU:{REGISTRY:"Paĝoj",USER_PROFILE:"Mia profilo",MESSAGES:"Mesaĝoj",NOTIFICATIONS:"Avizoj",INVITATIONS:"Invitoj"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Konto por organizaĵo",ORGANIZATION_ACCOUNT_HELP:"Se vi reprezentas entreprenon, asocion, ktp.<br/>Neniu universala dividendo estos kreita per tiu ĉi konto."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vi povas <a ui-sref="app.edit_profile">tajpi vian profilon Cesium+</a> (kromebleco) por disponi pli bonan videblecon por via konto.'},ERROR:{WS_CONNECTION_FAILED:"ğchange ne povas ricevi la avizojn pro teknika eraro (konekto al la daten-nodo Cesium+).<br/><br/>Se la problemo daŭradas, bonvolu <b>elekti alian daten-nodon</b> ĉe la parametroj Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugesti identecojn atestotajn...",BTN_ASK_CERTIFICATIONS_DOTS:"Peti membrojn atesti min...",BTN_ASK_CERTIFICATION:"Peti atestaĵon",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugesti atestadojn",HELP:"Selekti viajn sugestojn"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Peti atestaĵojn",HELP:"Selekti la ricevontojn"},SEARCH:{DIVIDER_PROFILE:"Kontoj",DIVIDER_PAGE:"Paĝoj",DIVIDER_GROUP:"Grupoj"},VIEW:{STARS:"Fido-nivelo",STAR_HIT_COUNT:"{{total}} noto{{total>1 ? 'j' : ''}}",BTN_STAR_HELP:"Noti tiun ĉi profilon",BTN_STARS_REMOVE:"Forigi mian noton",BTN_REDO_STAR_HELP:"Aktualigi vian noton",BTN_FOLLOW:"Sekvi la agojn de tiu ĉi profilo",BTN_STOP_FOLLOW:"Ne plu sekvi tiun ĉi profilon"}},COMMENTS:{DIVIDER:"Komentoj",SHOW_MORE_COMMENTS:"Afiŝi la antaŭajn komentojn",COMMENT_HELP:"Via komento, demando, ktp.",COMMENT_HELP_REPLY_TO:"Via respondo...",BTN_SEND:"Sendi",POPOVER_SHARE_TITLE:"Mesaĝo #{{number}}",REPLY:"Respondi",REPLY_TO:"Respondo al:",REPLY_TO_LINK:"Responde al ",REPLY_TO_DELETED_COMMENT:"Responde al forigita komento",REPLY_COUNT:"{{replyCount}} respondoj",DELETED_COMMENT:"Komento forigita",MODIFIED_ON:"modifita la {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modifita poste)",ERROR:{FAILED_SAVE_COMMENT:"Eraro dum la konservo de la komento",FAILED_REMOVE_COMMENT:"Eraro dum la forigo de la komento"}},MESSAGE:{REPLY_TITLE_PREFIX:"Resp: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Respondi",BTN_COMPOSE:"Nova mesaĝo",BTN_WRITE:"Skribi",NO_MESSAGE_INBOX:"Neniu mesaĝo ricevita",NO_MESSAGE_OUTBOX:"Neniu mesaĝo sendita",NOTIFICATIONS:{TITLE:"Mesaĝoj",MESSAGE_RECEIVED:"Vi <b>ricevis mesaĝon</b><br/>de"},LIST:{INBOX:"Ricevujo",OUTBOX:"Senditaj mesaĝoj",LAST_INBOX:"Novaj mesaĝoj",LAST_OUTBOX:"Senditaj mesaĝoj",BTN_LAST_MESSAGES:"Freŝdataj mesaĝoj",TITLE:"Mesaĝoj",SEARCH_HELP:"Serĉado en la mesaĝoj",POPOVER_ACTIONS:{TITLE:"Kromaĵoj",DELETE_ALL:"Forigi ĉiujn mesaĝojn"}},COMPOSE:{TITLE:"Nova mesaĝo",TITLE_REPLY:"Respondi",SUB_TITLE:"Nova mesaĝo",TO:"Al",OBJECT:"Temo",OBJECT_HELP:"Temo",ENCRYPTED_HELP:"Bonvolu noti, ke tiu ĉi mesaĝo estos ĉifrita antaŭ sendo, tiel ke nur la adresato povos legi ĝin, kaj ke li estos certa, ke vi ja estas ties aŭtoro.",MESSAGE:"Mesaĝo",MESSAGE_HELP:"Enhavo de la mesaĝo",CONTENT_CONFIRMATION:"La enhavo de la mesaĝo estas malplena.<br/><br/>Ĉu vi volas tamen sendi la mesaĝon?"},VIEW:{TITLE:"Mesaĝo",SENDER:"Sendita de",RECIPIENT:"Sendita al",NO_CONTENT:"Mesaĝo malplena",DELETE:"Forigi la mesaĝon"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi mesaĝon</b>?<br/><br/>Tiu ago estas neinversigebla.",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi ĉiujn mesaĝojn</b>?<br/><br/>Tiu ago estas neinversigebla.",MARK_ALL_AS_READ:"Ĉu vi certas, ke vi volas <b>marki ĉiujn mesaĝojn legitaj</b>?",USER_HAS_NO_PROFILE:"Tiu identeco havas neniun profilon Cesium+. Eblas ke ĝi ne uzas la krom-programon Cesium+, kaj <b>do ne legos vian mesaĝon</b>.<br/><br/>Ĉu vi certas, ke vi volas tamen <b>daŭrigi</b>?"},INFO:{MESSAGE_REMOVED:"Mesaĝo forigita",All_MESSAGE_REMOVED:"Ĉiuj mesaĝoj estis forigitaj",MESSAGE_SENT:"Mesaĝo sendita"},ERROR:{SEND_MSG_FAILED:"Eraro dum la sendo de la mesaĝo.",LOAD_MESSAGES_FAILED:"Eraro dum la ricevo de la mesaĝoj.",LOAD_MESSAGE_FAILED:"Eraro dum la ricevo de la mesaĝo.",MESSAGE_NOT_READABLE:"Legado de la mesaĝo neebla.",USER_NOT_RECIPIENT:"Vi ne estas la adresato de tiu ĉi mesaĝo: malĉifrado neebla.",NOT_AUTHENTICATED_MESSAGE:"La aŭtenteco de la mesaĝo estas dubinda aŭ ties enhavo estas difektita.",REMOVE_MESSAGE_FAILED:"Malsukceso por forigi la mesaĝon",MESSAGE_CONTENT_TOO_LONG:"Signaro tro longa ({{maxLength}} signoj maksimume).",MARK_AS_READ_FAILED:"Neeblas marki la mesaĝon 'legita'.",LOAD_NOTIFICATIONS_FAILED:"Eraro dum la ricevo de la mesaĝo-avizoj.",REMOVE_All_MESSAGES_FAILED:"Eraro dum la forigo de ĉiuj mesaĝoj.",MARK_ALL_AS_READ_FAILED:"Eraro por marki la mesaĝojn legitaj.",RECIPIENT_IS_MANDATORY:"La adresato estas deviga."}},REGISTRY:{CATEGORY:"Ĉefa agado",GENERAL_DIVIDER:"Ĝeneralaj informoj",LOCATION_DIVIDER:"Adreso",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj kaj retejo",TECHNICAL_DIVIDER:"Teknikaj informoj",BTN_SHOW_WOT:"Personoj",BTN_SHOW_WOT_HELP:"Traserĉi personojn",BTN_SHOW_PAGES:"Paĝoj",BTN_SHOW_PAGES_HELP:"Traserĉi paĝojn",BTN_NEW:"Krei paĝon",MY_PAGES:"Miaj paĝoj",NO_PAGE:"Neniu paĝo",SEARCH:{TITLE:"Paĝoj",SEARCH_HELP:"Kio, Kiu: restoracio, Ĉe Marcelo, ...",BTN_ADD:"Nova",BTN_LAST_RECORDS:"Freŝdataj paĝoj",BTN_ADVANCED_SEARCH:"Sperta serĉado",BTN_OPTIONS:"Sperta serĉado",TYPE:"Tipo de paĝo",LOCATION_HELP:"Kie: Poŝto-kodo, Urbo",RESULTS:"Rezultoj",RESULT_COUNT_LOCATION:"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}",RESULT_COUNT:"{{count}} rezulto{{count>0?'j':''}}",LAST_RECORDS:"Freŝdataj paĝoj",LAST_RECORD_COUNT_LOCATION:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}, proksime de {{location}}",LAST_RECORD_COUNT:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Spertaj kromaĵoj?"}},VIEW:{TITLE:"Adresaro",CATEGORY:"Ĉefa agado:",LOCATION:"Adreso:",MENU_TITLE:"Kromaĵoj",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi paĝon?<br/><br/>Tiu ago estas neinversigebla."},TYPE:{TITLE:"Tipoj",SELECT_TYPE:"Tipo de paĝo:",ENUM:{SHOP:"Loka komerco",COMPANY:"Entrepreno",ASSOCIATION:"Asocio",INSTITUTION:"Institucio"}},EDIT:{TITLE:"Redaktado",TITLE_NEW:"Nova paĝo",RECORD_TYPE:"Tipo de paĝo",RECORD_TITLE:"Nomo",RECORD_TITLE_HELP:"Nomo",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo de la agado",RECORD_ADDRESS:"Strato",RECORD_ADDRESS_HELP:"Strato, konstruaĵo...",RECORD_CITY:"Urbo",RECORD_CITY_HELP:"Urbo",RECORD_SOCIAL_NETWORKS:"Sociaj retoj kaj retejo",RECORD_PUBKEY:"Publika ŝlosilo",RECORD_PUBKEY_HELP:"Publika ŝlosilo por ricevi la pagojn"},WALLET:{REGISTRY_DIVIDER:"Paĝoj",REGISTRY_HELP:"La paĝoj referencigas agadojn akceptantajn la monon aŭ favorigantajn ĝin: komercoj, entreprenoj, asocioj, institucioj."},ERROR:{LOAD_CATEGORY_FAILED:"Eraro dum la ŝarĝo de la listo de la agadoj",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝo de la paĝo",LOOKUP_RECORDS_FAILED:"Eraro dum la serĉado",REMOVE_RECORD_FAILED:"Eraro dum la forigo de la paĝo",SAVE_RECORD_FAILED:"Eraro dum la konservado",RECORD_NOT_EXISTS:"Paĝo neekzistanta",GEO_LOCATION_NOT_FOUND:"Urbo aŭ poŝto-kodo ne trovita"},INFO:{RECORD_REMOVED:"Paĝo forigita",RECORD_SAVED:"Paĝo konservita"}},PROFILE:{PROFILE_DIVIDER:"Profilo ğchange",PROFILE_DIVIDER_HELP:"Temas pri kromaj datenoj, stokitaj ĉe la reto ğchange.",NO_PROFILE_DEFINED:"Neniu profilo tajpita",BTN_ADD:"Tajpi mian profilon",BTN_EDIT:"Redakti mian profilon",BTN_DELETE:"Forigi mian profilon",BTN_REORDER:"Reordigi",UID:"Pseŭdonimo",TITLE:"Familia nomo, Persona nomo",TITLE_HELP:"Familia nomo, Persona nomo",DESCRIPTION:"Pri mi",DESCRIPTION_HELP:"Pri mi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Ĝeneralaj informoj",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj, retejoj",STAR:"Fido-nivelo",TECHNICAL_DIVIDER:"Teknikaj informoj",MODAL_AVATAR:{TITLE:"Profil-foto",SELECT_FILE_HELP:"Bonvolu <b>elekti bildo-dosieron</b>, alklakante la ĉi-suban butonon:",BTN_SELECT_FILE:"Elekti foton",RESIZE_HELP:"<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.",RESULT_HELP:"<b>Jen la rezulto</b> tiel videbla ĉe via profilo:"},CONFIRM:{DELETE:"Ĉu vi certas, ke vi volas <b>forigi vian profilon ğchange?</b><br/><br/>Tiu ago estas neinversigebla."},ERROR:{REMOVE_PROFILE_FAILED:"Malsukceso por forigi la profilon",LOAD_PROFILE_FAILED:"Malsukceso por ŝarĝi la profilon de la uzanto.",SAVE_PROFILE_FAILED:"Eraro dum la konservado",INVALID_SOCIAL_NETWORK_FORMAT:"Strukturo ne rekonata: bonvolu tajpi validan adreson.<br/><br/>Ezemploj:<ul><li>- Facebook-paĝo (https://www.facebook.com/uzanto)</li><li>- Retpaĝo (http://www.miaretejo.net)</li><li>- Retadreso (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Eraro dum la reformatigo de la bildo"},INFO:{PROFILE_REMOVED:"Profilo forigita",PROFILE_SAVED:"Profilo konservita"},HELP:{WARNING_PUBLIC_DATA:"La informoj afiŝitaj en via profilo <b>estas publikaj</b>: videblaj inkluzive de la personoj <b>ne konektitaj</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trovi mian adreson surmape",USE_GEO_POINT:"Aperi sur la mapoj {{'COMMON.APP_NAME'|translate}}?",LOADING_LOCATION:"Serĉado de la adreso...",LOCATION_DIVIDER:"Adreso",ADDRESS:"Strato",ADDRESS_HELP:"Strato, adres-aldonaĵo...",CITY:"Urbo",CITY_HELP:"Poŝto-kodo, Urbo, Lando",DISTANCE:"Maksimuma distanco ĉirkaŭ la urbo",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Poŝto-kodo, Urbo",PROFILE_POSITION:"Loko de la profilo",MODAL:{TITLE:"Serĉado de la adreso",SEARCH_HELP:"Urbo, Poŝto-kodo, Lando",ALTERNATIVE_RESULT_DIVIDER:"Alternativaj rezultoj por <b>{{address}}</b>:",POSITION:"Lat/Lon: {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Deviga kampo (ĉar strato estas tajpita)",REQUIRED_FOR_LOCATION:"Deviga kampo por aperi sur la mapo",INVALID_FOR_LOCATION:"Adreso nekonata",GEO_LOCATION_FAILED:"Neeblas ricevi vian lokiĝon. Bonvolu uzi la serĉo-butonon.",ADDRESS_LOCATION_FAILED:"Neeblas ricevi la lokon per la adreso"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Retaj servoj",SUBSCRIPTION_DIVIDER_HELP:"La retaj servoj proponas pliajn nedevigajn servojn, delegitajn al aliulo.",BTN_ADD:"Aldoni servon",BTN_EDIT:"Mastrumi miajn servojn",NO_SUBSCRIPTION:"Neniu servo uzata",SUBSCRIPTION_COUNT:"Servoj / Abonoj",EDIT:{TITLE:"Retaj servoj",HELP_TEXT:"Mastrumu ĉi tie viajn abonojn kaj aliajn retajn servojn",PROVIDER:"Provizanto:"},TYPE:{ENUM:{EMAIL:"Ricevi la avizojn per retmesaĝo"}},CONFIRM:{DELETE_SUBSCRIPTION:"Ĉu vi certas, ke vi volas <b>forigi tiun abonon</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Eraro dum la ŝarĝo de la retaj servoj",ADD_SUBSCRIPTION_FAILED:"Malsukceso por sendi la abonon",UPDATE_SUBSCRIPTION_FAILED:"Malsukceso por ĝisdatigi la abonon",DELETE_SUBSCRIPTION_FAILED:"Eraro dum la forigo de la abono"},MODAL_EMAIL:{TITLE:"Avizo per retmesaĝo",HELP:"Plenigu tiun ĉi formularon por <b>esti avizita per retmesaĝo</b> pri la okazaĵoj ĉe via konto.<br/>Via retadreso estos ĉifrita por esti videbla nur de la servo-provizanto.",EMAIL_LABEL:"Via retadreso:",EMAIL_HELP:"johano.stelaro@esperanto.org",FREQUENCY_LABEL:"Periodo de la avizoj:",FREQUENCY_DAILY:"Ĉiutaga",FREQUENCY_WEEKLY:"Ĉiusemajna",PROVIDER:"Servo-provizanto:"}},DOCUMENT:{HASH:"Haketo: ",LOOKUP:{TITLE:"Serĉado de dokumentoj",BTN_ACTIONS:"Agoj",SEARCH_HELP:"Sendanto:AAA*, tempo:1508406169",LAST_DOCUMENTS:"Lastaj dokumentoj",LAST_DOCUMENTS_DOTS:"Lastaj dokumentoj:",SHOW_QUERY:"Vidi la informpeton",HIDE_QUERY:"Kaŝi la informpeton",HEADER_TIME:"Dato/Horo",HEADER_ISSUER:"Sendanto",HEADER_RECIPIENT:"Ricevonto",READ:"Legita",DOCUMENT_TYPE:"Tipo",DOCUMENT_TITLE:"Titolo",BTN_REMOVE:"Forigi tiun ĉi dokumenton",BTN_COMPACT:"Densigi",HAS_REGISTERED:"kreis aŭ modifis sian profilon",POPOVER_ACTIONS:{TITLE:"Agoj",REMOVE_ALL:"Forigi tiujn ĉi dokumentojn..."},TYPE:{USER_PROFILE:"Profilo",MARKET_RECORD:"Anonco",MARKET_COMMENT:"Komento ĉe anonco",PAGE_RECORD:"Paĝo",PAGE_COMMENT:"Komento ĉe paĝo",GROUP_RECORD:"Grupo",GROUP_COMMENT:"Komento ĉe grupo"}},INFO:{REMOVED:"Dokumento forigita"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi dokumenton</b>?",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi tiujn ĉi dokumentojn</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Eraro dum la serĉado de dokumentoj",REMOVE_FAILED:"Eraro dum la forigo de la dokumento",REMOVE_ALL_FAILED:"Eraro dum la forigo de la dokumentoj"}},ES_SETTINGS:{PLUGIN_NAME:"Spertaj parametroj",PLUGIN_NAME_HELP:"Filtrado de avizoj, ktp.",ENABLE_TOGGLE:"Aktivigi la krom-programon?",ENABLE_MESSAGE_TOGGLE:"Aktivigi la privatajn mesaĝojn?",ENABLE_SETTINGS_TOGGLE:"Aktivigi la foran stokadon de la parametroj?",PEER:"Adreso de la daten-nodo",POPUP_PEER:{TITLE:"Daten-nodo",HELP:"Tajpu la adreson de la nodo, kiun vi volas uzi:",PEER_HELP:"servo.domajno.com:port"},NOTIFICATIONS:{DIVIDER:"Avizoj",HELP_TEXT:"Aktivigu la avizo-tipojn, kiujn vi deziras ricevi:",ENABLE_TX_SENT:"Avizi pri la <b>senditaj pagoj</b>?",ENABLE_TX_RECEIVED:"Avizi pri la <b>ricevitaj pagoj</b>?",ENABLE_CERT_SENT:"Avizi pri la <b>senditaj atestaĵoj</b>?",ENABLE_CERT_RECEIVED:"Avizi pri <b>la ricevitaj atestaĵoj</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Kromaj funkcioj",ASK_ENABLE:'La krom-programo Cesium+ estas <b>malaktivigita</b> ĉe viaj parametroj, kio senaktivigas la funkciojn: <ul><li> <b><i class="icon ion-person"></i> Profiloj Cesium+</b>;<li> <b><i class="icon ion-android-notifications"></i> Avizoj</b>;<li> <b><i class="icon ion-email"></i> Privataj mesaĝoj</b>.<li> <b><i class="icon ion-location"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Adresito estas deviga por la ĉifrado."}},ES_PEER:{NAME:"Nomo",DOCUMENTS:"Dokumentoj",SOFTWARE:"Programo",DOCUMENT_COUNT:"Nombro de dokumentoj",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} abonantoj pri avizoj per retmesaĝoj"},EVENT:{NODE_STARTED:"Via nodo ES API <b>{{params[0]}}</b> ekis",NODE_BMA_DOWN:"La nodo <b>{{params[0]}}:{{params[1]}}</b> (uzata de via nodo ES API) estas <b>neatingebla</b>.",NODE_BMA_UP:"La nodo <b>{{params[0]}}:{{params[1]}}</b> estas denove alirebla.",MEMBER_JOIN:"Vi estas nun <b>membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>, pro ne revalidiĝo aŭ pro manko da atestaĵoj.",MEMBER_REVOKE:"La nuligo de via konto efektiviĝis. Ĝi ne plu povos esti membro-konto de la mono <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"La revalidiĝo de via aliĝo al la mono <b>{{params[0]}}</b> estis <b>ricevita</b>.",TX_SENT:"Via <b>pago</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> efektiviĝis.",TX_SENT_MULTI:"Via <b>pago</b> al <b>{{params[1]}}</b> efektiviĝis.",TX_RECEIVED:"Vi <b>ricevis pagon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Vi <b>ricevis pagon</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Via <b>atestado</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> efektiviĝis.",CERT_RECEIVED:"Vi <b>ricevis atestaĵon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.",USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ŝatas vian profilon',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sekvas viajn agojn',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> notis vin ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> petas de vi moderigon pri la profilo: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri via profilo'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis vian paĝon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe via paĝo: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> respondis al via komento ĉe la paĝo: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian respondon al via komento ĉe la paĝo: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe la paĝo: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> petas de vis moderigon pri la paĝo: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri paĝo foriginda: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri via paĝo: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Daten-nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la daten-nodon <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:'Daten-nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ ŝanĝu la daten-nodon en la <a class="positive" ng-click="doQuickFix(\'settings\')">spertaj parametroj</a>.',ES_MAX_UPLOAD_BODY_SIZE:"La kvanto de datenoj sendotaj superas la limon fiksitan de la servilo.<br/>Bonvolu reprovi post, ekzemple, forigo de fotoj."}}),e.translations("es-ES",{COMMON:{CATEGORY:"Categoría",CATEGORY_SELECT_HELP:"Seleccionar",CATEGORIES:"Categorías",CATEGORY_SEARCH_HELP:"Búsqueda",LAST_MODIFICATION_DATE:"Actualización el",SUBMIT_BY:"Sometido por",BTN_PUBLISH:"Publicar",BTN_PICTURE_DELETE:"Suprimir",BTN_PICTURE_FAVORISE:"Principal",BTN_PICTURE_ROTATE:"Girar",BTN_ADD_PICTURE:"Añadir una foto",NOTIFICATIONS:{TITLE:"Notificaciónes",MARK_ALL_AS_READ:"Marcar todo como leído",NO_RESULT:"Ningúna notificación",SHOW_ALL:"Ver todo",LOAD_NOTIFICATIONS_FAILED:"Fracaso en la carga de las notificaciónes"}},MENU:{REGISTRY:"Profesionales",USER_PROFILE:"Mi perfil",MESSAGES:"Mensajes",NOTIFICATIONS:"Notificaciónes",INVITATIONS:"Invitaciónes"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Cuenta para una organización",ORGANIZATION_ACCOUNT_HELP:"Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta."},EVENT:{MEMBER_WITHOUT_PROFILE:'Para obtener sus certificaciónes más rapidamente, completa <a ui-sref="app.user_edit_profile">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable.'},ERROR:{WS_CONNECTION_FAILED:"Cesium no puede recibir las notificaciónes, a causa de un error técnico (conexión al nodo de datos Cesium+).<br/><br/>Si el problema persiste, por favor <b>elige un otro nodo de datos</b> en las configuraciónes Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugerir identidad a certificar...",BTN_ASK_CERTIFICATIONS_DOTS:"Solicitar otros miembros a certificarme…",BTN_ASK_CERTIFICATION:"Solicitar una certificación",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugerir certificaciónes",HELP:"Selectionar sus sugerencias"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Solicitar certificaciónes",HELP:"Selectionar los destinatarios"},SEARCH:{DIVIDER_PROFILE:"Cuentas",DIVIDER_PAGE:"Páginas",DIVIDER_GROUP:"Grupos"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Está usted segura/o querer <b>mandar estas sugerencia de certificatión</b> ?",ASK_CERTIFICATION:"Está usted segura/o querer <b>mandar una solicitud de certificación</b> ?",ASK_CERTIFICATIONS:"Está usted segura/o querer <b>mandar una solicitud de certificación</b> a estas personas ?"}},COMMENTS:{DIVIDER:"Comentarios",SHOW_MORE_COMMENTS:"Visualizar los comentarios anteriores",COMMENT_HELP:"Su comentario, preguntas, etc.",COMMENT_HELP_REPLY_TO:"Su repuesta…",BTN_SEND:"Mandar",POPOVER_SHARE_TITLE:"Mensaje #{{number}}",REPLY:"Responder",REPLY_TO:"Repuesta a :",REPLY_TO_LINK:"En repuesta a ",REPLY_TO_DELETED_COMMENT:"En repuesta a un comentario suprimido",REPLY_COUNT:"{{replyCount}} repuestas",DELETED_COMMENT:"Comentario suprimido",ERROR:{FAILED_SAVE_COMMENT:"Fracaso durante el respaldo del comentario",FAILED_REMOVE_COMMENT:"Fracaso durante la supresión del comentario"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Responder",BTN_COMPOSE:"Nuevo mensaje",BTN_WRITE:"Escribir",NO_MESSAGE_INBOX:"Ningun mensaje recibido",NO_MESSAGE_OUTBOX:"Ningun mensaje mandado",NOTIFICATIONS:{TITLE:"Mensajes",MESSAGE_RECEIVED:"Ha <b>recibido un mensaje</b><br/>de"},LIST:{INBOX:"Bandeja de entrada",OUTBOX:"Mensajes mandados",TITLE:"Mensajes",POPOVER_ACTIONS:{TITLE:"Opciónes",DELETE_ALL:"Suprimir todos los mensajes"}},COMPOSE:{TITLE:"Nuevo mensaje",TITLE_REPLY:"Responder",SUB_TITLE:"Nuevo mensaje",TO:"A",OBJECT:"Objeto",OBJECT_HELP:"Objeto",ENCRYPTED_HELP:"Por favor, nota que este mensaje será cifrado antes envío, a fin que solo el destinatario pueda leerlo, y que esté asegurado que usted esté bien su autor.",MESSAGE:"Mensaje",MESSAGE_HELP:"Contenido del mensaje",CONTENT_CONFIRMATION:"El contenido del mensaje es vacío.<br/><br/>Sin embargo, quiere mandar el mensaje ?"},VIEW:{TITLE:"Mensaje",SENDER:"Mandado por",RECIPIENT:"Mandado a",NO_CONTENT:"Mensaje vacío"},CONFIRM:{REMOVE:"Está usted segura/o querer <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.",REMOVE_ALL:"Está usted segura/o querer <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.",MARK_ALL_AS_READ:"Está usted segura/o querer <b>marcar todos los mensajes como leído</b> ?",USER_HAS_NO_PROFILE:"Esta identidad no tiene ningún perfil Cesium+. Se puede que no utilice la extensión Cesium+, y <b>así no consultará su mensaje</b>.<br/><br/>Está usted segura/o querer <b>continuar</b> a pesar de todo ?"},INFO:{MESSAGE_REMOVED:"Mensaje suprimido",All_MESSAGE_REMOVED:"Todos los mensajes fueron suprimido",MESSAGE_SENT:"Mensaje mandado"},ERROR:{SEND_MSG_FAILED:"Fracaso durante el envío del mensaje.",LOAD_MESSAGES_FAILED:"Fracaso durante la recuperación de los mensajes.",LOAD_MESSAGE_FAILED:"Fracaso durante la recuperación del mensaje.",MESSAGE_NOT_READABLE:"Lectura del mensaje imposible.",USER_NOT_RECIPIENT:"No esta el destinatario de este mensaje : deciframiento imposible.",NOT_AUTHENTICATED_MESSAGE:"La autenticidad del mensaje es dudosa o su contenido es corrupto.",REMOVE_MESSAGE_FAILED:"Fracaso en la supresión del mensaje",MESSAGE_CONTENT_TOO_LONG:"Valor demasiado largo ({{maxLength}} carácteres max).",MARK_AS_READ_FAILED:"Imposible marcar el mensaje como 'leído'.",LOAD_NOTIFICATIONS_FAILED:"Fracaso durante la recuperación de las notificaciónes de mensajes.",REMOVE_All_MESSAGES_FAILED:"Fracaso durante la supresión de todos los mensajes.",MARK_ALL_AS_READ_FAILED:"Fracaso durante el marcaje de los mensajes como leído.",RECIPIENT_IS_MANDATORY:"El destinatario es obligatorio."}},REGISTRY:{CATEGORY:"Actividad principal",GENERAL_DIVIDER:"Informaciónes generales",LOCATION_DIVIDER:"Dirección",SOCIAL_NETWORKS_DIVIDER:"Redes sociales y sitio web",TECHNICAL_DIVIDER:"Informaciónes técnicas",BTN_SHOW_WOT:"Personas",BTN_SHOW_WOT_HELP:"Buscar personas",BTN_SHOW_PAGES:"Páginas",BTN_SHOW_PAGES_HELP:"Búsqueda de páginas",BTN_NEW:"Creer una página",MY_PAGES:"Mis páginas",NO_PAGE:"Sin página",SEARCH:{TITLE:"Páginas",TITLE_SMALL_DEVICE:"Páginas",SEARCH_HELP:"Qué, Quién : restaurante, Con Marcel, ...",BTN_ADD:"Nuevo",BTN_OPTIONS:"Búsqueda avanzada",TYPE:"Tipo de página",LOCATION:"Localización",LOCATION_HELP:"Ciudad",LAST_RECORDS:"últimos registrados :",RESULTS:"Resultados :"},VIEW:{TITLE:"Anuario",CATEGORY:"Actividad principal :",LOCATION:"Dirección :",MENU_TITLE:"Opciónes",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Está usted segura/o querer suprimir esta página ?<br/><br/>Esta operación es ireversible."},TYPE:{TITLE:"Nueva página",SELECT_TYPE:"Tipo de página :",ENUM:{SHOP:"Comercio local",COMPANY:"Empresa",ASSOCIATION:"Asociación",INSTITUTION:"Institución"}},EDIT:{TITLE:"Edición",TITLE_NEW:"Nueva página",RECORD_TYPE:"Tipo de página",RECORD_TITLE:"Nombre",RECORD_TITLE_HELP:"Nombre",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción de la actividad",RECORD_ADDRESS:"Calle",RECORD_ADDRESS_HELP:"Dirección : calle, edificio...",RECORD_CITY:"Ciudad",RECORD_CITY_HELP:"Ciudad",RECORD_SOCIAL_NETWORKS:"Redes sociales y sitio web",RECORD_PUBKEY:"Llave pública",RECORD_PUBKEY_HELP:"Llave pública de recepción de los pagos"},WALLET:{REGISTRY_DIVIDER:"Páginas",REGISTRY_HELP:"Las páginas se refieren a actividades que aceptan dinero o lo favorecen: empresas, negocios, asociaciones, instituciones."},ERROR:{LOAD_CATEGORY_FAILED:"Fracaso en la carga de la lista de actividades",LOAD_RECORD_FAILED:"Fracaso durante la carga de la página",LOOKUP_RECORDS_FAILED:"Fracaso durante la ejecución de la búsqueda.",REMOVE_RECORD_FAILED:"Fracaso en la supresión de la página",SAVE_RECORD_FAILED:"Fracaso durante el respaldo",RECORD_NOT_EXISTS:"Página inexistente",GEO_LOCATION_NOT_FOUND:"Ciudad o código postal no encontrado"},INFO:{RECORD_REMOVED:"Página suprimida",RECORD_SAVED:"Página guardada"}},PROFILE:{PROFILE_DIVIDER:"Perfil ğchange",PROFILE_DIVIDER_HELP:"Se trata de datos auxiliares, almacenados en la red de intercambio.",NO_PROFILE_DEFINED:"Ningún perfil Cesium+",BTN_ADD:"Ingresar mi perfil",BTN_EDIT:"Editar mi perfil",BTN_DELETE:"Borrar mi perfil",BTN_REORDER:"Reordenar",UID:"Seudónimo",TITLE:"Nombre, Apellido",TITLE_HELP:"Nombre, Apellido",DESCRIPTION:"A propósito de yo",DESCRIPTION_HELP:"A propósito de yo...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informaciónes generales",SOCIAL_NETWORKS_DIVIDER:"Redes sociales, sitios web",TECHNICAL_DIVIDER:"Informaciónes técnicas",MODAL_AVATAR:{TITLE:"Foto de perfil",SELECT_FILE_HELP:"Por favor, <b>elige un fichero imagen</b>, haciendo un clic sobre el botón por debajo :",BTN_SELECT_FILE:"Eligir una foto",RESIZE_HELP:"<b>Encuadra la imagen</b>, si es necesario. Un clic mantenido sobre la imagen permite desplazarla. Hace un clic sobre la zona abajo a la izquierda para hacer zoom.",RESULT_HELP:"<b>Aquí está el resultado</b> tal como está visible sobre su perfil :"},CONFIRM:{DELETE:"¿Está seguro de que desea <b>eliminar su perfil de ğchange?</b><br/><br/>Esta operación es irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Error de eliminación de perfil",LOAD_PROFILE_FAILED:"Fracaso en la carga del perfil usuario.",SAVE_PROFILE_FAILED:"Fracaso durante el respaldo",INVALID_SOCIAL_NETWORK_FORMAT:"Formato no tomado en cuenta : por favor, indica una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección email (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Fracaso durante el redimensionamiento de la imagen"},INFO:{PROFILE_REMOVED:"Perfil eliminado",PROFILE_SAVED:"Perfil respaldado"},HELP:{WARNING_PUBLIC_DATA:"Las informaciónes informadas en su perfil <b>están públicas</b> : visibles también por personas <b>no conectadas</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Actualizar desde la dirección",USE_GEO_POINT:"Geo-localizar (recomendado)?",LOADING_LOCATION:"Encontrar la dirección ...",LOCATION_DIVIDER:"Dirección",ADDRESS:"Calle",ADDRESS_HELP:"Calle, complemento de dirección...",CITY:"Ciudad",CITY_HELP:"Ciudad, País",DISTANCE:"Distancia máxima alrededor de la ciudad",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Ciudad, País",PROFILE_POSITION:"Posición del perfil",MODAL:{TITLE:"Búsqueda de dirección",SEARCH_HELP:"Ciudad, País",ALTERNATIVE_RESULT_DIVIDER:"Resultados alternativos para <b>{{address}}</b> :",POSITION:"Latitud/Longitud : {{lat}} {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Requerido si una calle ha sido llenada",REQUIRED_FOR_LOCATION:"Campo obligatorio para aparecer en el mapa",INVALID_FOR_LOCATION:"Dirección desconocida",GEO_LOCATION_FAILED:"No se puede recuperar su ubicación Por favor usa el botón de búsqueda.",ADDRESS_LOCATION_FAILED:"No se puede recuperar la posición de la dirección."}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Perfiles, notificaciónes, mensajes privados",ENABLE_TOGGLE:"Activar la extensión ?",ENABLE_MESSAGE_TOGGLE:"Activar los mensajes privados ?",ENABLE_SETTINGS_TOGGLE:"Activar el almacenamiento a distancia de las configuraciónes ?",PEER:"Dirección del nodo de datos",POPUP_PEER:{TITLE:"Nodo de datos",HELP:"Ingresa la dirección del nodo que quiere utilizar :",PEER_HELP:"servidor.dominio.com:puerto"},NOTIFICATIONS:{DIVIDER:"Notificaciónes",HELP_TEXT:"Activa los tipos de notificaciónes que usted desea recibir :",ENABLE_TX_SENT:"Notificar la validación de los <b>pagos emitidos</b> ?",ENABLE_TX_RECEIVED:"Notificar la validación de los <b>pagos recibidos</b> ?",ENABLE_CERT_SENT:"Notificar la validación de las <b>certificaciónes emitidas</b> ?",ENABLE_CERT_RECEIVED:"Notificar la validación de las <b>certificaciónes recibidas</b> ?"},CONFIRM:{ASK_ENABLE_TITLE:"Nuevas funcionalidades",ASK_ENABLE:'Nuevas funcionalidades son disponibles : <ul><li> <b><i class="icon ion-person"></i> Perfiles Cesium+</b>;<li> <b><i class="icon ion-android-notifications"></i> Notificaciónes</b>;<li> <b><i class="icon ion-email"></i> Mensajes privados</b>.</ul><br/>Fueron <b>desactivadas</b> en sus configuraciones.<br/><br/><b>Quiere usted activarlas</b> ?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinatario es obligatorio para el cifrado."}},EVENT:{NODE_STARTED:"Su nodo ES API <b>{{params[0]}}</b> es comenzado",NODE_BMA_DOWN:"El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.",NODE_BMA_UP:"El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.",MEMBER_JOIN:"Ahora usted está <b>miembro</b> de la moneda <b>{{params[0]}}</b> !",MEMBER_LEAVE:"No está <b>miembro</b> de la moneda <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Usted ya no es un miembro de la moneda <b>{{params[0]}}</b>, la falta de no renovación o la falta de certificaciones.",MEMBER_REVOKE:"La revocación de su cuenta se ha hecho. Puede que no sea un miembro de la cuenta en moneda <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Su renovación de adhesión a la moneda <b>{{params[0]}}</b> fue <b>tomado en cuenta</b>.",TX_SENT:'Su <b>pago</b> a <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> fue efectuado.',TX_SENT_MULTI:"Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.",TX_RECEIVED:'Ha <b>recibido un pago</b> de <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.",CERT_SENT:'Su <b>certificación</b> a <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> fue efectuada.',CERT_RECEIVED:'Ha <b>recibido una certificación</b> de <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',REGISTRY:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha contestado a su comentario sobre el referencia : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre el referencia : <b>{{params[2]}}</b>'},CONFIRM:{ES_USE_FALLBACK_NODE:"Nodo de datos <b>{{old}}</b> dirección inaccesible o no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?"}},ERROR:{ES_CONNECTION_ERROR:'Nodo de datos <b>{{server}}</b> dirección no válida o no válida.<br/><br/>Verifique su conexión a Internet o cambie el nodo de datos en <a class="positive" ng-click="doQuickFix(\'settings\')">configuración avanzada</a>.',ES_MAX_UPLOAD_BODY_SIZE:"El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos."}}),e.translations("fr-FR",{COMMON:{CATEGORY:"Catégorie",CATEGORY_SELECT_HELP:"Sélectionner",CATEGORIES:"Catégories",CATEGORY_SEARCH_HELP:"Recherche",COMMENT_HELP:"Commentaire",LAST_MODIFICATION_DATE:"Mise à jour le",BTN_LIKE:"J'aime",BTN_FOLLOW:"Suivre",BTN_STOP_FOLLOW:"Ne plus suivre",LIKES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} aimé cette page",DISLIKES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'n\\'ont' : 'n\\'a'}} pas aimé cette page",VIEWS_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} consulté cette page",FOLLOWS_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'suivent' : 'suit'}} cette page",ABUSES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème",BTN_REPORT_ABUSE_DOTS:"Signaler un problème ou un abus...",BTN_REMOVE_REPORTED_ABUSE:"Annuler mon signalement",SUBMIT_BY:"Soumis par",GEO_DISTANCE_SEARCH:"Distance de recherche",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publier",BTN_PICTURE_DELETE:"Supprimer",BTN_PICTURE_FAVORISE:"Principale",BTN_PICTURE_ROTATE:"Tourner",BTN_ADD_PICTURE:"Ajouter une photo",NOTIFICATION:{TITLE:"Nouvelle notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vous avez {{count}} notification{{count>0?'s':''}} non lue{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Tout marquer comme lu",NO_RESULT:"Aucune notification",SHOW_ALL:"Voir tout",LOAD_NOTIFICATIONS_FAILED:"Erreur de chargement des notifications"},REPORT_ABUSE:{TITLE:"Signaler un problème",SUB_TITLE:"Merci d'expliquer succintement le problème :",REASON_HELP:"J'explique le problème...",ASK_DELETE:"Demander la suppression ?",CONFIRM:{SENT:"Signalement envoyé. Merci !"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"Mon profil",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Compte pour une organisation",ORGANIZATION_ACCOUNT_HELP:"Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vous pouvez <a ui-sref="app.edit_profile">saisir votre profil Cesium+</a> (optionnel) pour offrir une meilleure visibilité de votre compte. Ce profil sera stocké dans <b>un annuaire indépendant</b> de la monnaie, mais décentralisé.'},ERROR:{WS_CONNECTION_FAILED:"ğchange ne peut pas recevoir les notifications à cause d'une erreur technique (connexion au noeud de données ğchange).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggérer des identités à certifier...",BTN_ASK_CERTIFICATIONS_DOTS:"Demander à des membres de me certifier...",BTN_ASK_CERTIFICATION:"Demander une certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggérer des certifications",HELP:"Sélectionner vos suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Demander des certifications",HELP:"Sélectionner les destinataires"},SEARCH:{DIVIDER_PROFILE:"Comptes",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groupes"},VIEW:{STARS:"Niveau de confiance",STAR_HIT_COUNT:"{{total}} note{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Noter ce profil",BTN_STARS_REMOVE:"Supprimer ma note",BTN_REDO_STAR_HELP:"Actualiser votre note",BTN_FOLLOW:"Suivre l'activité de ce profil",BTN_STOP_FOLLOW:"Ne plus suivre ce profil"}},COMMENTS:{DIVIDER:"Commentaires",SHOW_MORE_COMMENTS:"Afficher les commentaires précédents",COMMENT_HELP:"Votre commentaire, question, etc.",COMMENT_HELP_REPLY_TO:"Votre réponse...",BTN_SEND:"Envoyer",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Répondre",REPLY_TO:"Réponse à :",REPLY_TO_LINK:"En réponse à ",REPLY_TO_DELETED_COMMENT:"En réponse à un commentaire supprimé",REPLY_COUNT:"{{replyCount}} réponses",DELETED_COMMENT:"Commentaire supprimé",MODIFIED_ON:"modifié le {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modifié ensuite)",ERROR:{FAILED_SAVE_COMMENT:"Erreur lors de la sauvegarde du commentaire",FAILED_REMOVE_COMMENT:"Erreur lors de la suppression du commentaire"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Répondre",BTN_COMPOSE:"Nouveau message",BTN_WRITE:"Ecrire",NO_MESSAGE_INBOX:"Aucun message reçu",NO_MESSAGE_OUTBOX:"Aucun message envoyé",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"Vous avez <b>reçu un message</b><br/>de"},LIST:{INBOX:"Boîte de réception",OUTBOX:"Messages envoyés",LAST_INBOX:"Nouveaux messages",LAST_OUTBOX:"Messages envoyés",BTN_LAST_MESSAGES:"Messages récents",TITLE:"Messages",SEARCH_HELP:"Recherche dans les messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Supprimer tous les messages"}},COMPOSE:{TITLE:"Nouveau message",TITLE_REPLY:"Répondre",SUB_TITLE:"Nouveau message",TO:"A",OBJECT:"Objet",OBJECT_HELP:"Objet",ENCRYPTED_HELP:"Veuillez noter que ce message sera chiffré avant envoi, afin que seul le destinataire puisse le lire, et qu'il soit assuré que vous soyez bien son auteur.",MESSAGE:"Message",MESSAGE_HELP:"Contenu du message",CONTENT_CONFIRMATION:"Le contenu du message est vide.<br/><br/>Voulez-vous néanmoins envoyer le message ?"},VIEW:{TITLE:"Message",SENDER:"Envoyé par",RECIPIENT:"Envoyé à",NO_CONTENT:"Message vide",DELETE:"Supprimer le message"},CONFIRM:{REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce message</b> ?<br/><br/>Cette opération est irréversible.",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer tous les messages</b> ?<br/><br/>Cette opération est irréversible.",MARK_ALL_AS_READ:"Êtes-vous sûr de vouloir <b>marquer tous les messages comme lu</b> ?",USER_HAS_NO_PROFILE:"Cette identité n'a aucun profil. Il se peut qu'elle n'utilise pas l'extension de gestion des messages privés, et <b>ne consultera donc pas votre message</b>.<br/><br/>Êtes-vous sûr de vouloir <b>continuer</b> malgré tout ?"},INFO:{MESSAGE_REMOVED:"Message supprimé",All_MESSAGE_REMOVED:"Tous les messages ont été supprimés",MESSAGE_SENT:"Message envoyé"},ERROR:{SEND_MSG_FAILED:"Erreur lors de l'envoi du message.",LOAD_MESSAGES_FAILED:"Erreur lors de la récupération des messages.",LOAD_MESSAGE_FAILED:"Erreur lors de la récupération du message.",MESSAGE_NOT_READABLE:"Lecture du message impossible.",USER_NOT_RECIPIENT:"Vous n'êtes pas le destinataire de ce message : déchiffrement impossible.",NOT_AUTHENTICATED_MESSAGE:"L'authenticité du message est douteuse ou son contenu est corrompu.",REMOVE_MESSAGE_FAILED:"Erreur de suppression du message",MESSAGE_CONTENT_TOO_LONG:"Valeur trop longue ({{maxLength}} caractères max).",MARK_AS_READ_FAILED:"Impossible de marquer le message comme 'lu'.",LOAD_NOTIFICATIONS_FAILED:"Erreur lors de la récupération des notifications de messages.",REMOVE_All_MESSAGES_FAILED:"Erreur lors de la suppression de tous les messages.",MARK_ALL_AS_READ_FAILED:"Erreur lors du marquage des messages comme lu.",RECIPIENT_IS_MANDATORY:"Le destinataire est obligatoire."}},REGISTRY:{CATEGORY:"Activité principale",GENERAL_DIVIDER:"Informations générales",LOCATION_DIVIDER:"Adresse",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux et site web",TECHNICAL_DIVIDER:"Informations techniques",BTN_SHOW_WOT:"Personnes",BTN_SHOW_WOT_HELP:"Rechercher des personnes",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Rechercher des pages",BTN_NEW:"Créer une page",MY_PAGES:"Mes pages",NO_PAGE:"Aucune page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"Quoi, Qui : restaurant, Chez Marcel, ...",BTN_ADD:"Nouveau",BTN_LAST_RECORDS:"Pages récentes",BTN_ADVANCED_SEARCH:"Recherche avancée",BTN_OPTIONS:"Recherche avancée",TYPE:"Type de page",LOCATION_HELP:"Où : Code postal, Ville",RESULTS:"Résultats",RESULT_COUNT_LOCATION:"{{count}} résultat{{count>0?'s':''}}, près de {{location}}",RESULT_COUNT:"{{count}} résultat{{count>0?'s':''}}",LAST_RECORDS:"Pages récentes",LAST_RECORD_COUNT_LOCATION:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}",LAST_RECORD_COUNT:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Options avancées ?"}},VIEW:{TITLE:"Annuaire",CATEGORY:"Activité principale :",LOCATION:"Adresse :",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer cette page ?<br/><br/>Cette opération est irréversible."},TYPE:{TITLE:"Types",SELECT_TYPE:"Type de page :",ENUM:{SHOP:"Commerce local",COMPANY:"Entreprise",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edition",TITLE_NEW:"Nouvelle page",RECORD_TYPE:"Type de page",RECORD_TITLE:"Nom",RECORD_TITLE_HELP:"Nom",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description de l'activité",RECORD_ADDRESS:"Rue",RECORD_ADDRESS_HELP:"Rue, bâtiment...",RECORD_CITY:"Ville",RECORD_CITY_HELP:"Ville",RECORD_SOCIAL_NETWORKS:"Réseaux sociaux et site web",RECORD_PUBKEY:"Clé publique",RECORD_PUBKEY_HELP:"Clé publique de réception des paiements"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Erreur de chargement de la liste des activités",LOAD_RECORD_FAILED:"Erreur lors du chargement de la page",LOOKUP_RECORDS_FAILED:"Erreur lors de l'exécution de la recherche",REMOVE_RECORD_FAILED:"Erreur lors de la suppression de la page",SAVE_RECORD_FAILED:"Erreur lors de la sauvegarde",RECORD_NOT_EXISTS:"Page inexistante",GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"},INFO:{RECORD_REMOVED:"Page supprimée",RECORD_SAVED:"Page sauvegardée"}},PROFILE:{PROFILE_DIVIDER:"Profil ğchange",PROFILE_DIVIDER_HELP:"Il s'agit de données annexes, stockées sur le réseau ğchange.",NO_PROFILE_DEFINED:"Aucun profil saisi",BTN_ADD:"Saisir mon profil",BTN_EDIT:"Editer mon profil",BTN_DELETE:"Supprimer mon profil",BTN_REORDER:"Réordonner",UID:"Pseudonyme",TITLE:"Nom, Prénom",TITLE_HELP:"Nom, Prénom",DESCRIPTION:"A propos de moi",DESCRIPTION_HELP:"A propos de moi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informations générales",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux, sites web",STAR:"Niveau de confiance",TECHNICAL_DIVIDER:"Informations techniques",MODAL_AVATAR:{TITLE:"Photo de profil",SELECT_FILE_HELP:"Veuillez <b>choisir un fichier image</b>, en cliquant sur le bouton ci-dessous :",BTN_SELECT_FILE:"Choisir une photo",RESIZE_HELP:"<b>Recadrez l'image</b>, si besoin. Un clic maintenu sur l'image permet de la déplacer. Cliquez sur la zone en bas à gauche pour zoomer.",RESULT_HELP:"<b>Voici le résultat</b> tel que visible sur votre profil :"},CONFIRM:{DELETE:"Êtes-vous sûr de vouloir <b>supprimer votre profil ğchange ?</b><br/><br/>Cette opération est irréversible."},ERROR:{REMOVE_PROFILE_FAILED:"Erreur de suppression du profil",LOAD_PROFILE_FAILED:"Erreur de chargement du profil utilisateur",SAVE_PROFILE_FAILED:"Erreur lors de la sauvegarde",INVALID_SOCIAL_NETWORK_FORMAT:"Format non pris en compte : veuillez indiquer une adresse valide.<br/><br/>Exemples :<ul><li>- Une page Facebook (https://www.facebook.com/user)</li><li>- Une page web (http://www.monsite.fr)</li><li>- Une adresse email (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Erreur lors du redimensionnement de l'image"},INFO:{PROFILE_REMOVED:"Profil supprimé",PROFILE_SAVED:"Profil sauvegardé"},HELP:{WARNING_PUBLIC_DATA:"Les informations renseignées dans votre profil <b>sont publiques</b> : visibles y compris par des personnes <b>non connectées</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trouver mon adresse sur la carte",USE_GEO_POINT:"Géolocaliser (recommandé) ?",LOADING_LOCATION:"Recherche de l'adresse...",LOCATION_DIVIDER:"Adresse",ADDRESS:"Rue",ADDRESS_HELP:"Rue, complément d'adresse...",CITY:"Ville",CITY_HELP:"Code postal, Ville, Pays",DISTANCE:"Distance maximale autour de la ville",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Code postal, Ville",PROFILE_POSITION:"Position du profil",MODAL:{TITLE:"Recherche de l'adresse",SEARCH_HELP:"Ville, Code postal, Pays",ALTERNATIVE_RESULT_DIVIDER:"Résultats alternatifs pour <b>{{address}}</b> :",POSITION:"Lat/Lon : {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Champ obligatoire (car une rue est saisie)",REQUIRED_FOR_LOCATION:"Champ obligatoire pour apparaître sur la carte",INVALID_FOR_LOCATION:"Adresse inconnue",GEO_LOCATION_FAILED:"Impossible de récupérer votre position. Veuillez utiliser le bouton de recherche.",ADDRESS_LOCATION_FAILED:"Impossible de récupérer la position à partir de l'adresse"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Services en ligne",SUBSCRIPTION_DIVIDER_HELP:"Les services en ligne offrent des services supplémentaires optionnels, délégués à un tiers.",BTN_ADD:"Ajouter un service",BTN_EDIT:"Gérer mes services",NO_SUBSCRIPTION:"Aucun service utilisé",SUBSCRIPTION_COUNT:"Services / Abonnements",EDIT:{TITLE:"Services en ligne",HELP_TEXT:"Gérez ici vos abonnements et autres services en ligne",PROVIDER:"Prestataire :"},TYPE:{ENUM:{EMAIL:"Recevoir les notifications par email"}},CONFIRM:{DELETE_SUBSCRIPTION:"Êtes-vous sûr de vouloir <b>supprimer cet abonnement</b> ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Erreur lors du chargement des services en ligne",ADD_SUBSCRIPTION_FAILED:"Erreur de l'envoi de l'abonnement",UPDATE_SUBSCRIPTION_FAILED:"Erreur de la mise à jour de l'abonnement",DELETE_SUBSCRIPTION_FAILED:"Erreur lors de la suppression de l'abonnement"},MODAL_EMAIL:{TITLE:"Notification par email",HELP:"Remplissez ce formulaire pour <b>être notifié par email</b> des événements de votre compte.<br/>Votre adresse email sera chiffrée pour n'être visible que par le prestataire de service.",EMAIL_LABEL:"Votre email :",EMAIL_HELP:"jean.dupond@domaine.com",FREQUENCY_LABEL:"Fréquence des notifications :",FREQUENCY_DAILY:"Journalier",FREQUENCY_WEEKLY:"Hebdomadaire",PROVIDER:"Prestataire du service :"}},DOCUMENT:{HASH:"Hash : ",LOOKUP:{TITLE:"Recherche de documents",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Derniers documents :",LAST_DOCUMENTS:"Derniers documents",SHOW_QUERY:"Voir la requête",HIDE_QUERY:"Masquer la requête",HEADER_TIME:"Date/Heure",HEADER_ISSUER:"Emetteur",HEADER_RECIPIENT:"Destinataire",READ:"Lu",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Titre",BTN_REMOVE:"Supprimer ce document",BTN_COMPACT:"Compacter",HAS_REGISTERED:"a créé ou modifié son profil",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Supprimer ces documents..."},TYPE:{USER_PROFILE:"Profil",MARKET_RECORD:"Annonce",MARKET_COMMENT:"Commentaire sur une annonce",PAGE_RECORD:"Page",PAGE_COMMENT:"Commentaire sur une page",GROUP_RECORD:"Groupe",GROUP_COMMENT:"Commentaire sur un groupe"}},INFO:{REMOVED:"Document supprimé"},CONFIRM:{REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce document</b> ?",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer ces documents</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Erreur lors de la recherche de documents",REMOVE_FAILED:"Erreur lors de la suppression du document",REMOVE_ALL_FAILED:"Erreur lors de la suppression des documents"}},ES_SETTINGS:{PLUGIN_NAME:"Paramètres avancés",PLUGIN_NAME_HELP:"Filtrage des notifications, etc.",ENABLE_TOGGLE:"Activer l'extension ?",ENABLE_MESSAGE_TOGGLE:"Activer les messages privés ?",ENABLE_SETTINGS_TOGGLE:"Activer le stockage distant des paramètres ?",PEER:"Adresse du nœud de données",POPUP_PEER:{TITLE:"Nœud de données",HELP:"Saisissez l'adresse du nœud que vous voulez utiliser :",PEER_HELP:"serveur.domaine.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Activez les types de notifications que vous souhaitez recevoir :",ENABLE_TX_SENT:"Notifier les <b>paiements émis</b> ?",ENABLE_TX_RECEIVED:"Notifier les <b>paiements reçus</b> ?",ENABLE_CERT_SENT:"Notifier les <b>certifications émises</b> ?",ENABLE_CERT_RECEIVED:"Notifier les <b>certifications reçues</b> ?"},CONFIRM:{ASK_ENABLE_TITLE:"Fonctionnalités optionnelles",ASK_ENABLE:'L\'extension Cesium+ est <b>désactivée</b> dans vos paramètres, rendant inactives les fonctionnalités : <ul><li> <b><i class="icon ion-person"></i> Profils Cesium+</b>;<li> <b><i class="icon ion-android-notifications"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Messages privés</b>.<li> <b><i class="icon ion-location"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l\'extension ?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinataire est obligatoire pour le chiffrement."}},ES_PEER:{NAME:"Nom",DOCUMENTS:"Documents",SOFTWARE:"Logiciel",DOCUMENT_COUNT:"Nombre de documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} abonnés aux notifications par email"},EVENT:{NODE_STARTED:"Votre noeud ES API <b>{{params[0]}}</b> est démarré",NODE_BMA_DOWN:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> (utilisé par votre noeud ES API) est <b>injoignable</b>.",NODE_BMA_UP:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> est à nouveau accessible.",MEMBER_JOIN:"Vous êtes maintenant <b>membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_LEAVE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_EXCLUDE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b>, faute de non renouvellement ou par manque de certifications.",MEMBER_REVOKE:"La révocation de votre compte a été effectuée. Il ne pourra plus être un compte membre de la monnaie <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Votre renouvellement d'adhésion à la monnaie <b>{{params[0]}}</b> a été <b>pris en compte</b>.",TX_SENT:'Votre <b>paiement</b> à <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> a été effectué.',TX_SENT_MULTI:"Votre <b>paiement</b> à <b>{{params[1]}}</b> a été effectué.",TX_RECEIVED:'Vous avez <b>reçu un paiement</b> de <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.",CERT_SENT:'Votre <b>certification</b> à <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> a été effectuée.',CERT_RECEIVED:'Vous avez <b>reçu une certification</b> de <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> aime votre profil',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> suit votre activité',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> vous a noté ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> vous demande une modération sur le profil : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé un profil à supprimer : <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé votre profil'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié sa réponse à votre commentaire sur la page : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur la page : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> vous demande une modération sur la page : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé une page à supprimer : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé votre page : <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nœud de données <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud de données <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:'Nœud de données <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changer de nœud de données dans les <a class="positive" ng-click="doQuickFix(\'settings\')">paramètres avancés</a>.',ES_MAX_UPLOAD_BODY_SIZE:"Le volume des données à envoyer dépasse la limite fixée par le serveur.<br/>Veuillez ré-essayer après avoir, par exemple, supprimer des photos."}}),e.translations("nl-NL",{COMMON:{CATEGORY:"Categorie",CATEGORIES:"Categorieën",CATEGORY_SEARCH_HELP:"Zoeken",LAST_MODIFICATION_DATE:"Vernieuws op ",SUBMIT_BY:"Ingediend door",BTN_PUBLISH:"Publiceren",BTN_PICTURE_DELETE:"Wissen",BTN_PICTURE_FAVORISE:"Default",BTN_ADD_PICTURE:"Afbeelding toevoegen",NOTIFICATIONS:{TITLE:"Notificaties",MARK_ALL_AS_READ:"Markeer alles als gelezen",NO_RESULT:"Geen berichten",SHOW_ALL:"Toon alles",LOAD_NOTIFICATIONS_FAILED:"Kan berichten niet laden"}},MENU:{REGISTRY:"Ondernemingen",USER_PROFILE:"Mijn profiel",MESSAGES:"Berichten"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Ondernemingsrekening",ORGANIZATION_ACCOUNT_HELP:"Als je een onderneming, vereniging etc. vertegenwoordigd.<br/>Deze rekening zal geen dividend créeren."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vul <a ui-sref="app.user_edit_profile"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen.'}},COMMENTS:{DIVIDER:"Commentaren",SHOW_MORE_COMMENTS:"Toon eerder commentaren",COMMENT_HELP:"Jouw commentaar, vraag...",COMMENT_HELP_REPLY_TO:"Jouw antwoord...",BTN_SEND:"Verzenden",POPOVER_SHARE_TITLE:"Bericht #{{number}}",REPLY:"Antwoord",REPLY_TO:"Antwoorden op:",REPLY_TO_LINK:"In antwoord op ",REPLY_TO_DELETED_COMMENT:"In antwoord op een gewist bericht",REPLY_COUNT:"{{replyCount}} antwoorden",DELETED_COMMENT:"Bericht gewist"},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Antwoord",BTN_COMPOSE:"Nieuw bericht",BTN_WRITE:"Schrijven",NO_MESSAGE_INBOX:"Geen bericht ontvangen",NO_MESSAGE_OUTBOX:"Geen bericht verzonden",NOTIFICATIONS:{TITLE:"Berichten",MESSAGE_RECEIVED:"Je hebt een <b>bericht ontvangen</b><br/>van"},LIST:{INBOX:"Inbox",OUTBOX:"Verzonden",TITLE:"Privé",POPOVER_ACTIONS:{TITLE:"Opties",DELETE_ALL:"Alle berichten wissen"}},COMPOSE:{TITLE:"Nieuw bericht",TITLE_REPLY:"Antwoord",SUB_TITLE:"Nieuw bericht",TO:"Aan",OBJECT:"Onderwerp",OBJECT_HELP:"Onderwerp",ENCRYPTED_HELP:"Please note this message will by encrypt before sending zodat alleen de ontvanger het kan lezen en zeker kan zijn dat jij de auteur bent.",MESSAGE:"Bericht",MESSAGE_HELP:"Berichtinhoud",CONTENT_CONFIRMATION:"Geen berichtinhoud.<br/><br/>Weet je zeker dat je dit bericht wil verzenden?"},VIEW:{TITLE:"Bericht",SENDER:"Verzonden door",RECIPIENT:"Verzonden aan",NO_CONTENT:"Leeg bericht"},CONFIRM:{REMOVE:"Weet je zeker dat je <b>dit bericht wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",REMOVE_ALL:"Weet je zeker dat je <b>alle berichten wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",MARK_ALL_AS_READ:"Weet je zeker dat je <b>alle berichten als gelezen wil markeren</b>?"},INFO:{MESSAGE_REMOVED:"Bericht succesvol gewist",All_MESSAGE_REMOVED:"Berichten succesvol gewist",MESSAGE_SENT:"Bericht verzonden"},ERROR:{SEND_MSG_FAILED:"Fout tijdens verzending.",LOAD_MESSAGES_FAILED:"Kan berichten niet laden.",LOAD_MESSAGE_FAILED:"Kan bericht niet laden.",MESSAGE_NOT_READABLE:"Kan bericht niet lezen.",USER_NOT_RECIPIENT:"Je bent niet de geadresseerde van dit bericht: het kan niet gelezen worden.",NOT_AUTHENTICATED_MESSAGE:"De authenticiteit van het bericht is onduidelijk of de inhoud is gecorrumpeerd.",REMOVE_MESSAGE_FAILED:"Kan bericht niet wissen.",MESSAGE_CONTENT_TOO_LONG:"Waarde te land (max {{maxLength}} characters).",MARK_AS_READ_FAILED:"Kan bericht niet als gelezen markeren.",LOAD_NOTIFICATIONS_FAILED:"Kan niet alle berichtnotificaties laden.",REMOVE_All_MESSAGES_FAILED:"Kan niet alle berichten wissen.",MARK_ALL_AS_READ_FAILED:"Kan berichten niet als gelezen markeren."}},REGISTRY:{CATEGORY:"Hoofdactiviteit",GENERAL_DIVIDER:"Basisinformatie",LOCATION_DIVIDER:"Adres",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",BTN_NEW:"Toevoegen",SEARCH:{TITLE:"Bedrijfsregister",TITLE_SMALL_DEVICE:"Bedrijfsregister",SEARCH_HELP:"Wie, Wat: kapper, Lili's restaurant, ...",BTN_ADD:"Nieuw",BTN_OPTIONS:"Geavanceerd zoeken",TYPE:"Soort organisatie",LOCATION:"Locatie",LOCATION_HELP:"Plaats",LAST_RECORDS:"Nieuwste referenties:",RESULTS:"Resultaten:"},VIEW:{TITLE:"Register",CATEGORY:"Hoofdactiviteit:",LOCATION:"Adres:",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe referentie",SELECT_TYPE:"Soort organizatie:",ENUM:{SHOP:"Locale winkel",COMPANY:"Onderneming",ASSOCIATION:"Stichting",INSTITUTION:"Instituut"}},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe referentie",RECORD_TYPE:"Soort organizatie",RECORD_TITLE:"Naam",RECORD_TITLE_HELP:"Naam",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Omschrijf activiteit",RECORD_ADDRESS:"Adres",RECORD_ADDRESS_HELP:"Adres: straat, gebouw...",RECORD_CITY:"Plaats",RECORD_CITY_HELP:"Plaats",RECORD_SOCIAL_NETWORKS:"Sociale media en website",RECORD_PUBKEY:"Publieke sleutel",RECORD_PUBKEY_HELP:"Publieke sleutel om betalingen te ontvangen"},ERROR:{LOAD_CATEGORY_FAILED:"Laden hoofdactiveiten mislukt",LOAD_RECORD_FAILED:"Laden datasheet mislukt",LOOKUP_RECORDS_FAILED:"Opzoeken datasheets is mislukt.",REMOVE_RECORD_FAILED:"Verwijderen datasheet mislukt",SAVE_RECORD_FAILED:"Opslaan datasheet mislukt",RECORD_NOT_EXISTS:"Datasheet niet gevonden"},INFO:{RECORD_REMOVED:"Datasheet succesvol verwijderd"}},PROFILE:{UID:"Pseudoniem",TITLE:"Naam",TITLE_HELP:"Naam",DESCRIPTION:"Over mij",DESCRIPTION_HELP:"Over mij...",ADDRESS:"Adres",ADDRESS_HELP:"Adres (optioneel)",CITY:"Plaats",CITY_HELP:"Plaats (optioneel)",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Algemene informatie",LOCATION_DIVIDER:"Localisatie",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",ERROR:{LOAD_PROFILE_FAILED:"Kon gebruikersprofiel niet laden.",SAVE_PROFILE_FAILED:"Opslaan profiel mislukt",INVALID_SOCIAL_NETWORK_FORMAT:"Ongeldig formaat: vul een geldig internetadres in.<br/><br/>Voorbeelden:<ul><li>- Een Facebookpagina (https://www.facebook.com/user)</li><li>- Een webpagina (http://www.domain.com)</li><li>- Een emailadres (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Fout tijdens afbeelding schalen"},INFO:{PROFILE_SAVED:"Profiel opgeslagen"},HELP:{WARNING_PUBLIC_DATA:"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>."}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",ENABLE_TOGGLE:"Uitbreiding inschakelen?",ENABLE_MESSAGE_TOGGLE:"Berichten inschakelen?",ENABLE_SETTINGS_TOGGLE:"Globale opslag voor instellingen inschakelen?",PEER:"Adres dataknooppunt",POPUP_PEER:{TITLE:"Dataknoop",HELP:"Stel het te gebruiken adres in:",PEER_HELP:"server.domein.com:poort"},NOTIFICATIONS:{DIVIDER:"Notificaties",HELP_TEXT:"Schakel het type notificatie dat je wil ontvangen in:",ENABLE_TX_SENT:"Bericht bij validatie van <b>verzonden betalingen</b>?",ENABLE_TX_RECEIVED:"Bericht bij validatie van <b>ontvangen betalingen</b>?",ENABLE_CERT_SENT:"Bericht bij validatie van <b>verzonden certificaties</b>?",ENABLE_CERT_RECEIVED:"Bericht bij validatie van <b>ontvangen certificaties</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Nieuwe functies",ASK_ENABLE:'Er zijn nieuwe functies beschikbaar: <ul><li> <b><i class="icon ion-person"></i> Profile Cesium+</b>;<li> <b><i class="icon ion-android-notifcaitions"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Privé berichten</b>.</ul><br/>Deze zijn <b>uitgeschakeld</b> in je instellingen.<br/><br/>Wil je deze functies <b>inschakelen</b>?'}},EVENT:{NODE_STARTED:"Je knoop ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.",NODE_BMA_UP:"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer onbereikbaar.",MEMBER_JOIN:"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!",MEMBER_ACTIVE:"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.",TX_SENT:'Je <b>betaling</b> aan <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> is uitgevoerd.',TX_SENT_MULTI:"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.",TX_RECEIVED:'Je hebt een <b>betaling ontvangen</b> van <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.",CERT_SENT:'Je <b>certificatie</b> van <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> is uitgevoerd.',CERT_RECEIVED:'Je hebt een <b>certificatie ontvangen</b> van <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',REGISTRY:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>'}},ERROR:{}}),e.translations("en-GB",{MAP:{COMMON:{SEARCH_DOTS:"Search..."},NETWORK:{LOOKUP:{BTN_MAP:"Peers map",BTN_MAP_HELP:"Open peers map"},VIEW:{TITLE:"Peers map",LAYER:{MEMBER:"Member peers",MIRROR:"Mirror peers",OFFLINE:"Offline peers"}}},WOT:{LOOKUP:{BTN_MAP:"Members map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:"Members",PENDING:"Pending registrations",WALLET:"Simple wallets"}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"}}}),e.translations("en",{MAP:{COMMON:{SEARCH_DOTS:"Search..."},NETWORK:{LOOKUP:{BTN_MAP:"Peers map",BTN_MAP_HELP:"Open peers map"},VIEW:{TITLE:"Peers map",LAYER:{MEMBER:"Member peers",MIRROR:"Mirror peers",OFFLINE:"Offline peers"}}},WOT:{LOOKUP:{BTN_MAP:"Members map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:"Members",PENDING:"Pending registrations",WALLET:"Simple wallets"}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"}}}),e.translations("eo-EO",{MAP:{COMMON:{SEARCH_DOTS:"Traserĉi...",BTN_LOCALIZE_ME:"Lokalizi min"},NETWORK:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri nodoj"},VIEW:{TITLE:"Mapo pri nodoj",LAYER:{MEMBER:"Membro-nodoj",MIRROR:"Spegul-nodoj",OFFLINE:"Nekonektitaj nodoj"}}},WOT:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri membroj"},VIEW:{TITLE:"Mapo pri membroj",LAYER:{MEMBER:"Membroj",PENDING:"Aliĝoj atendantaj",WALLET:"Simplaj monujoj"}}},PROFILE:{MARKER_HELP:"<b>Ŝovu-demetu</b> tiun ĉi markilon por <b>aktualigi<br/> vian lokon</b> sur la mapo, aŭ uzu la serĉo-butonon<br/>super la mapo."},ERROR:{LOCALIZE_ME_FAILED:"Neeblas ricevi vian nunan lokon"}}}),e.translations("fr-FR",{MAP:{COMMON:{SEARCH_DOTS:"Rechercher...",BTN_LOCALIZE_ME:"Me localiser"},NETWORK:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des noeuds"},VIEW:{TITLE:"Carte des noeuds",LAYER:{MEMBER:"Nœuds membre",MIRROR:"Nœuds miroir",OFFLINE:"Nœuds hors ligne"}}},WOT:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des membres"},VIEW:{TITLE:"Carte des membres",LAYER:{MEMBER:"Membres",PENDING:"Inscriptions en attente",WALLET:"Simples portefeuilles"}}},PROFILE:{MARKER_HELP:"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b>, ou utilisez les boutons<br/>au dessus de la carte."},ERROR:{LOCALIZE_ME_FAILED:"Impossible de récupérer votre position actuelle"}}}),e.translations("en-GB",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics",MARKET:{TITLE:"Number of Ads",AD:"Ads",COMMENT:"Comments"},USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},SUBSCRIPTION:{TITLE:"Number of online subscriptions",EMAIL:"Email notifications"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("en",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics",MARKET:{TITLE:"Number of Ads",AD:"Ads",COMMENT:"Comments"},USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},SUBSCRIPTION:{TITLE:"Number of online subscriptions",EMAIL:"Email notifications"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("eo-EO",{NETWORK:{VIEW:{BTN_GRAPH:"Statistikoj"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineara skalo",LOGARITHMIC_SCALE:"Logaritma skalo",BTN_SHOW_STATS:"Vidi la statistikojn",BTN_SHOW_DETAILED_STATS:"Detalaj statistikoj",RANGE_DURATION_DIVIDER:"Tempo-unuo:",RANGE_DURATION:{HOUR:"Horo",DAY:"Tago",MONTH:"Monato"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombro de blokoj kalkulitaj",BLOCK_COUNT:"{{count}} blokoj",NO_BLOCK:"Neniu bloko"}},DOC_STATS:{TITLE:"Statistikoj pri stokado",MARKET:{TITLE:"Nombro de anoncoj",AD:"Anoncoj",COMMENT:"Komentoj"},MARKET_DELTA:{TITLE:"Variado de la nombro de anoncoj",AD:"Anoncoj",COMMENT:"Komentoj"},USER:{TITLE:"Nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},USER_DELTA:{TITLE:"Variado de la nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},MESSAGE:{TITLE:"Nombro de dokumentoj ligitaj al komunikado",MESSAGE_INBOX:"Mesaĝoj en ricevujo",MESSAGE_OUTBOX:"Senditaj mesaĝoj konservitaj",INVITATION_CERTIFICATION:"Invitoj atestotaj"},SOCIAL:{TITLE:"Nombro de paĝoj aŭ grupoj",PAGE_COMMENT:"Komentoj",PAGE_RECORD:"Paĝoj",GROUP_RECORD:"Grupoj"},SUBSCRIPTION:{TITLE:"Nombro de abonoj",EMAIL:"Avizoj per retmesaĝoj"},OTHER:{TITLE:"Aliaj dokumentoj",HISTORY_DELETE:"Forigoj de dokumentoj"}},SYNCHRO:{TITLE:"Statistikoj pri sinkronigoj",COUNT:{TITLE:"Kvanto sinkronigita",INSERTS:"Enmetoj",UPDATES:"Ĝisdatigoj",DELETES:"Forigoj"},PEER:{TITLE:"Nodoj informpetitaj",ES_USER_API:"Nodoj pri datenoj de uzantoj",ES_SUBSCRIPTION_API:"Nodoj pri retaj servoj"},PERFORMANCE:{TITLE:"Efikecoj pri efektiviĝo",DURATION:"Tempo por efektiviĝo (ms)"}}}}),e.translations("es-ES",{NETWORK:{VIEW:{BTN_GRAPH:"Estadística"}},GRAPH:{COMMON:{LINEAR_SCALE:"Escala lineal",LOGARITHMIC_SCALE:"Escala logarítmica",BTN_SHOW_STATS:"Ver estadísticas",BTN_SHOW_DETAILED_STATS:"Estadísticas detalladas",RANGE_DURATION_DIVIDER:"Unidad de paso:",RANGE_DURATION:{HOUR:"Grupo por <b>hora</b>",DAY:"Grupo por <b>día</b>",MONTH:"Grupo por <b>mes</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Número de bloques calculados",BLOCK_COUNT:"{{count}} bloques",NO_BLOCK:"Ningún bloque"}}}}),e.translations("fr-FR",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiques"}},GRAPH:{COMMON:{LINEAR_SCALE:"Echelle linéaire",LOGARITHMIC_SCALE:"Echelle logarithmique",BTN_SHOW_STATS:"Voir les statistiques",BTN_SHOW_DETAILED_STATS:"Statistiques détaillées",RANGE_DURATION_DIVIDER:"Unité de temps :",RANGE_DURATION:{HOUR:"Heure",DAY:"Jour",MONTH:"Mois"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombre de blocs calculés",BLOCK_COUNT:"{{count}} blocs",NO_BLOCK:"Aucun bloc"}},DOC_STATS:{TITLE:"Statistiques de stockage",MARKET:{TITLE:"Nombre d'annonces",AD:"Annonces",COMMENT:"Commentaires"},MARKET_DELTA:{TITLE:"Variation du nombre d'annonces",AD:"Annonces",COMMENT:"Commentaires"},USER:{TITLE:"Nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},USER_DELTA:{TITLE:"Variation du nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},MESSAGE:{TITLE:"Nombre de documents liés à la communication",MESSAGE_INBOX:"Messages en boîte de réception",MESSAGE_OUTBOX:"Messages envoyés sauvegardés",INVITATION_CERTIFICATION:"Invitations à certifier"},SOCIAL:{TITLE:"Nombre de pages ou groupes",PAGE_COMMENT:"Commentaires",PAGE_RECORD:"Pages",GROUP_RECORD:"Groupes"},SUBSCRIPTION:{TITLE:"Nombre d'abonnements",EMAIL:"Notifications emails"},OTHER:{TITLE:"Autres documents",HISTORY_DELETE:"Suppressions de documents"}},SYNCHRO:{TITLE:"Statistiques de synchronisations",COUNT:{TITLE:"Volume synchronisé",INSERTS:"Insertions",UPDATES:"Mises à jour",DELETES:"Suppressions"},PEER:{TITLE:"Noeuds requêtés",ES_USER_API:"Noeuds données utilisateurs",ES_SUBSCRIPTION_API:"Noeuds services en ligne"},PERFORMANCE:{TITLE:"Performances d'exécution",DURATION:"Temps d'exécution (ms)"}}}}),e.translations("it-IT",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiche"}},GRAPH:{COMMON:{LINEAR_SCALE:"Scala lineare",LOGARITHMIC_SCALE:"Scala logaritmica",BTN_SHOW_STATS:"Vedere le statistiche",BTN_SHOW_DETAILED_STATS:"Statistiche dettagliate",RANGE_DURATION_DIVIDER:"Unità di tempo :",RANGE_DURATION:{HOUR:"Ora",DAY:"Giorno",MONTH:"Mese"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Numero di blocchi calcolati",BLOCK_COUNT:"{{count}} blocchi",NO_BLOCK:"Nessun blocco"}},DOC_STATS:{TITLE:"Statistiche di stoccaggio",USER:{TITLE:"Numero di documenti legati ad un conto",USER_PROFILE:"Profili dell'utente",USER_SETTINGS:"Impostazioni salvate"},MESSAGE:{TITLE:"Numero di documenti legati alla conversazione",MESSAGE_INBOX:"Messaggi in arrivo",MESSAGE_OUTBOX:"Messaggi inviati salvati",INVITATION_CERTIFICATION:"Invitazioni da certificare"},SOCIAL:{TITLE:"Numero di pagine o gruppi",PAGE_COMMENT:"Commenti",PAGE_RECORD:"Pagine",GROUP_RECORD:"Gruppi"},OTHER:{TITLE:"Altri documenti",HISTORY_DELETE:"Cronologia eliminazione documenti"}},SYNCHRO:{TITLE:"Statistiche di sincronizzazioni",COUNT:{TITLE:"Volume sincronizzato",INSERTS:"Inserimenti",UPDATES:"Aggiornamenti",DELETES:"Eliminazioni"},PEER:{TITLE:"Nodi interrogati",ES_USER_API:"Nodi dati utenti",ES_SUBSCRIPTION_API:"Noeuds servizi online"},PERFORMANCE:{TITLE:"Prestazioni (performance) di esecuzione",DURATION:"Tempo di esecuzione (ms)"}}}}),e.translations("nl-NL",{NETWORK:{VIEW:{BTN_GRAPH:"Statistieken"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineaire schaal",LOGARITHMIC_SCALE:"Logaritmische schaal",BTN_SHOW_STATS:"Zie statistieken",BTN_SHOW_DETAILED_STATS:"Gedetailleerde statistieken",RANGE_DURATION_DIVIDER:"Stap eenheid:",RANGE_DURATION:{HOUR:"Groep per <b>uur</b>",DAY:"Groep per <b>dag</b>",MONTH:"Groep per <b>maand</b>"}}}}),e.translations("en-GB",{MENU:{MARKET:"Ads",MY_RECORDS:"My ads"},MARKET:{COMMON:{PRICE:"Price",BTN_NEW_AD:"New ad",SOLD:"Close ad",LAST_UPDATE:"Last update",AROUND_ME:"Around me"},JOIN:{PROFILE:{WARNING:"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.",TITLE:"Lastname, Firstname",TITLE_HELP:"Lastname, Firstname or pseudonym",DESCRIPTION:"Abut me",DESCRIPTION_HELP:"Say something about you..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optional)"},LAST_SLIDE_CONGRATULATION:"You have entered all necessary information: Congratulations!<br/>You can now <b>send the creation request </b>.<br/><br/>For information, the public key below will identify your future account:",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> The identifier and the password can not be changed.<br/><br/>You should <b>always remember it!</b><br/><br/><b>Are you sure</b> you want to continue with these credentials?'},PROFILE:{DEFAULT_TITLE:"User {{pubkey|formatPubkey}}"},LOGIN:{HELP:"Please fill your account credentials:",REMEMBER_ME:"Remember me?"},EVENT_LOGIN:{TITLE:"Contact information",HELP:"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:",EMAIL_OR_PHONE:"Email or phone number",EMAIL_OR_PHONE_HELP:"Email or phone number",REMEMBER_ME:"Remember me?",ERROR:{INVALID_USERNAME:"Email or phone number invalid"}},HOME:{BTN_NEW_AD:"Place an ad",BTN_SHOW_MARKET_OFFER:"Explore Ads",LOCATION_LABEL:"Find ads near by:",LOCATION_HELP:"City, Country",ERROR:{GEO_LOCATION_NOT_FOUND:"City or zip code not found"}},CATEGORY:{ALL:"All categories"},SEARCH:{TITLE:"Market",CATEGORY:"Category: ",SEARCH_HELP:"What, Where: car, Columbia city, ...",BY:"by",BTN_ADD:"New",BTN_OPTIONS:"Advanced search",BTN_AROUND_ME:"Around me",GEO_DISTANCE:"Maximum distance around the city",GEO_DISTANCE_OPTION:"{{value}} km",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",LOCATION:"Location",LOCATION_HELP:"City",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent ads:",LAST_RECORD_COUNT_LOCATION:"{{count}} recent ad{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent ad{{count>0?'s':''}}",BTN_LAST_RECORDS:"Recent ads",BTN_SHOW_CATEGORIES:"Show categories",BTN_OFFERS:"Offers",BTN_NEEDS:"Needs",SHOW_CLOSED_RECORD:"Display closed ads?",SHOW_OLD_RECORD:"Display old ads?",RECORD_STOCK:"Stock:"},GALLERY:{TITLE:"Slideshow",BTN_START:"Start",BTN_CONTINUE:"Resume",BTN_PAUSE:"Pause",BTN_STOP:"Stop",SLIDE_DURATION:"Display time:",SLIDE_DURATION_OPTION:"{{value}} seconds"},VIEW:{TITLE:"Ad",BTN_SOLD_AD:"Close the ad",BTN_SOLD:"Close",BTN_REOPEN:"Reopen the ad",BTN_WRITE_OFFER:"Write to the seller",BTN_WRITE_NEED:"Write to the applicant",BTN_FOLLOW:"Follow this ad",BTN_STOP_FOLLOW:"Stop following this ad",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(fees)",RECORD_STOCK:"Available stock:",POPOVER_SHARE_TITLE:"Ad {{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this ad?<br/><br/> This is irreversible.",SOLD_CONFIRMATION:"<b>Are you sure</b> you want to close this ad?",REOPEN_CONFIRMATION:"<b>Are you sure</b> you want to repoen this ad?",NEW_MESSAGE_TITLE:'About your ad "{{title}}"...',MORE_LIKE_THIS:"This might interest you:"},WALLET:{DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) indicates the destination of the payments you will receive.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"No public account key has been entered. You will need to give it to prospective buyers.<br/>You can enter it at any time, <b>by editing your profile</b>."},TYPE:{TITLE:"New ad",SELECT_TYPE:"Kind of ad:",OFFER:"Offer",OFFER_SHORT:"Offer",NEED:"Need",NEED_SHORT:"Need"},LOCAL_SALE:{LOCATION:"Stand number",LOCATION_HELP:"Stand number: 1, 2, ...",LOCATION_PREFIX:"Stand #"},EDIT:{TITLE:"Edit",TITLE_NEW:"New ad",RECORD_TITLE:"Title",RECORD_TITLE_HELP:"Title",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Address",RECORD_LOCATION_HELP:"City, Country",RECORD_PRICE:"Price",RECORD_PRICE_HELP:"Price (optional)",RECORD_CURRENCY:"Currency",RECORD_FEES:"Fees",RECORD_FEES_HELP:"Fees (optional)",RECORD_STOCK:"Available stock",RECORD_STOCK_HELP:"Available stock"},WOT:{VIEW:{STARS:"Trust level",STAR_HIT_COUNT:"{{total}} rate{{total>1 ? 's' : ''}}",BTN_RECORDS:"Ads",BTN_STAR_HELP:"Rate this profile",BTN_REDO_STAR_HELP:"Update your rate for this profile",DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) is the account to be used to pay for this user.",DUNITER_ACCOUNT_HELP_ASK_USER:'This user has not communicated their account public key. <a ng-click="showNewMessageModal()">Contact him</a> to get it.'},ERROR:{FAILED_STAR_PROFILE:"Error sending your rate. Please try again later."}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Invalid credentials.<br/>Please try again.",FAILED_SAVE_RECORD:"Saving ad failed",FAILED_UPDATE_RECORD:"Updating Ad failed",LOAD_CATEGORY_FAILED:"Loading categories failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",LOAD_RECORD_FAILED:"Loading ad failed",REMOVE_RECORD_FAILED:"Deleting ad failed",SOLD_RECORD_FAILED:"Error while closing the ad",REOPEN_RECORD_FAILED:"Error while reopening the ad",FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed",RECORD_NOT_EXISTS:"Ad not found",RECORD_EXCEED_UPLOAD_SIZE:"It seems that your <b> ad is too big </ b> to be accepted by the data node.<br/><br/>You can delete <b>delete photos</b> again.",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Ad successfully deleted",RECORD_SOLD:"Ad closed",RECORD_REOPEN:"Ad reopen"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>'}}}),e.translations("en",{MENU:{MARKET:"Ads",MY_RECORDS:"My ads"},MARKET:{COMMON:{PRICE:"Price",BTN_NEW_AD:"New ad",SOLD:"Close ad",LAST_UPDATE:"Last update",AROUND_ME:"Around me"},JOIN:{PROFILE:{WARNING:"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.",TITLE:"Lastname, Firstname",TITLE_HELP:"Lastname, Firstname or pseudonym",DESCRIPTION:"Abut me",DESCRIPTION_HELP:"Say something about you..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optional)"},LAST_SLIDE_CONGRATULATION:"You have entered all necessary information: Congratulations!<br/>You can now <b>send the creation request </b>.<br/><br/>For information, the public key below will identify your future account:",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> The identifier and the password can not be changed.<br/><br/>You should <b>always remember it!</b><br/><br/><b>Are you sure</b> you want to continue with these credentials?'},PROFILE:{DEFAULT_TITLE:"User {{pubkey|formatPubkey}}"},LOGIN:{HELP:"Please fill your account credentials:",REMEMBER_ME:"Remember me?"},EVENT_LOGIN:{TITLE:"Contact information",HELP:"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:",EMAIL_OR_PHONE:"Email or phone number",EMAIL_OR_PHONE_HELP:"Email or phone number",REMEMBER_ME:"Remember me?",ERROR:{INVALID_USERNAME:"Email or phone number invalid"}},HOME:{BTN_NEW_AD:"Place an ad",BTN_SHOW_MARKET_OFFER:"Explore Ads",LOCATION_LABEL:"Find ads near by:",LOCATION_HELP:"City, Country",ERROR:{GEO_LOCATION_NOT_FOUND:"City or zip code not found"}},CATEGORY:{ALL:"All categories"},SEARCH:{TITLE:"Market",CATEGORY:"Category: ",SEARCH_HELP:"What, Where: car, Columbia city, ...",BY:"by",BTN_ADD:"New",BTN_OPTIONS:"Advanced search",BTN_AROUND_ME:"Around me",GEO_DISTANCE:"Maximum distance around the city",GEO_DISTANCE_OPTION:"{{value}} km",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",LOCATION:"Location",LOCATION_HELP:"City",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent ads:",LAST_RECORD_COUNT_LOCATION:"{{count}} recent ad{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent ad{{count>0?'s':''}}",BTN_LAST_RECORDS:"Recent ads",BTN_SHOW_CATEGORIES:"Show categories",BTN_OFFERS:"Offers",BTN_NEEDS:"Needs",SHOW_CLOSED_RECORD:"Display closed ads?",SHOW_OLD_RECORD:"Display old ads?",RECORD_STOCK:"Stock:"},GALLERY:{TITLE:"Slideshow",BTN_START:"Start",BTN_CONTINUE:"Resume",BTN_PAUSE:"Pause",BTN_STOP:"Stop",SLIDE_DURATION:"Display time:",SLIDE_DURATION_OPTION:"{{value}} seconds"},VIEW:{TITLE:"Ad",BTN_SOLD_AD:"Close the ad",BTN_SOLD:"Close",BTN_REOPEN:"Reopen the ad",BTN_WRITE_OFFER:"Write to the seller",BTN_WRITE_NEED:"Write to the applicant",BTN_FOLLOW:"Follow this ad",BTN_STOP_FOLLOW:"Stop following this ad",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(fees)",RECORD_STOCK:"Available stock:",POPOVER_SHARE_TITLE:"Ad {{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this ad?<br/><br/> This is irreversible.",SOLD_CONFIRMATION:"<b>Are you sure</b> you want to close this ad?",REOPEN_CONFIRMATION:"<b>Are you sure</b> you want to repoen this ad?",NEW_MESSAGE_TITLE:'About your ad "{{title}}"...',MORE_LIKE_THIS:"This might interest you:"},WALLET:{DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) indicates the destination of the payments you will receive.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"No public account key has been entered. You will need to give it to prospective buyers.<br/>You can enter it at any time, <b>by editing your profile</b>."},TYPE:{TITLE:"New ad",SELECT_TYPE:"Kind of ad:",OFFER:"Offer",OFFER_SHORT:"Offer",NEED:"Need",NEED_SHORT:"Need"},LOCAL_SALE:{LOCATION:"Stand number",LOCATION_HELP:"Stand number: 1, 2, ...",LOCATION_PREFIX:"Stand #"},EDIT:{TITLE:"Edit",TITLE_NEW:"New ad",RECORD_TITLE:"Title",RECORD_TITLE_HELP:"Title",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Address",RECORD_LOCATION_HELP:"City, Country",RECORD_PRICE:"Price",RECORD_PRICE_HELP:"Price (optional)",RECORD_CURRENCY:"Currency",RECORD_FEES:"Fees",RECORD_FEES_HELP:"Fees (optional)",RECORD_STOCK:"Available stock",RECORD_STOCK_HELP:"Available stock"},WOT:{VIEW:{BTN_RECORDS:"Ads",DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) is the account to be used to pay for this user.",DUNITER_ACCOUNT_HELP_ASK_USER:'This user has not communicated their account public key. <a ng-click="showNewMessageModal()">Contact him</a> to get it.'},ERROR:{FAILED_STAR_PROFILE:"Error sending your rate. Please try again later."}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Invalid credentials.<br/>Please try again.",FAILED_SAVE_RECORD:"Saving ad failed",FAILED_UPDATE_RECORD:"Updating Ad failed",LOAD_CATEGORY_FAILED:"Loading categories failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",LOAD_RECORD_FAILED:"Loading ad failed",REMOVE_RECORD_FAILED:"Deleting ad failed",SOLD_RECORD_FAILED:"Error while closing the ad",REOPEN_RECORD_FAILED:"Error while reopening the ad",FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed",RECORD_NOT_EXISTS:"Ad not found",RECORD_EXCEED_UPLOAD_SIZE:"It seems that your <b> ad is too big </ b> to be accepted by the data node.<br/><br/>You can delete <b>delete photos</b> again.",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Ad successfully deleted",RECORD_SOLD:"Ad closed",RECORD_REOPEN:"Ad reopen"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>'}}}),e.translations("eo-EO",{MENU:{MARKET:"Anoncoj",MY_RECORDS:"Miaj anoncoj"},MARKET:{COMMON:{PRICE:"Prezo",BTN_NEW_AD:"Mi metas anoncon",SOLD:"Anonco fermita",LAST_UPDATE:"Lasta ĝisdatigo",AROUND_ME:"Ĉirkaŭ mi"},JOIN:{PROFILE:{WARNING:"Nun restas al vi kompletigi vian uzant-profilon.<br/><br/>Temas pri <b>publikaj informoj</b>, alireblaj de ĉiuj.",TITLE:"Familia nomo, Persona nomo",TITLE_HELP:"Familia nomo, Persona nomo aŭ pseŭdonimo",DESCRIPTION:"Pri mi",DESCRIPTION_HELP:"Diru ion pri vi..."},SUBSCRIPTION:{EMAIL:"Retadreso",EMAIL_HELP:"Retadreso (nedeviga)"},LAST_SLIDE_CONGRATULATION:"Vi tajpis ĉiujn necesajn informojn: Gratulon!<br/>Vi nun povas <b>sendi la peton pri kreado</b> de konto.<br/><br/>Ne forgesu viajn identigilojn, vi ne povos ŝanĝi ilin!",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Averto:</b> la identigilo kaj la pasvorto ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememoros ilin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi per tiuj identigiloj?'},PROFILE:{DEFAULT_TITLE:"Uzanto {{pubkey|formatPubkey}}"},LOGIN:{HELP:"Bonvolu tajpi viajn identigilojn por konektiĝi:",REMEMBER_ME:"Memori min?"},EVENT_LOGIN:{TITLE:"Kontakteblecoj",HELP:"Bonvolu indiki <b>retadreson aŭ poŝtelefon-numeron</b>, tiel ke la organizantoj povu kontakti vin dum la evento:",EMAIL_OR_PHONE:"Retadreso aŭ telefono",EMAIL_OR_PHONE_HELP:"Retadreso aŭ telefon-numero",REMEMBER_ME:"Memori min?",ERROR:{INVALID_USERNAME:"Retadreso aŭ telefon-numero nevalida"}},HOME:{BTN_NEW_AD:"Meti anoncon",BTN_SHOW_MARKET_OFFER:"Vidi la anoncojn",LOCATION_LABEL:"Serĉado de anoncoj laŭ urbo:",LOCATION_HELP:"Poŝt-kodo, Urbo",ERROR:{GEO_LOCATION_NOT_FOUND:"Urbo aŭ poŝt-kodo ne trovita"}},CATEGORY:{ALL:"Ĉiuj kategorioj"},SEARCH:{TITLE:"Anoncoj",CATEGORY:"Kategorio: ",SEARCH_HELP:"Serĉado (biciklo, ŝuoj...)",BY:"de",BTN_ADD:"Nova",BTN_OPTIONS:"Detala serĉado",BTN_AROUND_ME:"Ĉirkaŭ mi",GEO_DISTANCE:"Maksimuma distanco ĉirkaŭ la urbo:",GEO_DISTANCE_OPTION:"{{value}} km",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",LOCATION:"Urbo",LOCATION_HELP:"Poŝt-kodo, Urbo",RESULTS:"Rezultoj",RESULT_COUNT_LOCATION:"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}",RESULT_COUNT:"{{count}} rezulto{{count>0?'j':''}}",LAST_RECORDS:"Lastaj anoncoj",LAST_RECORD_COUNT_LOCATION:"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}, proksime de {{location}}",LAST_RECORD_COUNT:"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}",BTN_LAST_RECORDS:"Lastaj anoncoj",BTN_SHOW_CATEGORIES:"Trarigardi la kategoriojn",BTN_OFFERS:"Proponoj",BTN_NEEDS:"Petoj",SHOW_CLOSED_RECORD:"Afiŝi la fermitajn anoncojn?",SHOW_OLD_RECORD:"Afiŝi la malnovajn anoncojn?",RECORD_STOCK:"Stoko:"},GALLERY:{TITLE:"Bildaro",BTN_START:"Komenci",BTN_CONTINUE:"Malpaŭzi",BTN_PAUSE:"Paŭzi",BTN_STOP:"Ĉesi",SLIDE_DURATION:"Afiŝo-daŭro:",SLIDE_DURATION_OPTION:"{{value}} sekundoj"},VIEW:{TITLE:"Anonco",BTN_SOLD_AD:"Fermi la anoncon",BTN_SOLD:"Fermi",BTN_REOPEN:"Reaperigi la anoncon",BTN_WRITE_OFFER:"Skribi al la vendanto",BTN_WRITE_NEED:"Skribi al la petanto",BTN_FOLLOW:"Sekvi tiun ĉi anoncon",BTN_STOP_FOLLOW:"Ne plu sekvi tiun ĉi anoncon",MENU_TITLE:"Kromeblecoj",RECORD_FEES_PARENTHESIS:"(kostoj)",RECORD_STOCK:"Stoko disponebla:",POPOVER_SHARE_TITLE:"Anonco {{title}}",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi anoncon?<br/><br/>Tiu ago estas neinversigebla.",SOLD_CONFIRMATION:"<b>Ĉu vi certas</b>, ke vi volas fermi tiun ĉi anoncon?",REOPEN_CONFIRMATION:"<b>Ĉu vi certas</b>, ke vi volas reaperigi tiun ĉi anoncon?",NEW_MESSAGE_TITLE:'Pri la anonco "{{title}}"...',MORE_LIKE_THIS:"Tio ĉi povus interesi vin:"},WALLET:{DUNITER_PUBKEY:"Publika ŝlosilo por ricevi la pagojn",DUNITER_ACCOUNT:"Ricevo de la pagoj en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La publika ŝlosilo (ĉi-supre) indikas la celkonton de la pagoj, kiujn vi ricevos.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Neniu publika ŝlosilo de konto estis sciigita. Vi devos doni ĝin al la eventualaj aĉetontoj.<br/>Vi povas tajpi ĝin iam ajn, <b>redaktante vian profilon</b>."},TYPE:{TITLE:"Nova anonco",SELECT_TYPE:"Tipo de anonco:",OFFER:"Propono, Vendo",OFFER_SHORT:"Propono",NEED:"Peto, Serĉo",NEED_SHORT:"Peto"},LOCAL_SALE:{LOCATION:"Numero de budo",LOCATION_HELP:"Numero de budo: 1, 2, ...",LOCATION_PREFIX:"Budo n°"},EDIT:{TITLE:"Redaktado",TITLE_NEW:"Nova anonco",RECORD_TITLE:"Titolo",RECORD_TITLE_HELP:"Titolo: biciklo, libro...",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo",RECORD_LOCATION:"Urbo",RECORD_LOCATION_HELP:"Poŝt-kodo, Urbo",RECORD_PRICE:"Prezo",RECORD_PRICE_HELP:"Prezo (nedeviga)",RECORD_CURRENCY:"Mono",RECORD_FEES:"Sendo-kostoj",RECORD_FEES_HELP:"Kostoj (nedeviga)",RECORD_STOCK:"Stoko disponebla",RECORD_STOCK_HELP:"Stoko disponebla"},WOT:{VIEW:{BTN_RECORDS:"Anoncoj",DUNITER_PUBKEY:"Publika ŝlosilo por ricevi la pagojn",DUNITER_ACCOUNT:"Ricevo de la pagoj en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La publika ŝlosilo (ĉi-supre) rilatas al la konto uzota por pagi tiun ĉi anoncanton.",DUNITER_ACCOUNT_HELP_ASK_USER:'Tiu ĉi anoncanto ne sciigis la publikan ŝlosilon de sia konto. <a ng-click="showNewMessageModal()">Kontaktu lin/ŝin</a> por ekhavi ĝin.'},ERROR:{FAILED_STAR_PROFILE:"Eraro dum la sendo de via noto. Bonvolu reprovi pli poste."}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Identigilo aŭ pasvorto nevalida.<br/><br/>Kontrolu, ke ili ja rilatas al konto <b>kreita ĉe ğchange</b>.",FAILED_SAVE_RECORD:"Eraro dum la registrado de la anonco",FAILED_UPDATE_RECORD:"Eraro dum la ĝisdatigo de la anonco",LOAD_CATEGORY_FAILED:"Eraro dum la ekstarigo de la kategorioj",LOOKUP_RECORDS_FAILED:"Eraro dum la disvolviĝo de la serĉado",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝado de la anonco",REMOVE_RECORD_FAILED:"Eraro dum la forigo de la anonco",SOLD_RECORD_FAILED:"Eraro dum la fermo de la anonco",REOPEN_RECORD_FAILED:"Eraro dum la reaperigo de la anonco",FAILED_SAVE_COMMENT:"Eraro dum la konservo de la komento",FAILED_REMOVE_COMMENT:"Eraro dum la forigo de la komento",RECORD_NOT_EXISTS:"Anonco neekzistanta",RECORD_EXCEED_UPLOAD_SIZE:"Ŝajnas, ke via anonco <b>estas tro ampleksa</b> por esti akceptata de la daten-nodo.<br/><br/>Vi povas ekzemple <b>forigi fotojn</b>, kaj poste provi denove.",GEO_LOCATION_NOT_FOUND:"Urbo aŭ post-kodo ne trovita"},INFO:{RECORD_REMOVED:"Anonco forigita",RECORD_SOLD:"Anonco fermita",RECORD_REOPEN:"Anonco reaperigita"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe via anonco: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> respondis al via komento ĉe la anonco: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis la respondon al via komento ĉe la anonco: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe la anonco: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> aldonis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis la anoncon: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> fermis la anoncon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> petas de vi moderigon ĉe la anonco: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri anonco moderiginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri via anonco: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ŝatis vian anoncon: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sekvas vian anoncon: <b>{{params[2]}}</b>'}}}),e.translations("es-ES",{MENU:{MARKET:"Anuncios",MY_RECORDS:"Mis anuncios"},MARKET:{COMMON:{PRICE:"Precio",BTN_NEW_AD:"Presento un anuncio",SOLD:"El anuncio cerrada",AROUND_ME:"Alrededor de yo"},HOME:{BTN_NEW_AD:"Poner un anuncio",BTN_SHOW_MARKET_OFFER:"Consultar los anuncios"},CATEGORY:{ALL:"Todas las categorías"},SEARCH:{TITLE:"Anuncios",CATEGORY:"Categorías: ",SEARCH_HELP:"Búsqueda (coche, libro...)",BY:"por",BTN_ADD:"Nuevo",BTN_OPTIONS:"Búsqueda avanzada",BTN_AROUND_ME:"Alrededor de yo",SHOW_MORE:"Visualizar más",SHOW_MORE_COUNT:"(límite actual a {{limit}})",LOCATION:"localización",LOCATION_HELP:"Ciudad",LAST_RECORDS:"últimos anuncios :",RESULTS:"Resultados :",BTN_LAST_RECORDS:"últimos anuncios",BTN_SHOW_CATEGORIES:"Recorrer las categorías",BTN_OFFERS:"Ofrecimientos",BTN_NEEDS:"Demandas",SHOW_CLOSED_RECORD:"Mostrar anuncios cerrados?",RECORD_STOCK:"Stock :"},GALLERY:{TITLE:"Diapositivas",BTN_START:"Comienzo",BTN_CONTINUE:"Retomar",BTN_PAUSE:"Pausa",BTN_STOP:"Detener",SLIDE_DURATION:"Visualización de la hora :",SLIDE_DURATION_OPTION:"{{value}} segundo"},VIEW:{TITLE:"Anuncio",BTN_SOLD_AD:"Vendido",BTN_SOLD:"Vendido",BTN_REOPEN:"Reabierto el anuncio",BTN_WRITE_OFFER:"Escribir al vendedor",BTN_WRITE_NEED:"Escribir al solicitante",MENU_TITLE:"Opciónes",RECORD_FEES_PARENTHESIS:"(gastos)",RECORD_STOCK:"Stock disponible :",POPOVER_SHARE_TITLE:"Anuncio {{title}}",REMOVE_CONFIRMATION:"Está usted segura/o querer suprimir este anuncio ?<br/><br/>Esta operación es ireversible."},TYPE:{TITLE:"Nuevo anuncio",SELECT_TYPE:"Tipo de anuncio :",OFFER:"Ofrecimiento, Venta",OFFER_SHORT:"Ofrecimiento",NEED:"Demanda, Búsqueda",NEED_SHORT:"Demanda"},LOCAL_SALE:{LOCATION:"Número de stand",LOCATION_HELP:"Número de stand : 1, 2, ...",LOCATION_PREFIX:"Stand n°"},EDIT:{TITLE:"Edición",TITLE_NEW:"Nuevo anuncio",RECORD_TITLE:"Título",RECORD_TITLE_HELP:"Título",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción",RECORD_LOCATION:"Ciudad",RECORD_LOCATION_HELP:"Dirección, Ciudad",RECORD_PRICE:"Precio",RECORD_PRICE_HELP:"Precio (opcional)",RECORD_CURRENCY:"Moneda",RECORD_FEES:"Gastos de envío",RECORD_FEES_HELP:"Gastos de envío (opcional)",RECORD_STOCK:"Stock disponible",RECORD_STOCK_HELP:"Stock disponible"},WOT:{VIEW:{BTN_RECORDS:"Anuncios"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"De usuario o contraseña no válidos.<br/>Por favor, inténtelo de nuevo.",FAILED_SAVE_RECORD:"Fracaso durante el registro de el anuncio",FAILED_UPDATE_RECORD:"Fracaso durante la actualización de el anuncio",LOAD_CATEGORY_FAILED:"Erreur de actualización de las categorías",LOOKUP_RECORDS_FAILED:"Fracaso durante la ejecución de la búsqueda.",LOAD_RECORD_FAILED:"Fracaso durante la carga de el anuncio.",REMOVE_RECORD_FAILED:"Erreur de la supresión de el anuncio",SOLD_RECORD_FAILED:"Erreur de la cierre de el anuncio",REOPEN_RECORD_FAILED:"Erreur de la reapertura de el anuncio",FAILED_SAVE_COMMENT:"Fracaso durante el respaldo del comentario",FAILED_REMOVE_COMMENT:"Fracaso durante la supresión del comentario",RECORD_NOT_EXISTS:"Anuncio inexistente"},INFO:{RECORD_REMOVED:"Anuncio suprimido",RECORD_SOLD:"Anuncio cerrada",RECORD_REOPEN:"Anuncio reabrió"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>'}}}),e.translations("fr-FR",{MENU:{MARKET:"Annonces",MY_RECORDS:"Mes annonces"},MARKET:{COMMON:{PRICE:"Prix",BTN_NEW_AD:"Je dépose une annonce",SOLD:"Annonce close",LAST_UPDATE:"Dernière mise à jour",AROUND_ME:"Autour de moi"},JOIN:{PROFILE:{WARNING:"Il vous reste maintenant à compléter votre profil utilisateur.<br/><br/>Il s'agit <b>d'informations publiques</b>, accessibles par tous.",TITLE:"Nom, Prénom",TITLE_HELP:"Nom, Prénom ou pseudonyme",DESCRIPTION:"A propos de moi",DESCRIPTION_HELP:"Dites quelque chose à propos de vous..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optionnel)"},LAST_SLIDE_CONGRATULATION:"Vous avez saisi toutes les informations nécessaires : Bravo !<br/>Vous pouvez maintenant <b>envoyer la demande de création</b> de compte.<br/><br/>N'oubliez pas vos identifiants, vous ne pourrez pas en changer !",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Avertissement :</b> l\'identifiant et le mot de passe ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Etes-vous sûr</b> de vouloir continuer avec ces identifiants ?'},PROFILE:{DEFAULT_TITLE:"Utilisateur {{pubkey|formatPubkey}}"},LOGIN:{HELP:"Veuillez saisir vos identifiants de connexion :",REMEMBER_ME:"Se souvenir de moi ?"},EVENT_LOGIN:{TITLE:"Coordonnées",HELP:"Veuillez indiquer un <b>email ou numéro de téléphone</b> portable, afin que les organisateurs puissent vous contacter durant l'événement :",EMAIL_OR_PHONE:"Email ou téléphone",EMAIL_OR_PHONE_HELP:"Email ou numéro de téléphone",REMEMBER_ME:"Se souvenir de moi ?",ERROR:{INVALID_USERNAME:"Email ou numéro de téléphone non valide"}},HOME:{BTN_NEW_AD:"Déposer une annonce",BTN_SHOW_MARKET_OFFER:"Voir les annonces",LOCATION_LABEL:"Recherche d'annonces par ville :",LOCATION_HELP:"Code postal, Ville",ERROR:{GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"}},CATEGORY:{ALL:"Toutes les catégories"},SEARCH:{TITLE:"Annonces",CATEGORY:"Catégorie : ",SEARCH_HELP:"Recherche (vélo, rollers...)",BY:"par",BTN_ADD:"Nouveau",BTN_OPTIONS:"Recherche avancée",BTN_AROUND_ME:"Autour de moi",GEO_DISTANCE:"Distance maximale autour de la ville :",GEO_DISTANCE_OPTION:"{{value}} km",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",LOCATION:"Ville",LOCATION_HELP:"Code postal, Ville",RESULTS:"Résultats",RESULT_COUNT_LOCATION:"{{count}} résultat{{count>0?'s':''}}, près de {{location}}",RESULT_COUNT:"{{count}} résultat{{count>0?'s':''}}",LAST_RECORDS:"Dernières annonces",LAST_RECORD_COUNT_LOCATION:"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}",LAST_RECORD_COUNT:"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}",BTN_LAST_RECORDS:"Dernières annonces",BTN_SHOW_CATEGORIES:"Parcourir les catégories",BTN_OFFERS:"Offres",BTN_NEEDS:"Demandes",SHOW_CLOSED_RECORD:"Afficher les annonces closes ?",SHOW_OLD_RECORD:"Afficher les anciennes annonces ?",RECORD_STOCK:"Stock :"},GALLERY:{TITLE:"Diaporama",BTN_START:"Démarrer",BTN_CONTINUE:"Reprendre",BTN_PAUSE:"Pause",BTN_STOP:"Arrêter",SLIDE_DURATION:"Durée d'affichage :",SLIDE_DURATION_OPTION:"{{value}} secondes"},VIEW:{TITLE:"Annonce",BTN_SOLD_AD:"Clore l'annonce",BTN_SOLD:"Clore",BTN_REOPEN:"Réouvrir l'annonce",BTN_WRITE_OFFER:"Ecrire au vendeur",BTN_WRITE_NEED:"Ecrire au demandeur",BTN_FOLLOW:"Suivre cette annonce",BTN_STOP_FOLLOW:"Ne plus suivre cette annonce",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(frais)",RECORD_STOCK:"Stock disponible :",POPOVER_SHARE_TITLE:"Annonce {{title}}",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer cette annonce ?<br/><br/>Cette opération est irréversible.",SOLD_CONFIRMATION:"<b>Êtes-vous sûr</b> de vouloir clore cette annonce ?",REOPEN_CONFIRMATION:"<b>Êtes-vous sûr</b> de vouloir réouvrir cette annonce ?",NEW_MESSAGE_TITLE:'Au sujet de l\'annonce "{{title}}"...',MORE_LIKE_THIS:"Ceci pourrait vous intéresser :"},WALLET:{DUNITER_PUBKEY:"Clé publique de réception des paiements",DUNITER_ACCOUNT:"Réception des paiements en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La clef publique (ci-dessus) indique la destination des paiements que vous recevrez.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Aucune clé publique de compte n'a été renseignée. Vous devrez la donner aux acheteurs éventuels.<br/>Vous pouvez la saisir à tout moment, <b>en éditant votre profil</b>."},TYPE:{TITLE:"Nouvelle annonce",SELECT_TYPE:"Type d'annonce :",OFFER:"Offre, Vente",OFFER_SHORT:"Offre",NEED:"Demande, Recherche",NEED_SHORT:"Demande"},LOCAL_SALE:{LOCATION:"Numéro du stand",LOCATION_HELP:"Numéro du stand : 1, 2, ...",LOCATION_PREFIX:"Stand n°"},EDIT:{TITLE:"Edition",TITLE_NEW:"Nouvelle annonce",RECORD_TITLE:"Titre",RECORD_TITLE_HELP:"Titre : vélo, livre...",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Ville",RECORD_LOCATION_HELP:"Code postal, Ville",RECORD_PRICE:"Prix",RECORD_PRICE_HELP:"Prix (optionnel)",RECORD_CURRENCY:"Monnaie",RECORD_FEES:"Frais d'envoi",RECORD_FEES_HELP:"Frais (optionnel)",RECORD_STOCK:"Stock disponible",RECORD_STOCK_HELP:"Stock disponible"},WOT:{VIEW:{BTN_RECORDS:"Annonces",DUNITER_PUBKEY:"Clé publique de réception des paiements",DUNITER_ACCOUNT:"Réception des paiements en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La clef publique (ci-dessus) correspond au compte à utiliser pour payer cet utilisateur.",DUNITER_ACCOUNT_HELP_ASK_USER:"Cet utilisateur n'a pas communiqué sa clef publique de compte. <a ng-click=\"showNewMessageModal()\">Contactez-le</a> pour l'obtenir."},ERROR:{FAILED_STAR_PROFILE:"Erreur lors de l'envoi de votre note. Veuillez réessayer ultérieurement."}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Identifiant ou mot de passe invalide.<br/><br/>Vérifiez qu'ils correspondent bien à un compte <b>créé sur ğchange</b>.",FAILED_SAVE_RECORD:"Erreur lors de l'enregistrement de l'annonce",FAILED_UPDATE_RECORD:"Erreur lors de la mise à jour de l'annonce",LOAD_CATEGORY_FAILED:"Erreur d'initialisation des catégories",LOOKUP_RECORDS_FAILED:"Erreur lors de l'exécution de la recherche",LOAD_RECORD_FAILED:"Erreur lors du chargement de l'annonce",REMOVE_RECORD_FAILED:"Erreur de la suppression de l'annonce",SOLD_RECORD_FAILED:"Erreur lors de la fermeture de l'annonce",REOPEN_RECORD_FAILED:"Erreur lors de la réouverture de l'annonce",FAILED_SAVE_COMMENT:"Erreur lors de la sauvegarde du commentaire",FAILED_REMOVE_COMMENT:"Erreur lors de la suppression du commentaire",RECORD_NOT_EXISTS:"Annonce inexistante",RECORD_EXCEED_UPLOAD_SIZE:"Il semble que votre annonce <b>soit trop volumineuse</b> pour être acceptée par le noeud de données.<br/><br/>Vous pouvez par exemple <b>supprimer des photos</b>, puis essayer à nouveau.",GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"},INFO:{RECORD_REMOVED:"Annonce supprimée",RECORD_SOLD:"Annonce close",RECORD_REOPEN:"Annonce réouverte"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté votre annonce : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur votre annonce : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a répondu à votre commentaire sur l\'annonce : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié la réponse à votre commentaire sur l\'annonce : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur l\'annonce : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a ajouté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié l\'annonce : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a clôturé l\'annonce : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> vous demande une modération sur l\'annonce : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé une annonce à modérer : <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé votre annonce : <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a aimé votre annonce : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> suit votre annonce : <b>{{params[2]}}</b>'}}}),e.translations("nl-NL",{MENU:{MARKET:"Advertenties"},MARKET:{COMMON:{PRICE:"Prijs",BTN_BUY:"Koop",BTN_BUY_DOTS:"Koop...",BTN_NEW_AD:"Nieuwe advertentie",AROUND_ME:"In mijn omgeving"},SEARCH:{TITLE:"Markt",SEARCH_HELP:"Wat, waar: auto, Utrecht, ...",BTN_ADD:"Nieuw",BTN_OPTIONS:"Geavanceerd zoeken",BTN_AROUND_ME:"In mijn omgeving",SHOW_MORE:"Toon meer",SHOW_MORE_COUNT:"(huidige limiet op {{limit}})",LOCATION:"Locatie",LOCATION_HELP:"Plaats",LAST_RECORDS:"Nieuwste advertenties:",RESULTS:"Resultaat:",BTN_OFFERS:"Aangeboden",BTN_NEEDS:"Gezocht"},VIEW:{TITLE:"Advertentie",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"Advertentie {{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze advertentie wil wissen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe advertentie",SELECT_TYPE:"Soort advertentie:",OFFER:"Aanbod",NEED:"Vraag"},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe advertentie",RECORD_TITLE:"Titel",RECORD_TITLE_HELP:"Titel",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Beschrijving",RECORD_LOCATION:"Adres",RECORD_LOCATION_HELP:"Straat, Plaats",RECORD_PRICE:"Prijs",RECORD_PRICE_HELP:"Prijs (optioneel)",RECORD_CURRENCY:"Valuta"},ERROR:{FAILED_SAVE_RECORD:"Advertentie opslaan mislukt",FAILED_UPDATE_RECORD:"Advertentie aanpassen mislukt",LOAD_CATEGORY_FAILED:"Categorieên laden mislukt",LOOKUP_RECORDS_FAILED:"Fout tijdens laden van advertenties.",LOAD_RECORD_FAILED:"Advertentie laden mislukt",REMOVE_RECORD_FAILED:"Advertentie wissen mislukt",FAILED_SAVE_COMMENT:"Commentaar opslaan mislukt",FAILED_REMOVE_COMMENT:"Commentaar wissen mislukt",RECORD_NOT_EXISTS:"Advertentie niet gevonden"},INFO:{RECORD_REMOVED:"Advertentie succesvol verwijderd"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw advertentie: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw advertentie bewerkt: <b>{{params[2]}}</b>',
|
||
NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw commentaar op advertentie: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op advertentie: <b>{{params[2]}}</b>'}}})}]),angular.module("cesium.plugins.templates",[]).run(["$templateCache",function(e){e.put("plugins/es/templates/menu_extend.html",'\n\x3c!-- Main section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'menu-discover\'">\n <ion-item menu-close ng-if="$root.settings.expertMode" class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/network/data" ui-sref="app.es_network">\n <i class="icon ion-cloud"></i>\n <span translate>MENU.NETWORK</span>\n </ion-item>\n <a id="helptip-menu-btn-network"></a>\n\n</ng-if>\n\n\x3c!-- Toolbar section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'nav-buttons-right\'" class="hidden-xs hidden-sm">\n\n \x3c!-- messages --\x3e\n <button class="button button-clear icon ion-email" ng-if="login" active-link="gray" active-link-path-prefix="#/app/user/message" ng-click="showMessagesPopover($event)">\n <span ng-if="$root.walletData.messages.unreadCount" class="badge badge-button badge-positive">{{walletData.messages.unreadCount}}</span>\n </button>\n\n \x3c!-- notifications --\x3e\n <button class="button button-clear icon ion-android-notifications" ng-if="login" active-link="gray" active-link-path-prefix="#/app/notifications" ng-click="showNotificationsPopover($event)">\n <span ng-if="walletData.notifications.unreadCount" class="badge badge-button badge-positive">{{walletData.notifications.unreadCount}}</span>\n </button>\n</div>\n\n\x3c!-- User section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'menu-user\'" class="visible-xs visible-sm">\n\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/user/message" ng-class="{\'item-menu-disable\': !login}" ng-click="loginAndGo(\'app.user_message\')">\n <i class="icon ion-email"></i>\n <span translate>MENU.MESSAGES</span>\n <span class="badge badge-positive" ng-if="walletData.messages.unreadCount">{{walletData.messages.unreadCount}}</span>\n </a>\n\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/notifications" ng-class="{\'item-menu-disable\': !login}" ng-click="loginAndGo(\'app.view_notifications\')">\n <i class="icon ion-android-notifications"></i>\n <span translate>MENU.NOTIFICATIONS</span>\n <span class="badge badge-positive" ng-if="walletData.notifications.unreadCount">{{walletData.notifications.unreadCount}}</span>\n </a>\n\n</div>\n'),e.put("plugins/market/templates/menu_extend.html",'\n\x3c!-- Main section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'menu-main\'">\n\n \x3c!-- view market --\x3e\n <ion-item menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/market" ui-sref="app.market_lookup">\n <i class="icon ion-speakerphone"></i>\n <span translate>MENU.MARKET</span>\n </ion-item>\n\n \x3c!-- view pages --\x3e\n <ion-item menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/page" ui-sref="app.registry_lookup">\n <i class="icon ion-social-buffer"></i>\n <span translate>MENU.REGISTRY</span>\n </ion-item>\n\n \x3c!-- view market gallery\n <ion-item menu-close class="item item-icon-left hidden-xs hidden-sm"\n active-link="active"\n active-link-path-prefix="#/app/gallery/market"\n ui-sref="app.market_gallery">\n <i class="icon ion-images"></i>\n <span translate>MARKET.GALLERY.TITLE</span>\n </ion-item>--\x3e\n\n</ng-if>\n\n<div ng-if=":state:enable && extensionPoint === \'menu-user\'">\n \x3c!-- wallet records --\x3e\n <a menu-close class="item item-border item-icon-left" active-link="active" active-link-path-prefix="#/app/records/wallet" ng-click="loginAndGo(\'app.market_wallet_records\')" ng-class="{\'item-menu-disable\': !login}">\n <i class="icon ion-person" style="font-size: 19px; left: 13px"></i>\n <i class="icon-secondary ion-speakerphone" style="font-size: 16px; left: 32px; top: -6px"></i>\n <span translate>MENU.MY_RECORDS</span>\n </a>\n</div>\n'),e.put("plugins/es/templates/common/dropdown_locations.html",'\n \x3c!-- dropdown --\x3e\n <ul class="item no-padding list dropdown-list" ng-if="locations" scroll="true">\n\n <div ng-if="!locations.length" class="item padding assertive">\n <span translate>COMMON.SEARCH_NO_RESULT</span>\n </div>\n\n <a ng-repeat="res in locations" class="item item-border-large item-text-wrap ink done in {{res.selected && \'active\' || \'\'}}" ng-class="::{\'item-divider\': !res.address, \'item-icon-left\': res.address}" ng-click="::res.address ? selectLocation(res) : false">\n\n \x3c!-- if divider --\x3e\n <h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4>\n\n \x3c!-- if divider --\x3e\n <ng-if ng-if="::res.address">\n\n <i class="icon ion-location"></i>\n\n <h3 ng-if="res.address.road">\n {{::res.address.road}}\n </h3>\n <h3>\n <span ng-if="res.address.postcode">{{::res.address.postcode}}</span>\n {{::res.address.city||res.address.village}}\n <span class="gray">| {{::res.address.country}}</span>\n </h3>\n <h5 class="gray">\n {{\'LOCATION.MODAL.POSITION\'|translate:res }}\n </h5>\n </ng-if>\n\n </a>\n\n </ul>\n'),e.put("plugins/es/templates/common/edit_pictures.html",'<div class="gallery" ng-controller="ESPicturesEditCtrl as ctrl">\n\n \x3c!-- Picture list --\x3e\n <div ng-repeat="picture in pictures" class="item card card-gallery stable-bg" ng-class="{\'in done\': picture.isnew}">\n <div>\n <h2 ng-if="picture.title">{{picture.title}}</h2>\n <img ng-src="{{picture.src}}">\n </div>\n <div class="item done in tabs tabs-secondary tabs-icon-left">\n <a class="tab-item stable-bg assertive" ng-click="removePicture($index)" title="{{\'COMMON.BTN_PICTURE_DELETE\' | translate}}"><i class="icon ion-trash-a"></i>{{\'COMMON.BTN_PICTURE_DELETE\'|translate}}</a>\n <a class="tab-item stable-bg dark" ng-click="rotatePicture($index)" title="{{\'COMMON.BTN_PICTURE_ROTATE\' | translate}}"><i class="icon ion-forward"></i>{{\'COMMON.BTN_PICTURE_ROTATE\'|translate}}</a>\n <a class="tab-item stable-bg" ng-click="favoritePicture($index)" ng-class="{\'gray\': $index !== 0, \'positive\': $index === 0}" title="{{\'COMMON.BTN_PICTURE_FAVORISE\' | translate}}"><i class="icon ion-star"></i>{{\'COMMON.BTN_PICTURE_FAVORISE\'|translate}}</a>\n </div>\n </div>\n\n \x3c!-- Add picture button --\x3e\n <div class="item card card-gallery card-gallery-new text-center padding ink" ng-click="selectNewPicture()">\n <i class="ion-image stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="font-size:80px; position:absolute; top:25px; right: 5px"></b>\n <p translate>COMMON.BTN_ADD_PICTURE</p>\n </div>\n\n <input type="file" id="pictureFile" accept="image/*" onchange="angular.element(this).scope().fileChanged(event)" style="visibility:hidden; position:absolute">\n</div>\n\n'),e.put("plugins/es/templates/common/edit_position.html",'<div class="item item-divider" translate>LOCATION.LOCATION_DIVIDER</div>\n\n\x3c!-- street --\x3e\n<ion-item class="item-input item-floating-label item-button-right">\n <span class="input-label">{{\'LOCATION.ADDRESS\' | translate}}</span>\n <textarea placeholder="{{\'LOCATION.ADDRESS_HELP\' | translate}}" ng-model="formData.address" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n</ion-item>\n\n\x3c!-- city --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.geoPoint.$invalid}">\n <span class="input-label" translate>LOCATION.CITY</span>\n <input type="text" placeholder="{{\'LOCATION.CITY_HELP\'|translate}}" name="city" ng-model="formData.city" ng-model-options="{ updateOn: \'blur\' }" required-if="formData.address" ng-change="onCityChanged()">\n</div>\n<input type="hidden" name="geoPoint" ng-model="formData.geoPoint" required-if="formPosition.enable" geo-point>\n<div class="form-errors" ng-show="form.$submitted && form.city.$error" ng-messages="form.city.$error">\n <div class="form-error" ng-message="required">\n <span translate="LOCATION.ERROR.CITY_REQUIRED_IF_STREET"></span>\n </div>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.geoPoint.$error" ng-messages="form.geoPoint.$error">\n <div class="form-error" ng-message="required">\n <span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span>\n <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span>\n </div>\n <div class="form-error" ng-message="geoPoint">\n <span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span>\n <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span>\n </div>\n</div>\n\n\n\x3c!-- Position (lat/lon) --\x3e\n<div class="item row item-text-wrap no-padding">\n\n <div class="col no-padding">\n\n \x3c!-- appear on map ? --\x3e\n <ion-checkbox ng-if="options.position.showCheckbox" ng-model="formPosition.enable" ng-change="onUseGeopointChanged()" class="item item-border-large done in">\n <div class="item-content">\n <span translate>LOCATION.USE_GEO_POINT</span>\n <h4 class="gray" ng-if="formPosition.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n {{\'LOCATION.LOADING_LOCATION\'|translate}}\n </h4>\n </div>\n </ion-checkbox>\n </div>\n\n <div class="col col-10 no-padding" style="min-width: 60px">\n <div class="row text-center">\n\n <a class="button button-stable button-small-padding" title="{{\'LOCATION.BTN_GEOLOC_ADDRESS\'|translate}}" ng-disabled="!formPosition.enable" ng-click="openSearchLocationModal()">\n <i class="icon ion-home" style="left: 15px"></i>\n <b class="icon-secondary ion-search" style="top: -9px; left:32px; font-size: 18px"></b>\n </a>\n\n </div>\n </div>\n</div>\n\n\n<cs-extension-point name="after-position"></cs-extension-point>\n'),e.put("plugins/es/templates/common/edit_socials.html",'\n <div class="item item-divider" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</div>\n\n <ion-item class="item-remove-animate item-icon-left" type="no-padding item-text-wrap" ng-if="formData.socials && formData.socials.length" ng-repeat="social in formData.socials | filter:filterFn track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">\n {{social.type}}\n <i class="ion-locked" ng-if="social.recipient"></i>\n </p>\n <h2>\n <a href="{{social.url}}" ng-if="social.type != \'email\' && social.type != \'phone\'" target="_blank">{{social.url}}</a>\n <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a>\n <a href="tel:{{social.url}}" ng-if="social.type == \'phone\'">{{social.url}}</a>\n <a class="gray hidden-device" ng-if="!social.recipient" ng-click="formData.socials.splice($index, 1); dirty = true;">\n <b class="ion ion-trash-a"></b> \n </a>\n <a class="gray hidden-device" ng-if="!social.recipient" ng-click="editSocialNetwork($index)">\n <b class="ion ion-edit"></b> \n </a>\n </h2>\n <ion-option-button class="button-assertive" ng-if="!social.recipient" ng-click="formData.socials.splice($index, 1); dirty = true;">\n {{\'COMMON.BTN_DELETE\'|translate}}\n </ion-option-button>\n <ion-option-button class="button-info" ng-if="!social.recipient" ng-click="editSocialNetwork($index)">\n {{\'COMMON.BTN_EDIT\'|translate}}\n </ion-option-button>\n </ion-item>\n\n <div class="item item-complex item-input-inset">\n <label class="item-input-wrapper">\n <input type="text" style="width:100%" placeholder="{{\'PROFILE.SOCIAL_HELP\'|translate}}" id="socialUrl" on-return="addSocialNetwork();" ng-model="socialData.url">\n </label>\n <button class="button button-small hidden-xs" type="button" ng-click="addSocialNetwork()">\n {{\'COMMON.BTN_ADD\'|translate}}\n </button>\n <button class="button button-small button-icon icon ion-android-add visible-xs" type="button" ng-click="addSocialNetwork()">\n </button>\n </div>\n'),e.put("plugins/es/templates/common/item_comment.html",'<ng-init ng-init="level = level + 1; hash=(comment.id|formatHash)">\n <a name="{{::hash}}"></a>\n\n <ion-item id="comment-{{::comment.id|formatHash}}" class="card card-comment card-avatar stable-900-bg item-text-wrap no-padding" ng-class="{\'in done\': comment.isnew, \'positive-100-bg\': (hash == anchor)}">\n\n \x3c!-- Parent comment --\x3e\n <div class="card-header padding-left" ng-if="comment.parent && !hideParent">\n <h5 class="gray underline">\n <ng-if ng-if="!comment.parent.issuer">\n {{\'COMMENTS.REPLY_TO_DELETED_COMMENT\'|translate}}\n </ng-if>\n <ng-if ng-if="comment.parent.issuer">\n <a ng-click="toggleExpandedParent(comment, $index)">\n {{\'COMMENTS.REPLY_TO_LINK\'|translate}}\n <ng-if ng-if="::comment.parent.name||comment.parent.uid">\n {{::comment.parent.name||comment.parent.uid}}\n </ng-if>\n <ng-if ng-if="::!comment.parent.name && !comment.parent.uid">\n <i class="ion-key"></i>\n {{::comment.parent.issuer|formatPubkey}}\n </ng-if>\n </a>\n <i ng-class="::{\'ion-arrow-down-b\': !comment.expandedParent[$index], \'ion-arrow-up-b\': comment.expandedParent[$index]}"></i>\n </ng-if>\n </h5>\n <div class="padding-left" ng-if="comment.expandedParent[$index]">\n <div class="card card-avatar card-avatar-small stable-bg item-text-wrap no-padding in done">\n <ng-include ng-init="comment = comment.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n </div>\n </div>\n </div>\n\n <ng-include src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include>\n\n <div class="card-footer gray">\n <small class="underline">\n <a ng-click="share($event, comment, $index)" title="{{comment.creationTime | formatDate}}{{ (comment.creationTime != comment.time) ? (\' - \' + (\'COMMENTS.MODIFIED_ON\'|translate:comment)) : \'\'}}">{{comment.creationTime | formatFromNow}}\n <span ng-if="comment.time && comment.creationTime != comment.time" translate>COMMENTS.MODIFIED_PARENTHESIS</span>\n </a>\n\n <ng-if ng-if="comment.replyCount">\n | <a class="dark" ng-click="toggleExpandedReplies(comment, $index)">{{\'COMMENTS.REPLY_COUNT\'|translate:comment}}</a>\n <i ng-class="{\'ion-arrow-down-b\': !comment.showReplies, \'ion-arrow-up-b\': comment.showReplies}"></i>\n </ng-if>\n </small>\n\n <div class="pull-right">\n <a class="ion-android-share-alt" ng-click="share($event, comment)">\n </a>\n <a class="ion-edit" ng-if="isUserPubkey(comment.issuer)" ng-click="edit(comment)">\n </a>\n <a class="ion-trash-a" ng-if="isUserPubkey(comment.issuer)" ng-click="remove(comment, $index)">\n </a>\n <a class="ion-reply" ng-click="reply(comment)">\n {{::\'COMMENTS.REPLY\'|translate}}\n </a>\n </div>\n </div>\n </ion-item>\n\n \x3c!-- replies --\x3e\n <div ng-if="comment.expandedReplies[$index]" class="padding-left card-avatar-small expanded" ng-init="hideParent=true">\n <ng-include ng-repeat="comment in comment.replies track by comment.id" src="\'plugins/es/templates/common/item_comment.html\'">\n </ng-include>\n </div>\n\n</ng-init>\n'),e.put("plugins/es/templates/common/item_comment_content.html",'\n <div class="item item-avatar done in">\n <span class="avatar avatar-member" ng-if="::!comment.avatar"></span>\n <span class="avatar" ng-if="::comment.avatar" style="background-image: url({{::comment.avatar.src}})"></span>\n\n <a class="pull-left" ui-sref="app.wot_identity({pubkey:comment.issuer, uid: comment.uid})">\n <span class="positive" ng-if="::comment.name||comment.uid">\n {{::comment.name||comment.uid}}\n </span>\n <span ng-if="::!comment.name && !comment.uid" class="gray">\n <i class="icon ion-key gray"></i>\n {{::comment.issuer|formatPubkey}}\n </span>\n </a> \n <span trust-as-html="comment.html"></span>\n </div>\n'),e.put("plugins/es/templates/common/item_location_search.html",' \x3c!-- search text --\x3e\n <div class="item no-padding">\n <div class="item-input item-button-right light-bg">\n <i class="icon ion-location placeholder-icon"></i>\n <input type="text" autocomplete="postal-code" placeholder="{{(options.location.help||\'LOCATION.SEARCH_HELP\')|translate}}" ng-model-options="{ debounce: 350 }" ng-model="search.location" ng-keydown="onKeydown($event)" ng-change="onLocationChanged()" ng-blur="hideDropdown()">\n\n <a class="button button-clear button-small button-stable gray ink no-padding" tabindex="-1" ng-click="showDistancePopover($event)">\n <span>{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: search.geoDistance} }}</span>\n <b class="ion-arrow-down-b" style="font-size: 12pt"></b>\n </a>\n\n </div>\n </div>\n\n \x3c!-- dropdown --\x3e\n <ng-include src="\'plugins/es/templates/common/dropdown_locations.html\'"></ng-include>\n\n'),e.put("plugins/es/templates/common/modal_category.html",'<ion-modal-view class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title">{{ (ctrl.title || \'COMMON.CATEGORIES\') | translate}}</h1>\n </ion-header-bar>\n\n <ion-content class="categoryModal">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list">\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" placeholder="{{\'COMMON.CATEGORY_SEARCH_HELP\'|translate}}" ng-model="ctrl.searchText" ng-model-options="{ debounce: 350 }" ng-change="ctrl.doSearch()">\n </label>\n\n\n <div ng-repeat="cat in categories" class="item item-category item-text-wrap" ng-class="{\'item-divider\': !cat.parent}" ng-click="cat.parent ? closeModal(cat) : false">\n <h2 ng-bind-html="cat.name"></h2>\n </div>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/modal_edit_avatar.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs visible-sm" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n\n <h1 class="title" translate>PROFILE.MODAL_AVATAR.TITLE</h1>\n\n <button class="button button-clear icon-right visible-xs" ng-click="doCrop()" ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2">\n <span translate>COMMON.BTN_NEXT</span>\n <i class="icon ion-ios-arrow-right"></i>\n </button>\n <button class="button button-clear icon-right visible-xs" ng-click="closeModal(formData.result)" ng-if="formData.imageCropStep == 3">\n <i class="icon ion-android-done"></i>\n </button>\n </ion-header-bar>\n\n <ion-content class="modal-avatar padding">\n\n\n <div ng-show="formData.imageCropStep == 1">\n <p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p>\n\n \x3c!-- Add picture button --\x3e\n <div class="item card text-center padding ink" ng-click="openFileSelector()">\n <i class="ion-image stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px"></b>\n <p translate>PROFILE.MODAL_AVATAR.BTN_SELECT_FILE</p>\n </div>\n\n <input type="file" name="fileInput" accept="image/*" id="fileInput" onchange="angular.element(this).scope().fileChanged(event)" style="visibility:hidden; position:absolute">\n </div>\n\n <div ng-show="formData.imageCropStep == 2">\n <p translate>PROFILE.MODAL_AVATAR.RESIZE_HELP</p>\n\n \x3c!-- <image-crop\n data-height="200" //shape\'s height\n data-width="150" //shape\'s width\n data-shape="square" //the shape.. square or circle\n data-step="imageCropStep"//scope variable that will contain the current step of the crop (1. Waiting for source image; 2. Image loaded, waiting for crop; 3. Crop done)\n src="imgSrc" //scope variable that will be the source image for the crop (may be a Blob or base64 string)\n data-result-blob="result" //scope variable that will contain the Blob information\n data-result="resultDataUrl" //scope variable that will contain the image\'s base64 string representation\n crop="initCrop" //scope variable that must be set to true when the image is ready to be cropped\n padding="250" //space, in pixels, rounding the shape\n max-size="1024" //max of the image, in pixels\n ></image-crop> --\x3e\n\n <div class="item card text-center padding ink">\n <image-crop data-height="100" data-width="100" data-shape="circle" data-step="formData.imageCropStep" src="formData.imgSrc" data-result="formData.result" data-result-blob="formData.resultBlob" crop="formData.initCrop" padding="150" max-size="1024">\n </image-crop>\n </div>\n </div>\n\n <div ng-show="formData.imageCropStep == 3">\n <p translate>PROFILE.MODAL_AVATAR.RESULT_HELP</p>\n\n <div class="item card padding hero" style="height: 110px">\n <div class="content">\n <img class="avatar" ng-src="{{formData.result}}" style="height: 88px; width: 88px">\n </div>\n </div>\n </div>\n\n \x3c!-- buttons bar --\x3e\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doCrop()" translate ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2">\n COMMON.BTN_NEXT\n </button>\n <button class="button button-positive ink" ng-click="closeModal(formData.result)" translate ng-if="formData.imageCropStep == 3">\n COMMON.BTN_CONTINUE\n </button>\n </div>\n\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/modal_location.html",'<ion-modal-view class="modal-full-height modal-search-location">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>LOCATION.MODAL.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n\n \x3c!-- search text --\x3e\n <div class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearch()">\n </div>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px">\n <div class="pull-left" ng-if="!search.loading && search.results">\n <h4 translate>COMMON.RESULTS_LIST</h4>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <button class="button button-small button-stable ink" ng-click="doSearch()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n </div>\n\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div ng-if="!search.loading && search.results && (!search.results.length || !search.results[0].address)" class="assertive padding">\n <span translate>COMMON.SEARCH_NO_RESULT</span>\n </div>\n\n <ion-list ng-if="!search.loading" class="padding-top {{::motion.ionListClass}}">\n <div ng-repeat="res in search.results" class="item item-border-large item-text-wrap ink" ng-class="::{\'item-divider\': !res.address, \'item-icon-left item-icon-right\': res.address}" ng-click="res.address ? closeModal(res) : false">\n\n \x3c!-- if divider --\x3e\n <h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4>\n\n \x3c!-- if divider --\x3e\n <ng-if ng-if="::res.address">\n\n <i class="icon ion-location"></i>\n\n <h2 ng-if="res.address.road">\n {{::res.address.road}}\n </h2>\n <h3>\n <span ng-if="res.address.postcode">{{::res.address.postcode}}</span>\n {{::res.address.city||res.address.village}}\n <span class="gray">| {{::res.address.country}}</span>\n </h3>\n <h5 class="gray">\n {{\'LOCATION.MODAL.POSITION\'|translate:res }}\n </h5>\n\n <i class="icon ion-ios-arrow-right"></i>\n </ng-if>\n\n </div>\n </ion-list>\n </ion-content>\n\n <ion-footer-bar class="stable-bg padding-left padding-right block" ng-if="license">\n <div class="pull-right copyright">\n <span class="dark">© </span>\n <a class="positive" href="{{license.url}}" target="_blank">{{license.name}}</a>\n </div>\n </ion-footer-bar>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/popover_distances.html",'<ion-popover-view class="popover-light popover-distance" style="height: {{33 + 4 * 53}}px">\n <ion-header-bar class="bar bar-header stable-bg">\n <div class="title" translate>COMMON.GEO_DISTANCE_SEARCH</div>\n </ion-header-bar>\n <ion-content scroll="true">\n <a class="item ink" ng-repeat="value in geoDistances" ng-click="selectDistance(value)">\n <b class="ion-checkmark" ng-if="search.geoDistance==value"></b>\n <b ng-if="search.geoDistance==value">{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: value} }}</b>\n <span ng-if="search.geoDistance!=value">{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: value} }}</span>\n </a>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/common/popover_profile_extend.html",' \x3c!-- profile --\x3e\n <button ng-if="enable" class="button button-positive button-small ink" ng-click="showEditUserProfile()">\n {{\'PROFILE.BTN_EDIT\' | translate}}\n </button>\n\n'),e.put("plugins/es/templates/common/popover_star.html",'<ion-popover-view class="popover-star" style="height: {{likeData.stars.wasHit ? 90 : 50}}px">\n <ion-content scroll="false" class="padding-left padding-right">\n <h1>\n <a ng-repeat="level in [1,2,3,4,5]" ng-click="addStar(level)">\n <b class="dark ion-android-star" ng-if="level <= likeData.stars.level"></b>\n <b class="dark ion-android-star-half" ng-if="level > likeData.stars.level && level - 0.5 <= likeData.stars.level"></b>\n <b class="dark ion-android-star-outline" ng-if="level > likeData.stars.level && level - 0.5 > likeData.stars.level"></b>\n </a>\n </h1>\n <a ng-if="likeData.stars.wasHit" ng-click="removeStar(event)" translate>WOT.VIEW.BTN_STARS_REMOVE</a>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/common/popup_report_abuse.html",'<form name="abuseForm" ng-submit="">\n <div class="list" ng-init="setAbuseForm(abuseForm)">\n\n \x3c!-- reason --\x3e\n <label class="item item-input" ng-class="{\'item-input-error\': abuseForm.$submitted && abuseForm.comment.$invalid}">\n <textarea class="padding" style="background-color: transparent" name="comment" type="text" placeholder="{{\'COMMON.REPORT_ABUSE.REASON_HELP\' | translate}}" rows="3" ng-model="abuseData.comment" ng-minlength="8" required></textarea>\n </label>\n <div class="form-errors" ng-if="abuseForm.$submitted && abuseForm.comment.$error" ng-messages="abuseForm.comment.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n <div class="item item-toggle item-text-wrap dark">\n <div class="input-label" translate>COMMON.REPORT_ABUSE.ASK_DELETE</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="abuseData.delete">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n</form>\n\n\n'),e.put("plugins/es/templates/common/view_comments.html",'\n<form class="comments" ng-controller="ESCommentsCtrl" ng-submit="save()">\n\n <div class="item item-divider">\n <i class="icon ion-chatboxes"></i>\n <span translate>COMMENTS.DIVIDER</span>\n <span class="gray" ng-if="comments.total">({{comments.total}})</span>\n </div>\n\n <span class="item item-more-comments" ng-if="comments.hasMore">\n <small><a ng-click="showMore()" translate>COMMENTS.SHOW_MORE_COMMENTS</a></small>\n </span>\n\n <div class="padding-right">\n <ng-repeat ng-repeat="comment in comments.result track by comment.id" ng-include="\'plugins/es/templates/common/item_comment.html\'">\n </ng-repeat>\n </div>\n\n <div class="hidden-xs hidden-sm padding-right">\n <div class="card card-comment item item-input item-button-right">\n\n \x3c!-- reply to comment--\x3e\n <ng-if ng-if="formData.parent">\n <div class="padding card-header text-right pull-left" translate>COMMENTS.REPLY_TO</div><br>\n <div class="padding-left">\n <div class="card card-avatar card-avatar-small stable-900-bg item-text-wrap no-padding in done">\n <ng-include ng-if="formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n <div class="item dark done in gray" ng-if="!formData.parent.message">\n {{::\'COMMENTS.DELETED_COMMENT\'|translate}}\n </div>\n <div class="card-footer text-right gray">\n <div class="pull-right">\n <a class="ion-close" ng-click="removeParentLink()">\n {{::\'COMMON.BTN_CANCEL\'|translate}}\n </a>\n </div>\n </div>\n </div>\n </div>\n </ng-if>\n <textarea class="padding" style="background-color: transparent" id="comment-form-textarea" rows="3" placeholder="{{formData.replyTo ? \'COMMENTS.COMMENT_HELP_REPLY_TO\' : \'COMMENTS.COMMENT_HELP\'|translate}}" ng-model="formData.message" ng-keypress="onKeypress($event)">\n </textarea>\n <div class="card-footer text-right">\n <button type="button" class="button button-small button-small-padding" ng-class="{\'button-positive\': formData.message.length}" ng-if="!formData.id" ng-click="save()" translate>\n COMMON.BTN_SEND\n </button>\n \x3c!-- Edit buttons --\x3e\n <ng-if ng-if="formData.id">\n <button type="button" class="button button-small button-small-padding" ng-click="cancel()" translate>\n COMMON.BTN_CANCEL\n </button>\n <button type="button" class="button button-small button-small-padding button-positive" ng-click="save()" translate>\n COMMON.BTN_SAVE\n </button>\n </ng-if>\n </div>\n </div>\n </div>\n\n <div class="visible-xs visible-sm" style="margin-bottom">\n <div class="block">\n \x3c!-- reply to comment--\x3e\n <div class="item item-input-inset done in" ng-if="formData.parent">\n <div class="padding text-right pull-left" translate>COMMENTS.REPLY_TO</div><br>\n <div class="padding-left expanded">\n <div class="card card-comment stable-900-bg item-text-wrap no-padding in done">\n <ng-include ng-if="::formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n <span ng-if="::!formData.parent.message" translate>\n COMMENTS.DELETED_COMMENT\n </span>\n <div class="card-footer text-right gray">\n <div class="pull-right">\n <a class="ion-close" ng-click="removeParentLink()">\n {{::\'COMMON.BTN_CANCEL\'|translate}}\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="item item-input-inset">\n <div class="item-input-wrapper">\n <input type="text" id="comment-form-input" style="width: 100%" placeholder="{{\'COMMENTS.COMMENT_HELP\'|translate}}" on-return="save();" ng-model="formData.message">\n <button type="submit" class="button button-small button-small-padding button-icon button-dark button-icon gray">\n <i class="icon ion-android-send"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n</form>\n'),e.put("plugins/es/templates/common/view_likes.html",'\n<div class="likes">\n \x3c!-- views --\x3e\n <span class="gray" ng-if="likeData.views" title="{{\'COMMON.VIEWS_TEXT\'|translate: likeData.views }}">\n {{likeData.views.total || 0}}\n <i class="icon ion-eye"></i>\n <ng-if ng-if="likeData.likes||likeData.dislikes"> | </ng-if>\n </span>\n\n \x3c!-- likes / dislikes --\x3e\n <ng-if ng-if="likeData.likes||likeData.dislikes">\n <span ng-class="{\'gray\': !likeData.likes.wasHit, \'positive\': likeData.likes.wasHit}">\n <a title="{{\'COMMON.LIKES_TEXT\'|translate: likeData.likes }}" ng-click="!canEdit && toggleLike($event, {kind: \'like\'})">\n {{likeData.likes.total || 0}}\n <i class="icon ion-heart"></i>\n </a>\n </span>\n <span ng-if="likeData.dislikes" ng-class="{\'gray\': !likeData.dislikes.wasHit, \'positive\': likeData.dislikes.wasHit}">\n <a title="{{\'COMMON.DISLIKES_TEXT\'|translate: likeData.dislikes }}" ng-click="!canEdit && toggleLike($event, {kind: \'dislike\'})">\n {{likeData.dislikes.total || 0}}\n <i class="icon ion-heart-broken"></i>\n </a>\n </span>\n </ng-if>\n\n \x3c!-- follow--\x3e\n <span class="gray" ng-if="likeData.follows"> | </span>\n <a ng-if="likeData.follows" ng-click="!canEdit && toggleLike($event, {kind: \'follow\'})">\n <span ng-class="{\'gray\': !likeData.follows.wasHit, \'positive\': likeData.follows.wasHit}" title="{{\'COMMON.FOLLOWS_TEXT\'|translate: follows }}">\n {{likeData.follows.total || 0}}\n <i class="icon ion-android-people"></i> \n </span>\n <span ng-if="!canEdit" class="hidden-xs" ng-class="{\'assertive\': likeData.follows.wasHit, \'positive\': !likeData.follows.wasHit}">\n ({{likeData.follows.wasHit ? \'COMMON.BTN_STOP_FOLLOW\': \'COMMON.BTN_FOLLOW\' | translate }})\n </span>\n </a>\n <span class="gray" ng-if="likeData.abuses.total"> | </span>\n <a ng-if="likeData.abuses.total && !likeData.abuses.wasHit" ng-click="!canEdit && reportAbuse($event)" title="{{\'COMMON.ABUSES_TEXT\'|translate: likeData.abuses }}">\n {{likeData.abuses.total || 0}}\n <i class="icon ion-android-warning"></i>\n </a>\n <span ng-if="likeData.abuses.total && likeData.abuses.wasHit" class="assertive" title="{{\'COMMON.ABUSES_TEXT\'|translate: likeData.abuses }}">\n {{likeData.abuses.total || 0}}\n <i class="icon ion-android-warning"></i>\n </span>\n</div>\n'),e.put("plugins/es/templates/common/view_pictures.html",'<div ng-if="pictures && pictures.length>0" class="item gallery done in">\n <div ng-repeat="picture in pictures" class="item card card-gallery">\n <h2 ng-if="::picture.title">{{::picture.title}}</h2>\n <img ng-src="{{::picture.src}}">\n </div>\n</div>\n'),e.put("plugins/es/templates/document/item_document.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink item-text-wrap {{::ionItemClass}} no-padding-top no-padding-bottom" ng-click="selectDocument($event, doc)">\n\n <i class="icon ion-document stable" ng-if=":rebind:!doc.avatar"></i>\n <i class="avatar" ng-if=":rebind:doc.avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n\n <div class="col">\n <h3>\n <a ui-sref="app.wot_identity({pubkey: doc.pubkey, uid: doc.name})">\n <span class="positive" ng-if=":rebind:doc.name">\n <i class="ion-person"></i> {{:rebind:doc.name}}\n </span>\n </a>\n </h3>\n </div>\n\n <div class="col">\n <h3 class="dark">\n <i class="ion-locked" ng-if=":rebind:doc.nonce"></i>\n {{:rebind:doc.time|formatDate}}</h3>\n <h4 class="gray">{{:rebind:\'DOCUMENT.HASH\'|translate}} {{:rebind:doc.hash|formatHash}}</h4>\n </div>\n\n <div class="col col-50">\n <h4 class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.TYPE.\' + (doc.index + \'_\' + doc.type | uppercase) | translate}}\n </h4>\n <h4 ng-if="doc.type!=\'profile\'">\n {{:rebind:doc.title||doc.message|truncText: 150}}\n </h4>\n </div>\n\n\n\n \x3c!--<div class="col">--\x3e\n \x3c!--<a--\x3e\n \x3c!--ng-if=":rebind:login && doc.pubkey==walletData.pubkey"--\x3e\n \x3c!--ng-click="remove($event, $index)"--\x3e\n \x3c!--class="gray pull-right"--\x3e\n \x3c!--title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">--\x3e\n \x3c!--<i class="ion-trash-a"></i>--\x3e\n \x3c!--</a>--\x3e\n \x3c!--<h3 ng-if=":rebind:doc.recipient">--\x3e\n \x3c!--<a ui-sref="app.wot_identity({pubkey: doc.recipient.pubkey, uid: doc.recipient.name})">--\x3e\n \x3c!--<span class="gray">--\x3e\n \x3c!--<i class="ion-key"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}}--\x3e\n \x3c!--</span>--\x3e\n \x3c!--<span class="positive" ng-if=":rebind:doc.recipient.name">--\x3e\n \x3c!--<i class="ion-person"></i> {{:rebind:doc.recipient.name}}--\x3e\n \x3c!--</span>--\x3e\n \x3c!--</a>--\x3e\n \x3c!--</h3>--\x3e\n \x3c!--<h4 class="gray" ng-if=":rebind:doc.read_signature">--\x3e\n \x3c!--<i class="ion-checkmark"></i>--\x3e\n \x3c!--<span translate>DOCUMENT.LOOKUP.READ</span>--\x3e\n \x3c!--</h4>--\x3e\n\n \x3c!--</div>--\x3e\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/item_document_comment.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-ios-chatbubble-outline stable"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4>\n <i class="ion-ios-chatbubble-outline dark"></i>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person" ng-show=":rebind:!compactMode"></i>\n {{:rebind:doc.name}}:\n </span>\n <span class="dark">\n <i class="ion-quote" ng-if=":rebind:!compactMode"></i>\n {{:rebind:doc.message|truncText:50}}\n </span>\n </h4>\n <h4 class="gray"> <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}</h4>\n </div>\n\n <div class="col">\n <h3>\n <a ui-sref="app.wot_identity({pubkey: doc.pubkey, uid: doc.name})">\n\n </a>\n </h3>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/item_document_profile.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url({{:rebind:doc.avatar.src}})"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-person stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 ng-if=":rebind:doc.title">\n <i class="ion-person gray"></i>\n <span class="dark">\n {{:rebind:doc.title}}\n </span>\n <span class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.HAS_REGISTERED\'|translate}}\n </span>\n </h4>\n <h4>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray">\n <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </span>\n </h4>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/items_documents.html",'\n<div class="item row row-header done in hidden-xs hidden-sm">\n\n <a class="no-padding dark col col-header" ng-if=":rebind:expertMode" ng-click="toggleSort(\'issuer\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'issuer\'"></cs-sort-icon>\n {{\'DOCUMENT.LOOKUP.HEADER_ISSUER\' | translate}}\n </a>\n <a class="no-padding dark col col-header" ng-if=":rebind:expertMode" ng-click="toggleSort(\'time\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'time\'"></cs-sort-icon>\n {{\'DOCUMENT.LOOKUP.HEADER_TIME\' | translate}}\n </a>\n <div class="no-padding dark col col-50 col-header" ng-if=":rebind:expertMode">\n <span class="gray">{{\'DOCUMENT.LOOKUP.DOCUMENT_TYPE\' | translate}} /</span> {{\'DOCUMENT.LOOKUP.DOCUMENT_TITLE\' | translate}}\n </div>\n</div>\n\n<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n\x3c!-- for each doc --\x3e\n<ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-switch on="doc.type">\n <div ng-switch-when="comment">\n <ng-include src="::\'plugins/es/templates/document/item_document_comment.html\'"></ng-include>\n </div>\n <div ng-switch-when="profile">\n <ng-include src="::\'plugins/es/templates/document/item_document_profile.html\'"></ng-include>\n </div>\n <div ng-switch-default>\n <ng-include src="::\'plugins/es/templates/document/item_document.html\'"></ng-include>\n </div>\n</ng-repeat>\n'),e.put("plugins/es/templates/document/lookup.html",'<ion-view>\n <ion-nav-title>\n <span translate>DOCUMENT.LOOKUP.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ng-include src="\'plugins/es/templates/document/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/document/lookup_form.html",'<div class="lookupForm">\n\n\n <div class="item no-padding">\n\n \x3c!--<div class="button button-small button-text button-stable button-icon-event padding no-padding-right ink"\n ng-repeat="filter in search.filters" ng-if="filter">\n <span ng-bind-html="\'DOCUMENT.LOOKUP.TX_SEARCH_FILTER.\'+filter.type|translate:filter"></span>\n <i class="icon ion-close" ng-click="itemRemove($index)"></i>\n\n </div>--\x3e\n\n <label class="item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()">\n <input type="text" class="hidden-xs hidden-sm" id="{{searchTextId}}" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="{{helptipPrefix}}-search-text"></a>\n </div>\n\n </label>\n </div>\n\n\n <div class="padding-top padding-xs" style="display: block; height: 60px">\n <div class="pull-left">\n <h4 ng-if="search.last" translate>\n DOCUMENT.LOOKUP.LAST_DOCUMENTS\n </h4>\n <h4 ng-if="!search.last">\n {{\'COMMON.RESULTS_LIST\'|translate}}\n </h4>\n <h5 class="dark" ng-if="!search.loading && search.total">\n <span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span>\n <small class="gray" ng-if=":rebind:search.took && expertMode">\n - {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}\n </small>\n <small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">\n - <a ng-click="toggleShowQuery()" ng-if="!showQuery">\n <span translate>DOCUMENT.LOOKUP.SHOW_QUERY</span>\n <i class="icon ion-arrow-down-b gray"></i>\n </a>\n <a ng-click="toggleShowQuery()" ng-if="showQuery">\n <span translate>DOCUMENT.LOOKUP.HIDE_QUERY</span>\n <i class="icon ion-arrow-up-b gray"></i>\n </a>\n </small>\n </h5>\n <h5 class="gray" ng-if="search.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>COMMON.SEARCHING</span>\n <br>\n </h5>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink" ng-if="login" ng-click="showActionsPopover($event)">\n {{\'DOCUMENT.LOOKUP.BTN_ACTIONS\' | translate}}\n <i class="icon ion-arrow-down-b"></i>\n </a>\n \n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate:search}}\n </button>\n </div>\n </div>\n\n <div class="item no-border no-padding" ng-if=":rebind:search.filters && search.filters.length && expertMode">\n <small class="no-padding no-margin" ng-if="showQuery">\n <span class="gray text-wrap dark">{{:rebind:search.query}}</span>\n </small>\n </div>\n\n <ion-list class="list" ng-class="::motion.ionListClass">\n\n <ng-include src="\'plugins/es/templates/document/items_documents.html\'"></ng-include>\n\n </ion-list>\n\n <ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n\n</div>'),e.put("plugins/es/templates/document/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>DOCUMENT.LOOKUP.POPOVER_ACTIONS.TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n <a class="item item-icon-left assertive ink" ng-class="{\'gray\': !search.total}" ng-click="removeAll()">\n <i class="icon ion-trash-a"></i>\n {{\'DOCUMENT.LOOKUP.POPOVER_ACTIONS.REMOVE_ALL\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/group/edit_group.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!loading && !id" translate>GROUP.EDIT.TITLE_NEW</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n \x3c!-- loading --\x3e\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n\n \x3c!-- --\x3e\n <div class="list" ng-class="motion.ionListClass" ng-init="setForm(recordForm)">\n\n <div class="item hidden-xs">\n <h1 ng-if="id" ng-bind-html="formData.title"></h1>\n <h1 ng-if="!id" translate>GROUP.EDIT.TITLE_NEW</h1>\n <h2 class="balanced" ng-if="!id">\n <i class="icon ion-android-people"></i>\n <i class="icon ion-android-lock" ng-if="formData.type==\'managed\'"></i>\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </h2>\n </div>\n <div class="item" ng-if="id">\n <h4 class="gray">\n <i class="icon ion-calendar"></i>\n {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}} {{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n <div class="item item-divider" translate>GROUP.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>GROUP.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'GROUP.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="group-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true">\n </div>\n <div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>GROUP.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'GROUP.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n </textarea>\n </div>\n\n \x3c!-- social networks --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_socials.html\'"></ng-include>\n\n </div>\n\n <div class="padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/item_group.html",'<a name="group-{{:rebind:group.hash}}"></a>\n<ion-item id="group-{{:rebind:block.hash}}" class="item item-icon-left item-group {{ionItemClass}}" ng-click="select(group)">\n\n <i class="icon ion-cube stable" ng-if=":rebind:(!group.empty && !group.avatar)"></i>\n <i class="avatar" ng-if=":rebind:!group.empty && group.avatar" style="background-image: url(\'{{:rebind:block.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 class="dark">\n <i class="ion-clock"></i>\n {{:rebind:group.creationTime|formatDate}}\n </h4>\n <h4>\n \x3c!-- membersCount --\x3e\n <i class="dark ion-person"></i>\n <span class="dark" ng-if=":rebind:group.membersCount">+{{:rebind:group.membersCount}}</span>\n </h4>\n </div>\n\n <div class="col col-33 positive hidden-md">\n <h4><i class="ion-person"></i> <span ng-bind-html=":rebind:group.title"></span></h4>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/group/items_groups.html",'\n\n<div class="item row row-header hidden-xs hidden-sm" ng-if="expertMode">\n\n <a class="no-padding dark col col-header" ng-click="toggleSort(\'medianTime\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'medianTime\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_CREATION_TIME\' | translate}}\n </a>\n <a class="no-padding dark col col-header" ng-click="toggleSort(\'issuer\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'issuer\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_ISSUER\' | translate}}\n </a>\n <div class="col col-20"> \n </div>\n <a class="no-padding dark col col-20 col-header" ng-click="toggleSort(\'number\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'number\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_NAME\' | translate}}\n </a>\n</div>\n\n<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<ng-repeat ng-repeat="group in :rebind:search.results" ng-include="\'plugins/es/templates/group/item_group.html\'">\n</ng-repeat>\n'),e.put("plugins/es/templates/group/list.html",'<ion-list class="{{::motion.ionListClass}}">\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i>\n <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3 trust-as-html="notification.message | translate:notification"></h3>\n <h4>\n <i class="icon {{notification.icon}}"></i> <span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/group/lookup.html",'<ion-view class="view-group">\n <ion-nav-title>\n <span translate>GROUP.LOOKUP.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n <ng-include src="\'plugins/es/templates/group/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/lookup_form.html",'<div class="lookupForm">\n\n <button class="button button-small button-positive button-clear ink pull-right padding-right hidden-sm hidden-xs" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n {{\'GROUP.LOOKUP.BTN_NEW\' | translate}}\n </button>\n\n \x3c!-- search text--\x3e\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()">\n <input type="text" class="hidden-xs hidden-sm" id="{{searchTextId}}" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="helptip-group-search-text"></a>\n </div>\n\n </label>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px">\n <div class="pull-left">\n <h4 ng-if="search.type==\'open\'" translate>\n GROUP.LOOKUP.OPEN_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'last\'" translate>\n GROUP.LOOKUP.LAST_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'managed\'" translate>\n GROUP.LOOKUP.MANAGED_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'text\'">\n {{\'COMMON.RESULTS_LIST\'|translate}}\n </h4>\n <h5 class="dark" ng-if="!search.loading && search.total">\n <span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span>\n <small class="gray" ng-if=":rebind:search.took && expertMode">\n - {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}\n </small>\n </h5>\n <h5 class="gray" ng-if="search.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>COMMON.SEARCHING</span>\n <br>\n </h5>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a ng-if="enableFilter" class="button button-text button-small ink icon ion-clock" ng-class="{\'button-text-positive\': search.type==\'last\'}" ng-click="doSearchLast()">\n {{\'GROUP.LOOKUP.BTN_LAST\' | translate}}\n </a>\n \n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate:search}}\n </button>\n </div>\n </div>\n\n <ion-list class="list {{ionListClass}}">\n\n <ng-include src="\'plugins/es/templates/group/items_groups.html\'"></ng-include>\n\n </ion-list>\n\n <ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n\n</div>'),e.put("plugins/es/templates/group/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>GROUP.TYPE.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm padding">\n <h3 translate>GROUP.TYPE.SELECT_TYPE</h3>\n\n \t<div class="list">\n\n \x3c!-- open group --\x3e\n <div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'open\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon ion-android-people dark"></i>\n <h2 translate>GROUP.TYPE.OPEN_GROUP</h2>\n <h4 class="gray" translate>GROUP.TYPE.OPEN_GROUP_HELP</h4>\n </div>\n </div>\n\n \x3c!-- managed group --\x3e\n <div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'managed\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon ion-android-people dark"></i>\n <i class="icon-secondary ion-android-lock dark" style="left: 10px; top: -8px"></i>\n <h2 translate>GROUP.TYPE.MANAGED_GROUP</h2>\n <h4 class="gray" translate>GROUP.TYPE.MANAGED_GROUP_HELP</h4>\n </div>\n </div>\n\n </div>\n</ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/group/view_record.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="positive-900-bg hero">\n <div class="content" ng-if="!loading">\n <i class="avatar cion-registry-{{formData.type}}" ng-if="!formData.thumbnail"></i>\n <i class="avatar" style="background-image: url({{::formData.thumbnail.src}})" ng-if="formData.thumbnail"></i>\n <h3 ng-bind-html="formData.title"></h3>\n <h4> </h4>\n </div>\n <h4 class="content light" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n </div>\n\n <div class="row no-padding-xs">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col list item-text-wrap no-padding-xs" ng-class="motion.ionListClass">\n\n <div class="item">\n <h2 class="gray">\n <a ng-if="formData.city" ui-sref="app.groups({location:formData.city})">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.type"> | </span>\n <a ng-if="formData.type" ui-sref="app.groups({type:formData.type})">\n <i class="icon ion-flag"></i>\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock" ng-if="formData.time"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ng-class="{\'positive\': issuer.uid, \'gray\': !issuer.uid}" ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})">\n <ng-if ng-if="issuer.uid">\n <i class="icon ion-person"></i>\n {{::issuer.name||issuer.uid}}\n </ng-if>\n <span ng-if="!issuer.uid">\n <i class="icon ion-key"></i>\n {{issuer.pubkey|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <h4 class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </h4>\n </span>\n </h4>\n </div>\n\n \x3c!-- Buttons bar--\x3e\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n <button class="button button-calm ink-dark" ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)" ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.title})">\n {{\'COMMON.BTN_SEND_MONEY\' | translate}}\n </button>\n <button class="button button-stable icon-left ink-dark" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n </div>\n\n <ion-item>\n <h2>\n <span class="text-keep-lines" ng-bind-html="formData.description"></span>\n </h2>\n </ion-item>\n\n <ion-item>\n <h4 ng-if="formData.address">\n <span class="gray" translate>REGISTRY.VIEW.LOCATION</span>\n <a class="positive" target="_blank" href="https://www.google.fr/maps/?q={{formData.address}},%20{{formData.city}}">\n <span ng-bind-html="formData.address"></span>\n <span ng-if="formData.city"> - </span>\n <span ng-bind-html="formData.city"></span>\n </a>\n </h4>\n </ion-item>\n\n \x3c!-- Socials networks --\x3e\n <ng-if ng-if="formData.socials && formData.socials.length>0">\n <ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">{{social.type}}</p>\n <h2>\n <a href="{{social.url}}" ng-if="social.type != \'email\'" target="_blank">{{social.url}}</a>\n <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a>\n </h2>\n </ion-item>\n </ng-if>\n\n <div class="lazy-load">\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n\n <span class="item item-divider" ng-if="formData.pubkey">\n <span translate>REGISTRY.TECHNICAL_DIVIDER</span>\n </span>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <h4 class="dark">{{::formData.pubkey}}</h4>\n </div>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n </ion-content>\n\n <button class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm" ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)" ng-click="showTransferModal({pubkey: formData.pubkey, uid: formData.title})">\n </button>\n\n\n</ion-view>\n'),e.put("plugins/es/templates/join/modal_join_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'select-account-type\'">\n\n \x3c!-- ornigzation wallet --\x3e\n <div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-class="{ activated: accountTypeMember != null && !accountTypeMember }" ng-click="selectAccountType(\'organization\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon dark cion-registry-association"></i>\n <h2 translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT</h2>\n <h4 class="gray" translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT_HELP</h4>\n <i class="icon dark ion-ios-arrow-right"></i>\n </div>\n </div>\n\n</ng-if>\n\n\x3c!-- Add a slide --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'last-slide\'">\n\n \x3c!-- STEP 6: organization type --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n\n <p>TOTO</p>\n\n </ion-content>\n </ion-slide-page>\n\n</ng-if>\n'),e.put("plugins/es/templates/message/compose.html",'<ion-view left-buttons="leftButtons" id="composeMessage">\n <ion-nav-title>\n <span class="visible-xs visible-sm" nf-if="!isReply" translate>MESSAGE.COMPOSE.TITLE</span>\n <span class="visible-xs visible-sm" nf-if="isReply" translate>MESSAGE.COMPOSE.TITLE_REPLY</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="row">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n <div class="col">\n <h2 class="hidden-xs hidden-sm">\n {{\'MESSAGE.COMPOSE.SUB_TITLE\'|translate}}\n </h2>\n <h4 class="hidden-xs hidden-sm"> </h4>\n <ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include>\n </div>\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/message/compose_form.html",' <form name="messageForm" novalidate="" ng-submit="doSend()">\n\n <div class="list no-margin" ng-init="setForm(messageForm)">\n\n <a class="item item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.destPub}" ng-click="showWotLookupModal()">\n <span class="gray" translate>MESSAGE.COMPOSE.TO</span>\n <span class="badge badge-royal" ng-if="destUid"><i class="ion-person"></i> {{destUid}}</span> \n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !formData.destPub">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n <div class="item item-text-wrap">\n <span class="gray" translate>TRANSFER.FROM</span>\n <span class="badge badge-balanced">\n <ion-spinner icon="android" ng-if="!$root.walletData.pubkey"></ion-spinner>\n <span ng-if="$root.walletData.pubkey && !$root.walletData.name">\n {{$root.walletData.pubkey| formatPubkey}} \n </span>\n <span ng-if="$root.walletData.pubkey && $root.walletData.name">\n {{$root.walletData.name}}\n </span>\n </span>\n </div>\n\n \x3c!-- Object --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n \x3c!--<span class="input-label">{{\'MESSAGE.COMPOSE.OBJECT\' | translate}}</span>--\x3e\n <input type="text" placeholder="{{\'MESSAGE.COMPOSE.OBJECT_HELP\' | translate}}" name="title" ng-model="formData.title" ng-maxlength="256" required>\n \n </div>\n <div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="maxlength">\n <span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 256}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Content --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.content.$invalid}">\n <span class="input-label">{{\'MESSAGE.COMPOSE.MESSAGE\' | translate}}</span>\n <textarea placeholder="{{\'MESSAGE.COMPOSE.MESSAGE_HELP\' | translate}}" name="content" ng-model="formData.content" rows="8" ng-maxlength="5000">\n </textarea>\n </div>\n <div class="form-errors" ng-show="form.$submitted && form.content.$error" ng-messages="form.content.$error">\n <div class="form-error" ng-message="maxlength">\n <span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 5000}"></span>\n </div>\n </div>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button>\n <button class="button button-positive ink" type="submit" translate>TRANSFER.BTN_SEND</button>\n </div>\n\n \x3c!-- Encryption info --\x3e\n <div class="list no-padding">\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>MESSAGE.COMPOSE.ENCRYPTED_HELP</h4>\n </div>\n </div>\n </form>\n\n'),e.put("plugins/es/templates/message/list.html",'<ion-view left-buttons="leftButtons" class="view-messages">\n <ion-nav-title>\n <span translate>MESSAGE.LIST.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n </button>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs">\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh(true)">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <ion-list>\n <div class="item large-button-bar hidden-xs hidden-sm">\n\n <button class="button button-stable button-small-padding icon ion-loop" ng-click="load()">\n </button>\n\n <button class="button button-calm icon ion-compose" ng-click="showNewMessageModal()">\n {{\'MESSAGE.BTN_COMPOSE\' | translate}}\n </button>\n\n <button class="button button-stable icon-right ink" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i> \n {{\'COMMON.BTN_OPTIONS\' | translate}}\n </button>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink icon ion-archive" ng-class="{\'button-text-positive\': type==\'inbox\'}" ng-click="setType(\'inbox\')">\n {{\'MESSAGE.LIST.INBOX\' | translate}}\n </a>\n \n <a class="button button-text button-small ink icon ion-paper-airplane" ng-class="{\'button-text-positive\': type==\'outbox\'}" ng-click="setType(\'outbox\')" class="badge-balanced">\n {{\'MESSAGE.LIST.OUTBOX\' | translate}}\n </a>\n </div>\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n </ion-list>\n\n <ion-list class="{{::motion.ionListClass}}" can-swipe="$root.device.enable" ng-hide="loading">\n\n <div class="padding gray" ng-if="!messages.length">\n <span ng-if="type==\'inbox\'" translate>MESSAGE.NO_MESSAGE_INBOX</span>\n <span ng-if="type==\'outbox\'" translate>MESSAGE.NO_MESSAGE_OUTBOX</span>\n </div>\n\n <ion-item class="item item-border-large item-avatar item-icon-right ink" ng-repeat="msg in messages" ui-sref="app.user_view_message({type:type, id:msg.id})">\n\n <i ng-if="::!msg.avatar" class="item-image icon" ng-class="{\'ion-person\': msg.uid, \'ion-email\': !msg.uid}"></i>\n <i ng-if="::msg.avatar" class="item-image avatar" style="background-image: url({{::msg.avatar.src}})"></i>\n\n <h4 class="pull-right hidden-xs hidden-sm">\n <span class="dark"><i class="ion-clock"></i> {{::msg.time|formatFromNow}}</span>\n <span class="gray">| {{::msg.time|formatDate}}</span>\n </h4>\n <h4 class="pull-right visible-xs visible-sm dark"><i class="ion-clock"></i> {{::msg.time|formatFromNow}}</h4>\n <h3>\n <a class="positive" ng-if="::msg.name||msg.uid" ui-sref="app.wot_identity({pubkey:msg.issuer, uid:msg.name||msg.uid})">\n <i class="ion-person"></i>\n {{::msg.name||msg.uid}}\n </a>\n <a class="gray" ng-if="::!msg.name && !msg.uid" ui-sref="app.wot_identity({pubkey:msg.issuer})">\n <i class="ion-key"></i>\n {{::msg.issuer|formatPubkey}}\n </a>\n </h3>\n <h2 ng-class="{\'unread\': !msg.read}">{{::msg.title}}</h2>\n <p>{{::msg.summary||msg.content}}</p>\n <i class="icon ion-ios-arrow-right"></i>\n <ion-option-button class="button-stable" ng-click="showReplyModal($index)" translate>MESSAGE.BTN_REPLY</ion-option-button>\n <ion-option-button class="button-assertive" ng-click="delete($index)" translate>COMMON.BTN_DELETE</ion-option-button>\n\n </ion-item>\n </ion-list>\n </ion-content>\n\n <button id="fab-add-message-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-compose visible-xs visible-sm spin" ng-click="showNewMessageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/message/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>MESSAGE.LIST.POPOVER_ACTIONS.TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n <a class="item item-icon-left ink" ng-class="{\'gray\': (type != \'inbox\' && !messages.length)}" ng-click="markAllAsRead()">\n <i class="icon ion-android-checkmark-circle"></i>\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </a>\n\n <a class="item item-icon-left assertive ink" ng-class="{\'gray\': !messages.length}" ng-click="deleteAll()">\n <i class="icon ion-trash-a"></i>\n {{\'MESSAGE.LIST.POPOVER_ACTIONS.DELETE_ALL\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/message/modal_compose.html",'<ion-modal-view id="composeMessage" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" ng-if="!isReply" translate>MESSAGE.COMPOSE.TITLE</h1>\n <h1 class="title" ng-if="isReply" translate>MESSAGE.COMPOSE.TITLE_REPLY</h1>\n\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()">\n </button>\n </ion-header-bar>\n\n <ion-content scroll="true">\n <ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/message/popover_message.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification" ng-controller="PopoverMessageCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title" translate>MESSAGE.NOTIFICATIONS.TITLE</div>\n\n <div class="pull-right">\n <a class="positive" ng-click="showNewMessageModal()" translate>MESSAGE.BTN_COMPOSE</a>\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n MESSAGE.NO_MESSAGE_INBOX\n </div>\n\n <ion-list>\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="::!notification.avatar" class="item-image icon ion-email"></i>\n <i ng-if="::notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3>\n <span translate>MESSAGE.NOTIFICATIONS.MESSAGE_RECEIVED</span>\n <span class="positive" ng-if="::notification.name||notification.uid"><i class="ion-person"></i> {{::notification.name||notification.uid}}</span>\n <span class="gray" ng-if="::!notification.name && !notification.uid"><i class="ion-key"></i> {{::notification.issuer|formatPubkey}}</span>\n </h3>\n <h4>\n <i class="icon ion-archive balanced"></i> <span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{::notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n </ion-list>\n\n <ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.user_message" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/message/view_message.html",'<ion-view left-buttons="leftButtons" class="view-message">\n <ion-nav-title>\n <span translate>MESSAGE.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col no-padding">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list animate-fade-slide-in item-text-wrap">\n\n \x3c!-- Buttons bar--\x3e\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable icon-left ink-dark" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-stable icon ion-reply" ng-click="showReplyModal()">\n {{\'MESSAGE.BTN_REPLY\' | translate}}\n </button>\n \x3c!--<button class="button button-small button-stable icon ion-reply"\n ng-click="showForwardModal()">\n {{\'MESSAGE.BTN_FORWARD\' | translate}}\n </button>--\x3e\n </div>\n\n <div class="item item-avatar" ng-class="{\'item-avatar\': formData.avatar}">\n\n <i ng-if="!formData.avatar" class="item-image ion-person"></i>\n <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}})"></i>\n\n <h1 class="title hidden-xs hidden-sm" ng-bind-html="formData.title"></h1>\n <h4>\n {{type == \'inbox\' ? \'MESSAGE.VIEW.SENDER\': \'MESSAGE.VIEW.RECIPIENT\'|translate}}\n <a class="positive" ui-sref="app.wot_identity({pubkey: (type == \'inbox\') ? formData.issuer : formData.recipient, uid: formData.name||formData.uid})">\n <span ng-if="formData.name||formData.uid">\n <i class="ion-person"></i>\n {{formData.name||formData.uid}}\n </span>\n <span ng-if="!formData.name&&!formData.uid" class="gray">\n <i class="ion-key gray"></i>\n {{formData.issuer|formatPubkey}}\n </span>\n </a>\n <span class="hidden-xs hidden-sm">\n <i class="ion-clock"></i>\n {{formData.time|formatFromNow}}\n <span class="gray">|\n {{formData.time | formatDate}}\n </span>\n </span>\n </h4>\n <h5 class="gray visible-xs visible-sm">\n <i class="ion-clock"></i> {{formData.time | formatDate}}\n </h5>\n </div>\n\n \x3c!-- content --\x3e\n <ion-item class="visible-xs visible-sm">\n <h1 class="title" ng-bind-html="formData.title"></h1>\n </ion-item>\n\n \x3c!-- content --\x3e\n <ion-item>\n <p ng-bind-html="formData.html">\n </p>\n\n <div class="padding gray" ng-if="!formData.content" translate>\n MESSAGE.VIEW.NO_CONTENT\n </div>\n </ion-item>\n\n\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n </div>\n </ion-content>\n\n <button id="fab-view-message-reply" class="button button-fab button-fab-bottom-right button-calm icon ion-reply visible-xs visible-sm spin" ng-click="showReplyModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/message/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left assertive ink" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'MESSAGE.VIEW.DELETE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/item_content_peer.html",'\n <i class="icon ion-android-desktop" ng-class=":rebind:{\'balanced\': peer.online && peer.hasMainConsensusBlock, \'energized\': peer.online && peer.hasConsensusBlock, \'gray\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \'stable\': !peer.online}" ng-if=":rebind:!peer.avatar"></i>\n <b class="icon-secondary ion-person" ng-if=":rebind:!peer.avatar" ng-class=":rebind:{\'balanced\': peer.online && peer.hasMainConsensusBlock, \'energized\': peer.online && peer.hasConsensusBlock, \'gray\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \'stable\': !peer.online}" style="left: 26px; top: -3px"></b>\n <i class="avatar" ng-if=":rebind:peer.avatar" style="background-image: url(\'{{:rebind:peer.avatar.src}}\')"></i>\n <b class="icon-secondary assertive ion-close-circled" ng-if=":rebind:!peer.online" style="left: 37px; top: -10px"></b>\n\n <div class="row no-padding">\n <div class="col no-padding">\n <h3 class="dark">{{:rebind:peer.dns || peer.server}}</h3>\n <h4>\n <span class="gray" ng-if=":rebind:!peer.name">\n <i class="ion-key"></i> {{:rebind:peer.pubkey|formatPubkey}}\n </span>\n <span class="positive" ng-if=":rebind:peer.name">\n <i class="ion-person"></i> {{:rebind:peer.name}}\n </span>\n <span class="gray">{{:rebind:peer.dns && (\' | \' + peer.server) + (peer.ep.path||\'\') }}</span>\n </h4>\n </div>\n <div class="col col-15 no-padding text-center hidden-xs hidden-sm" ng-if="::expertMode">\n <div style="min-width: 50px; padding-top: 5px">\n <span ng-if=":rebind:peer.isSsl()" title="SSL">\n <i class="ion-locked"></i><small class="hidden-md"> SSL</small>\n </span>\n <span ng-if=":rebind:peer.hasEndpoint(\'ES_SUBSCRIPTION_API\')" title="{{\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\'|translate: peer.docCount }}">\n <i class="ion-email"></i> {{:rebind:peer.docCount.emailSubscription || \'?\'}}\n </span>\n </div>\n <div ng-if=":rebind:peer.isTor()">\n <i class="ion-bma-tor-api"></i>\n </div>\n <div ng-if=":rebind:peer.isWs2p()&&peer.isTor()" ng-click="showWs2pPopover($event, peer)">\n <i class="ion-bma-tor-api"></i>\n </div>\n </div>\n <div class="col col-20 no-padding text-center" ng-if="::!expertMode && search.type != \'offline\'">\n <div style="min-width: 50px; padding-top: 5px" ng-if=":rebind:peer.docCount.emailSubscription!==undefined">\n <span ng-if=":rebind:peer.hasEndpoint(\'ES_SUBSCRIPTION_API\')" title="{{\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\'|translate: peer.docCount }}">\n <i class="ion-email"></i> {{:rebind:peer.docCount.emailSubscription || \'?\'}}\n </span>\n </div>\n </div>\n <div class="col col-20 no-padding text-center" ng-if="::expertMode && search.type != \'offline\'">\n <h4 class="hidden-sm hidden-xs gray">\n {{:rebind:peer.software||\'?\'}}\n </h4>\n <h4 class="hidden-sm hidden-xs gray">{{:rebind: peer.version ? (\'v\'+peer.version) : \'\'}}</h4>\n </div>\n <div class="col col-20 no-padding text-center" id="{{$index === 0 ? helptipPrefix + \'-peer-0-block\' : \'\'}}">\n <span class="badge badge-stable">\n {{:rebind:peer.docCount.record !== undefined ? (peer.docCount.record|formatInteger) : \'?\'}}\n <span ng-if=":rebind:!expertMode && peer.docCount.record!==undefined">\n {{::\'ES_PEER.DOCUMENTS\'|translate|lowercase }}\n </span>\n </span>\n <span class="badge badge-secondary" ng-class=":rebind:{\'balanced\': peer.hasMainConsensusBlock, \'energized\': peer.hasConsensusBlock, \'ng-hide\': !peer.currentNumber }" ng-if="::expertMode">\n {{:rebind:\'BLOCKCHAIN.VIEW.TITLE\'|translate: {number:peer.currentNumber} }}\n </span>\n\n </div>\n </div>\n'),e.put("plugins/es/templates/network/items_peers.html",'<div ng-class="::motion.ionListClass" class="no-padding">\n\n <div class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-if="::isHttps && expertMode">\n <small><i class="icon ion-alert-circled"></i> {{::\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small>\n </div>\n\n <div class="item row row-header hidden-xs hidden-sm done in" ng-if="::expertMode">\n <a class="col col-header no-padding dark" ng-click="toggleSort(\'name\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'name\'"></cs-sort-icon>\n {{::\'ES_PEER.NAME\' | translate}} / {{::\'COMMON.PUBKEY\' | translate}}\n </a>\n <a class="no-padding dark hidden-md col col-15 col-header" ng-click="toggleSort(\'api\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'api\'"></cs-sort-icon>\n {{::\'PEER.API\' | translate}}\n </a>\n <a class="no-padding dark col col-20 col-header" ng-click="toggleSort(\'difficulty\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'software\'"></cs-sort-icon>\n {{::\'ES_PEER.SOFTWARE\' | translate}}\n </a>\n <a class="col col-20 col-header no-padding dark" ng-click="toggleSort(\'doc_count\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'doc_count\'"></cs-sort-icon>\n {{::\'ES_PEER.DOCUMENTS\' | translate}}\n </a>\n </div>\n\n <div ng-repeat="peer in :rebind:search.results track by peer.id" class="item item-peer item-icon-left ink" ng-class="::ionItemClass" id="{{helptipPrefix}}-peer-{{$index}}" ng-click="selectPeer(peer)" ng-include="\'plugins/es/templates/network/item_content_peer.html\'">\n </div>\n\n</div>\n'),e.put("plugins/es/templates/network/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>PEER.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'member\')">\n <i class="icon ion-person"></i>\n {{\'PEER.MEMBERS\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'member\'"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'mirror\')">\n <i class="icon ion-radio-waves"></i>\n {{\'PEER.MIRRORS\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'mirror\'"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'offline\')">\n <i class="icon ion-eye-disabled"></i>\n {{\'PEER.OFFLINE\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'offline\'"></i>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/modal_network.html",'<ion-modal-view id="nodes" class="modal-full-height" cache-view="false">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>PEER.PEER_LIST</h1>\n <div class="buttons buttons-right header-item">\n <span class="secondary">\n <button class="button button-clear icon ion-loop button-clear" ng-click="refresh()">\n\n </button>\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </span>\n </div>\n </ion-header-bar>\n\n <ion-content>\n <div class="list">\n <div class="padding padding-xs" style="display: block; height: 60px">\n\n <div class="pull-left">\n <h4>\n <span ng-if="!enableFilter || !search.type" translate>PEER.ALL_PEERS</span>\n <span ng-if="!search.loading">({{search.results.length}})</span>\n </h4>\n </div>\n\n <div class="pull-right">\n <ion-spinner class="icon" icon="android" ng-if="search.loading"></ion-spinner> \n </div>\n </div>\n\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n\n\t </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/network/popover_endpoints.html",'<ion-popover-view class="popover-endpoints popover-light" style="height: {{(titleKey?30:0)+((!items || items.length <= 1) ? 55 : 3+items.length*52)}}px">\n <ion-header-bar class="bar bar-header stable-bg" ng-if="titleKey">\n <div class="title">\n {{titleKey | translate:titleValues }}\n </div>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list" ng-class="{\'has-header\': titleKey}">\n <div class="item item-text-wrap" ng-repeat="item in items">\n <div class="item-label" ng-if="item.label">{{item.label | translate}}</div>\n <div id="endpoint_{{$index}}" class="badge item-note dark">{{item.value}}\n </div>\n </div>\n </div></ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/popover_network.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-network" ng-controller="NetworkLookupPopoverCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title">\n {{\'MENU.NETWORK\'|translate}}\n <ion-spinner class="ion-spinner-small" icon="android" ng-if="search.loading"></ion-spinner>\n </div>\n\n <div class="pull-right">\n <a ng-class="{\'positive\': search.type==\'member\', \'dark\': search.type!==\'member\'}" ng-click="toggleSearchType(\'member\')" translate>PEER.MEMBERS</a>\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="list no-padding">\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n </div>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings --\x3e\n <div class="pull-left">\n <a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SETTINGS</a>\n </div>\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.es_network" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/popover_peer_info.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-peer-info" ng-controller="PeerInfoPopoverCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title">\n {{\'PEER.VIEW.TITLE\'|translate}}\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list no-padding" ng-if="!loading">\n\n <div class="item" ng-if=":rebind:formData.software">\n <i class="ion-outlet"></i>\n {{\'NETWORK.VIEW.SOFTWARE\'|translate}}\n <div class="badge" ng-class=":rebind:{\'badge-energized\': formData.isPreRelease, \'badge-assertive\': formData.hasNewRelease }">\n {{formData.software}} v{{:rebind:formData.version}}\n </div>\n <div class="gray badge badge-secondary" ng-if="formData.isPreRelease">\n <i class="ion-alert-circled"></i>\n <span ng-bind-html="\'NETWORK.VIEW.WARN_PRE_RELEASE\'|translate: formData.latestRelease"></span>\n </div>\n <div class="gray badge badge-secondary" ng-if="formData.hasNewRelease">\n <i class="ion-alert-circled"></i>\n <span ng-bind-html="\'NETWORK.VIEW.WARN_NEW_RELEASE\'|translate: formData.latestRelease"></span>\n </div>\n </div>\n\n <div class="item">\n <i class="ion-locked"></i>\n {{\'NETWORK.VIEW.ENDPOINTS.BMAS\'|translate}}\n <div class="badge badge-balanced" ng-if=":rebind:formData.useSsl" translate>COMMON.BTN_YES</div>\n <div class="badge badge-assertive" ng-if=":rebind:!formData.useSsl" translate>COMMON.BTN_NO</div>\n </div>\n\n <div class="item">\n <i class="ion-cube"></i>\n {{\'BLOCKCHAIN.VIEW.TITLE_CURRENT\'|translate}}\n <div class="badge badge-balanced">\n {{:rebind:formData.number | formatInteger}}\n </div>\n </div>\n\n <div class="item">\n <i class="ion-clock"></i>\n {{\'CURRENCY.VIEW.MEDIAN_TIME\'|translate}}\n <div class="badge dark">\n {{:rebind:formData.medianTime | medianDate}}\n </div>\n </div>\n\n <div class="item">\n <i class="ion-lock-combination"></i>\n {{\'CURRENCY.VIEW.POW_MIN\'|translate}}\n <div class="badge dark">\n {{:rebind:formData.powMin | formatInteger}}\n </div>\n </div>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="default"></cs-extension-point>\n\n </div>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings --\x3e\n <div class="pull-left">\n <a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>MENU.SETTINGS</a>\n </div>\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.view_es_peer" ng-click="closePopover()" translate>PEER.BTN_SHOW_PEER</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/view_es_network.html",'<ion-view>\n <ion-nav-title>\n <span translate>MENU.NETWORK</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n </ion-nav-buttons>\n\n\n <ion-content scroll="true" ng-init="enableFilter=true; ionItemClass=\'item-border-large\';">\n\n <div class="row responsive-sm responsive-md responsive-lg">\n <div class="col list col-border-right">\n <div class="padding padding-xs" style="display: block; height: 60px">\n <div class="pull-left">\n <h4>\n <span ng-if="enableFilter && !search.online" translate>PEER.OFFLINE_PEERS</span>\n <span ng-if="!enableFilter || search.online" translate>PEER.ALL_PEERS</span>\n <span ng-if="search.results.length">({{search.results.length}})</span>\n <ion-spinner ng-if="search.loading" class="icon ion-spinner-small" icon="android"></ion-spinner>\n </h4>\n </div>\n\n <div class="pull-right">\n\n <div class="pull-right" ng-if="enableFilter">\n\n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': !search.online, \'button-text-stable\': search.online}" ng-click="toggleOnline(!search.online)">\n <i class="icon ion-close-circled light-gray"></i>\n <span>{{\'PEER.OFFLINE\'|translate}}</span>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n </div>\n </div>\n </div>\n\n <div id="helptip-network-peers" style="display: block"></div>\n\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n </div>\n\n <div class="col col-33" ng-controller="MkLastDocumentsCtrl">\n <div class="padding padding-xs" style="display: block">\n <h4 translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS_DOTS</h4>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': compactMode, \'button-text-stable\': !compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px"></b>\n <b class="icon-secondary ion-arrow-up-b" style="top: 4px; left: 5px; font-size: 8px"></b>\n <span>{{\'DOCUMENT.LOOKUP.BTN_COMPACT\'|translate}}</span>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="buttons"></cs-extension-point>\n\n <a class="button button-text button-small ink" ui-sref="app.document_search({index: search.index, type: search.type})">\n <i class="icon ion-android-search"></i>\n <span>{{\'COMMON.BTN_SEARCH\'|translate}}</span>\n </a>\n\n </div>\n </div>\n\n <ng-include src="\'plugins/market/templates/document/list_documents.html\'"></ng-include>\n\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/network/view_es_peer.html",'<ion-view>\n <ion-nav-title>\n <span translate>PEER.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="has-header" scroll="true">\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col list">\n\n <ion-item>\n <h1>\n <span translate>PEER.VIEW.TITLE</span>\n <span class="gray">\n {{node.host}}\n </span>\n </h1>\n <h2 class="gray">\n <i class="gray icon ion-android-globe"></i>\n {{node.ep.dns || node.server}}\n <span class="gray" ng-if="!loading && node.useSsl">\n <i class="gray ion-locked"></i> <small>SSL</small>\n </span>\n <span class="gray" ng-if="!loading && node.useTor">\n <i class="gray ion-bma-tor-api"></i>\n </span>\n </h2>\n\n \x3c!-- node owner --\x3e\n <h3>\n <span class="dark">\n <i class="icon ion-android-desktop"></i>\n {{\'PEER.VIEW.OWNER\'|translate}}\n </span>\n <a class="positive" ng-if="node.name" ui-sref="app.wot_identity({pubkey: node.pubkey, uid: node.name})">\n <i class="ion-person"></i> {{node.name}}\n </a>\n <span ng-if="!loading && !node.name">\n <a class="gray" ui-sref="app.wot_identity({pubkey: node.pubkey})">\n <i class="ion-key"></i>\n {{node.pubkey|formatPubkey}}\n </a>\n </span>\n </h3>\n\n <h3>\n <a ng-click="openRawPeering($event)">\n <i class="icon ion-share"></i> {{\'PEER.VIEW.SHOW_RAW_PEERING\'|translate}}\n </a>\n\n <span class="gray" ng-if="!isReachable"> | </span>\n <a ng-if="!isReachable" ng-click="openRawCurrentBlock($event)">\n <i class="icon ion-share"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span>\n </a>\n </h3>\n </ion-item>\n\n\n <div class="item item-divider" translate>\n PEER.VIEW.GENERAL_DIVIDER\n </div>\n\n <ion-item class="item-icon-left item-text-wrap ink" copy-on-click="{{node.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>COMMON.PUBKEY</span>\n <h4 class="dark text-left">{{node.pubkey}}</h4>\n </ion-item>\n\n <ion-item class="item item-icon-left item-text-wrap ink" ng-if="isReachable">\n <i class="icon ion-cube"></i>\n <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span>\n <div class="badge badge-calm" ng-if="!loading">\n {{current.number|formatInteger}}\n </div>\n </ion-item>\n\n <ion-item class="item item-icon-left item-text-wrap" ng-if="isReachable">\n <i class="icon ion-document"></i>\n <span translate>ES_PEER.DOCUMENT_COUNT</span>\n <div class="badge badge-stable" ng-if="!loading">\n {{node.docCount|formatInteger}}\n </div>\n </ion-item>\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.document_search(options.document)">\n <i class="icon ion-document" style="font-size: 25px"></i>\n <i class="icon-secondary ion-clock" style="font-size: 18px; left: 33px; top: -12px"></i>\n <span translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="general"></cs-extension-point>\n\n <div class="item item-divider" ng-hide="loading || !isReachable" translate>\n PEER.VIEW.KNOWN_PEERS\n </div>\n\n <ion-item class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-show="!loading && !isReachable">\n <small><i class="icon ion-alert-circled"></i> {{\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small>\n </ion-item>\n\n <div class="item center" ng-if="loading">\n <ion-spinner class="icon" icon="android"></ion-spinner>\n </div>\n\n <div class="list no-padding {{::motion.ionListClass}}" ng-if="isReachable">\n\n <div ng-repeat="peer in :rebind:peers track by peer.id" class="item item-peer item-icon-left ink" ng-class="::ionItemClass" ng-click="selectPeer(peer)" ng-include="\'plugins/es/templates/network/item_content_peer.html\'">\n </div>\n\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/notification/list_notification.html",'<ion-list class="{{::motion.ionListClass}}">\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i>\n <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3 trust-as-html="notification.message | translate:notification"></h3>\n <h4>\n <i class="icon {{notification.icon}}"></i> <span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/notification/popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink" ng-disabled="!search.results.length" ng-click="markAllAsRead()">\n <i class="icon ion-android-checkmark-circle"></i>\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/notification/popover_notification.html",'<ion-popover-view class="fit popover-notification" ng-controller="PopoverNotificationsCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title" translate>COMMON.NOTIFICATIONS.TITLE</div>\n\n <div class="pull-right">\n <a class="positive" ng-click="markAllAsRead()" translate>COMMON.NOTIFICATIONS.MARK_ALL_AS_READ</a>\n </div>\n </ion-header-bar>\n\n <ion-content scroll="true">\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n COMMON.NOTIFICATIONS.NO_RESULT\n </div>\n\n <ng-include src="\'plugins/es/templates/notification/list_notification.html\'"></ng-include>\n\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings\n <div class="pull-left">\n <a class="positive"\n ui-sref="app.es_settings"\n ng-click="closePopover()"\n translate>MENU.SETTINGS</a>\n </div> --\x3e\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.view_notifications" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/notification/view_notifications.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'COMMON.NOTIFICATIONS.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n </button>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="load()">\n </button>\n\n <button class="button button-raised icon-left ion-checkmark ink" ng-click="markAllAsRead()">\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </button>\n </div>\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n COMMON.NOTIFICATIONS.NO_RESULT\n </div>\n\n <ng-include src="\'plugins/es/templates/notification/list_notification.html\'"></ng-include>\n\n\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/es/templates/registry/edit_record.html",'<ion-view left-buttons="leftButtons" class="view-page">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!loading && !id" translate>REGISTRY.EDIT.TITLE_NEW</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="hero">\n <div class="content">\n <i class="avatar" ng-class="avatarClass" ng-style="avatarStyle">\n <button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block" ng-click="showAvatarModal()"></button>\n <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px" ng-click="rotateAvatar()">\n <i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px"></i>\n <i class="icon-secondary ion-forward" style="left: 26px; top: -13px"></i>\n </button>\n <button class="button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm" ng-click="showAvatarModal()"></button>\n </i>\n <h3 class="dark">\n <span ng-if="!loading && formData.title">{{formData.title}}</span>\n <span ng-if="!loading && !id && !formData.title" translate>REGISTRY.EDIT.TITLE_NEW</span>\n </h3>\n <h4 class="dark">\n <ion-spinner ng-if="loading" icon="android"></ion-spinner>\n </h4>\n </div>\n </div>\n\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col no-padding-xs">\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n <div class="list {{::motion.ionListClass}}" ng-init="setForm(recordForm)">\n <div class="item" ng-if="id">\n <h4 class="gray">\n <i class="icon ion-calendar"></i>\n {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}} {{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">\n {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n <div class="item item-divider" translate>REGISTRY.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="registry-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true">\n </div>\n <div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'REGISTRY.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n </textarea>\n </div>\n\n \x3c!-- category --\x3e\n <div class="item item-icon-right ink" ng-if="loading || formData.type===\'company\' || formData.type===\'shop\'" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id, \'done in\': !loading}" ng-click="showCategoryModal()">\n <span translate>REGISTRY.CATEGORY</span>\n <span class="badge badge-royal">{{formData.category.name | formatCategory}}</span> \n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n <input type="hidden" name="category" ng-model="formData.category.id" required-if="formData.type==\'company\' || formData.type==\'shop\'">\n <div class="form-errors" ng-if="form.$submitted && form.category.$error" ng-messages="form.category.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- position --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_position.html\'"></ng-include>\n\n \x3c!-- social networks --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include>\n\n <div class="item item-divider" translate>REGISTRY.TECHNICAL_DIVIDER</div>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey">\n </div>\n\n </div>\n\n <div class="padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),
|
||
e.put("plugins/es/templates/registry/lookup.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span translate>REGISTRY.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()">\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-funnel visible-xs visible-sm" ng-click="showFiltersPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content class="lookupForm padding no-padding-xs">\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_list.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/registry/lookup_form.html",'\n\x3c!-- selected location\n<a\n class="button button-small button-text button-stable button-icon-event stable-900-bg"\n style="margin-right: 10px;">\n <i class="icon ion-location"></i>\n {{search.location}}\n <i class="icon ion-close" ng-click="removeLocation2()"> </i>\n</a>--\x3e\n<form ng-submit="doSearch()">\n <div class="item no-padding">\n\n <div class="item-input light-bg">\n\n <div class="animate-show-hide ng-hide" ng-show="entered" ng-if="search.geoPoint || search.type || search.category">\n \x3c!-- selected location --\x3e\n <div ng-show="search.geoPoint" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px">\n <i class="icon ion-location"></i>\n <span ng-bind-html="search.location"></span>\n <i class="icon ion-close" ng-click="removeLocation()"> </i>\n </div>\n\n \x3c!-- selected type --\x3e\n <div ng-show="search.type" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px">\n <i class="icon cion-page-{{search.type}}"></i>\n <span>{{\'REGISTRY.TYPE.ENUM.\'+search.type|uppercase|translate}}</span>\n <i class="icon ion-close" ng-click="removeType()"> </i>\n </div>\n\n \x3c!-- selected category --\x3e\n <div ng-show="search.category.name" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px">\n <i class="icon ion-flag"></i>\n <span>{{search.category.name|truncText:40}}</span>\n <i class="icon ion-close" ng-click="removeCategory()"> </i>\n </div>\n </div>\n\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'REGISTRY.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()" on-return="doSearchText()" select-on-click>\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'REGISTRY.SEARCH.SEARCH_HELP\'|translate}}" id="registrySearchText" ng-model="search.text" on-return="doSearchText()">\n </div>\n\n </div>\n\n \x3c!-- location --\x3e\n <ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-if="entered && options.location.show && (!search.geoPoint || smallscreen)" ng-controller="ESSearchPositionItemCtrl"></ng-include>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/es/templates/registry/lookup_form_options.html\'"></ng-include>\n\n\n\n<div class="padding-top hidden-xs hidden-sm" style="display: block; height: 60px">\n <div class="pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-stable\': !search.advanced, \'button-text-positive\': search.advanced}" ng-click="search.advanced=!search.advanced">\n {{\'REGISTRY.SEARCH.BTN_ADVANCED_SEARCH\' | translate}}\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n\n \n\n </div>\n\n <div class="pull-right">\n\n <a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.lastRecords}" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n \n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n\n \n\n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n </div>\n</div>\n\n<div class="padding-xs" style="display: block; height: 60px">\n <div class="pull-left ng-hide" ng-show="!search.loading && search.results">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>REGISTRY.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>COMMON.RESULTS_LIST</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && search.results.length===0" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n'),e.put("plugins/es/templates/registry/lookup_form_options.html",'\n <div class="item item-icon-left item-icon-right item-input stable-bg" ng-click="showRecordTypeModal($event)" ng-if="search.advanced && !search.type">\n <b class="icon-secondary ion-help gray" style="left:10px; top: -8px"></b>\n <b class="icon-secondary cion-page-association gray" style="left:14px; top: 2px"></b>\n <b class="icon-secondary cion-page-company gray" style="left:28px; top: -6px"></b>\n\n <span class="input-label item-icon-left-padding" translate>REGISTRY.SEARCH.TYPE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n\n <div class="item item-icon-left item-icon-right item-input stable-bg" ng-click="showCategoryModal($event)" ng-if="search.advanced && !search.category">\n <i class="icon ion-flag gray"></i>\n <span class="input-label item-icon-left-padding" translate>REGISTRY.CATEGORY</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n\n <div class="item item-icon-left item-input item-select stable-bg" ng-if="search.advanced && options.location.show">\n <i class="icon ion-arrow-resize gray"></i>\n <span class="input-label item-icon-left-padding" translate>LOCATION.DISTANCE</span>\n <label>\n <select ng-model="search.geoDistance" class="col-border-left" ng-options="i as (geoDistanceLabels[i].labelKey | translate:geoDistanceLabels[i].labelParams ) for i in geoDistances track by i">\n </select>\n </label>\n </div>'),e.put("plugins/es/templates/registry/lookup_lg.html",'<ion-view left-buttons="leftButtons" class="view-registry-search">\n <ion-nav-title>\n <span translate>REGISTRY.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="lookupForm padding no-padding-xs stable-100-bg">\n\n <button class="button button-small button-positive button-clear ink pull-right padding-right hidden-sm hidden-xs" ng-click="showNewPageModal()">\n <i class="icon ion-plus"></i>\n {{\'REGISTRY.BTN_NEW\' | translate}}\n </button>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_list_lg.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/registry/lookup_list.html",'\n<ion-list class="{{::motion.ionListClass}}" ng-if="!search.loading && search.results && search.results.length > 0">\n\n <div ng-repeat="item in search.results" class="item item-avatar item-icon-right item-border-large ink" ui-sref="app.view_page({id: item.id, title: item.urlTitle})">\n\n <i ng-if="::!item.avatar" class="item-image icon cion-page-{{::item.type}}"></i>\n <i ng-if="::item.avatar" class="item-image avatar" style="background-image: url({{::item.avatar.src}})"></i>\n\n <h2 ng-bind-html="::item.title"></h2>\n <h4>\n <span class="dark" ng-if="::item.city">\n <b class="ion-location"></b>\n <span ng-bind-html="::item.city"></span>\n </span>\n <span class="gray" ng-if="::item.distance">\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\n </span>\n </h4>\n <h4 class="gray" ng-if="::item.time && search.lastRecords">\n <i class="ion-clock"></i>\n {{::item.time | formatFromNow}}\n </h4>\n <h4 class="gray" ng-if="!search.lastRecords">\n <i class="cion-page-{{::item.type}}"></i>\n <span ng-if="item.category">{{::item.category.name}}</span>\n <span ng-if="!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</span>\n </h4>\n <i class="icon ion-ios-arrow-right"></i>\n </div>\n</ion-list>\n'),e.put("plugins/es/templates/registry/lookup_list_lg.html",'\n\n<div class="list {{::motion.ionListClass}} light-bg" ng-if="!search.loading && search.results && search.results.length > 0">\n\n <a ng-repeat="item in search.results" class="item item-record item-border-large ink padding-xs" ui-sref="app.view_page({id: item.id, title: item.urlTitle})">\n\n <div class="row row-record">\n <div class="col item-text-wrap item-avatar-left-padding" ng-class="::{\'item-avatar\': item.avatar || item.type}">\n <i class="item-image icon cion-page-{{::item.type}}" ng-if="::!item.avatar"></i>\n <i class="item-image avatar" style="background-image: url({{::item.avatar.src}})" ng-if="::item.avatar"></i>\n <h2 ng-bind-html="::item.title"></h2>\n <h4>\n <span class="dark" ng-if="::item.city">\n <b class="ion-location"></b>\n <span ng-bind-html="::item.city"></span>\n </span>\n <span class="gray" ng-if="::item.distance">\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\n </span>\n </h4>\n <h4>\n <span class="gray" ng-if="::item.time && search.lastRecords">\n <b class="ion-clock"></b>\n {{::item.time | formatFromNow}}\n </span>\n <span ng-if="::item.tags" class="dark">\n <ng-repeat ng-repeat="tag in ::item.tags">\n #<ng-bind-html ng-bind-html="::tag"></ng-bind-html>\n </ng-repeat>\n </span>\n </h4>\n <span ng-if="::item.picturesCount > 1" class="badge badge-balanced badge-picture-count">{{::item.picturesCount}} <i class="icon ion-camera"></i></span>\n </div>\n <div class="col col-20 hidden-xs hidden-sm">\n <h3 class="gray">\n <ng-if ng-if="::item.category">{{::item.category.name}}</ng-if>\n <ng-if ng-if="::!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</ng-if>\n </h3>\n </div>\n <div class="col hidden-xs">\n <h4 class="text-wrap">\n <span class="visible-sm">\n <b class="ion-flag"></b>\n <ng-if ng-if="::item.category">{{::item.category.name|truncText:50}}</ng-if>\n <ng-if ng-if="::!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</ng-if>\n </span>\n <span class="gray text-italic" ng-if="::item.description">\n <b class="ion-quote"></b>\n <span ng-bind-html="::item.description|truncText:500" ng-if="::item.description"></span>\n </span>\n </h4>\n </div>\n </div>\n\n </a>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/registry/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- new page --\x3e\n <a class="item item-icon-left ink" ng-click="showNewPageModal();">\n <i class="icon ion-plus"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/lookup_popover_filters.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- new page --\x3e\n <a class="item item-icon-left ink" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n\n \x3c!-- advanced options --\x3e\n <a class="item item-icon-left ink" ng-click="toggleAdvanced();">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.advanced"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.advanced"></i>\n <span translate>REGISTRY.SEARCH.POPOVER_FILTERS.BTN_ADVANCED_SEARCH</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>{{getParameters().title||\'REGISTRY.TYPE.TITLE\'|translate}}</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm">\n <div class="list padding">\n <h3 translate>REGISTRY.TYPE.SELECT_TYPE</h3>\n <button class="button button-block button-stable icon-left cion-page-shop" ng-click="closeModal(\'shop\')" translate>REGISTRY.TYPE.ENUM.SHOP</button>\n\n <button class="button button-block button-stable icon-left cion-page-association" ng-click="closeModal(\'association\')" translate>REGISTRY.TYPE.ENUM.ASSOCIATION</button>\n\n <button class="button button-block button-stable icon-left cion-page-company" ng-click="closeModal(\'company\')" translate>REGISTRY.TYPE.ENUM.COMPANY</button>\n\n <button class="button button-block button-stable icon-left cion-page-institution" ng-click="closeModal(\'institution\')" translate>REGISTRY.TYPE.ENUM.INSTITUTION</button>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/registry/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>REGISTRY.VIEW.MENU_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n <a class="item item-icon-left assertive ink" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/view_record.html",'<ion-view left-buttons="leftButtons" class="view-page">\n <ion-nav-title>\n\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" class="refresher-top-bg">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()">\n </ion-refresher>\n\n <div class="hero">\n <div class="content" ng-if="!loading">\n <i class="avatar cion-page-{{formData.type}}" ng-if="!formData.avatar"></i>\n <i class="avatar" ng-style="{{avatarStyle}}" ng-if="formData.avatar"></i>\n <h3><span class="dark" ng-bind-html="formData.title"></span></h3>\n <h4> </h4>\n </div>\n <h4 class="content dark" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n <h4 class="content gray hidden-xs hidden-sm" ng-if="formData.city">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </h4>\n </div>\n\n <div class="row no-padding-xs">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col list animate-fade-slide-in item-text-wrap no-padding-xs">\n\n <div class="item">\n <h2 class="gray">\n <a ng-if="formData.city" ui-sref="app.registry_lookup({location:formData.city})">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.type"> | </span>\n <a ng-if="formData.type" ui-sref="app.registry_lookup({type:formData.type})">\n <i class="cion-page-{{formData.type}}"></i>\n {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock" ng-if="formData.time"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ng-class="{\'positive\': issuer.uid, \'gray\': !issuer.uid}" ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})">\n <ng-if ng-if="issuer.uid">\n <i class="icon ion-person"></i>\n {{::issuer.name||issuer.uid}}\n </ng-if>\n <span ng-if="!issuer.uid">\n <i class="icon ion-key"></i>\n {{issuer.pubkey|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <h4 class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </h4>\n </span>\n </h4>\n </div>\n\n \x3c!-- Buttons bar--\x3e\n <a id="registry-share-anchor-{{id}}"></a>\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n \x3c!--<button class="button button-calm ink-dark"--\x3e\n \x3c!--ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)"--\x3e\n \x3c!--ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.title})">--\x3e\n \x3c!--{{\'COMMON.BTN_SEND_MONEY\' | translate}}--\x3e\n \x3c!--</button>--\x3e\n <button class="button button-stable icon-left ink-dark" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n </div>\n\n <ion-item>\n <h2 trust-as-html="formData.description"></h2>\n </ion-item>\n\n <ion-item ng-if="formData.category || formData.address">\n <h4 ng-if="formData.category">\n <span class="gray" translate>REGISTRY.VIEW.CATEGORY</span>\n <a class="positive" ng-if="formData.category" ui-sref="app.registry_lookup({category:formData.category.id})">\n <span ng-bind-html="formData.category.name"></span>\n </a>\n </h4>\n <h4 ng-if="formData.address">\n <span class="gray" translate>REGISTRY.VIEW.LOCATION</span>\n <a class="positive" target="_system" href="https://www.openstreetmap.org/search?query={{formData.address}},%20{{formData.city}}">\n <span ng-bind-html="formData.address"></span>\n <span ng-if="formData.city"> - </span>\n <span ng-bind-html="formData.city"></span>\n </a>\n </h4>\n </ion-item>\n\n \x3c!-- Socials networks --\x3e\n <ng-if ng-if="formData.socials && formData.socials.length>0">\n <ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">{{social.type}}</p>\n <h2>\n <a ng-click="openLink($event, social.url, social.type)">{{social.url}}</a>\n </h2>\n </ion-item>\n </ng-if>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <h4 class="dark">{{::formData.pubkey}}</h4>\n </div>\n\n <div class="lazy-load">\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n </ion-content>\n\n <button class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm" ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)" ng-click="showTransferModal({pubkey: formData.pubkey, uid: formData.title})">\n </button>\n\n\n</ion-view>\n'),e.put("plugins/es/templates/registry/view_wallet_pages.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'REGISTRY.MY_PAGES\' | translate}}\n </ion-nav-title>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate()">\n </ion-refresher>\n\n \x3c!-- Buttons bar --\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <button class="button button-calm icon-left ink" ng-click="showNewPageModal()">\n {{\'REGISTRY.BTN_NEW\' | translate}}\n </button>\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="center padding gray" ng-if="!search.loading && !search.results.length" translate>\n REGISTRY.NO_PAGE\n </div>\n\n <ng-include src="\'plugins/es/templates/registry/lookup_list.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-wallet-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/settings/plugin_settings.html",'<ion-view left-buttons="leftButtons" class="settings">\n <ion-nav-title translate>ES_SETTINGS.PLUGIN_NAME</ion-nav-title>\n\n <ion-content scroll="true">\n\n <span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span>\n\n <div class="item ink" ng-click="formData.enable && changeEsNode()" ng-disabled="!formData.enable">\n <div class="input-label" ng-class="{\'gray\': !formData.enable}">\n {{\'ES_SETTINGS.PEER\' | translate}}\n </div>\n <span class="item-note" ng-class="{\'dark\': formData.enable}">{{getServer()}}</span>\n </div>\n\n \x3c!--span class="item item-divider" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>\n\n <span class="item gray item-text-wrap" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>\n\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.txSent" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.txReceived" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.certSent" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.certReceived" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div--\x3e\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/settings/settings_extend.html",'\n\x3c!--<span class="item item-divider" translate>SETTINGS.PLUGINS_SETTINGS</span>--\x3e\n\n<div class="item item-text-wrap ink item-icon-right" ui-sref="app.es_settings">\n <div class="input-label ng-binding" translate>ES_SETTINGS.PLUGIN_NAME</div>\n \x3c!--<h4 class="gray" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4>--\x3e\n <i class="gray icon ion-ios-arrow-right"></i>\n</div>\n'),e.put("plugins/es/templates/subscription/edit_subscriptions.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'SUBSCRIPTION.EDIT.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()">\n </ion-refresher>\n\n \x3c!-- Buttons bar --\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="load()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <button class="button button-calm ink" ng-click="addSubscription()">\n {{\'SUBSCRIPTION.BTN_ADD\' | translate}}\n </button>\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="center padding gray" ng-if="!search.loading && !search.results.length" translate>\n SUBSCRIPTION.NO_SUBSCRIPTION\n </div>\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col list {{::motion.ionListClass}} item-border-large">\n\n \x3c!-- emails --\x3e\n <ng-repeat ng-repeat="subscriptions in search.results | filter: { type: \'email\' }" ng-include="\'plugins/es/templates/subscription/item_\' + subscriptions.type.toLowerCase() + \'_subscription.html\'">>\n </ng-repeat>\n\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n\n </ion-content>\n\n <button id="fab-add-subscription-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="addSubscription()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/subscription/item_email_subscription.html",'<div class="item item-avatar">\n <i class="item-image icon ion-email"></i>\n <h3>\n {{\'SUBSCRIPTION.TYPE.ENUM.\' + subscriptions.type.toUpperCase() | translate}}\n </h3>\n <h4 class="gray">\n {{\'SUBSCRIPTION.EDIT.PROVIDER\'|translate}}\n <a ui-sref="app.wot_identity({pubkey: subscriptions.recipient, uid: subscriptions.uid})">\n <span ng-class="{\'positive\': subscriptions.uid, \'dark\': !subscriptions.uid}" ng-if="subscriptions.name||subscriptions.uid">\n <i class="ion-person" ng-if="subscriptions.uid"></i>\n {{subscriptions.name||subscriptions.uid}}\n </span>\n <span class="gray" ng-if="!subscriptions.uid">\n <i class="ion-key"></i>\n {{subscriptions.recipient | formatPubkey}}\n </span>\n </a>\n </h4>\n <div class="item-note text-right">\n <span ng-repeat="item in subscriptions.items">\n {{item.content.email}}\n <a class="ion-trash-a gray padding-left" ng-click="deleteSubscription(item)"></a>\n <a class="ion-edit gray padding-left" ng-click="editSubscription(item)"></a>\n <br>\n </span>\n </div>\n</div>\n'),e.put("plugins/es/templates/subscription/modal_email.html",'\n<ion-modal-view id="composeMessage" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>SUBSCRIPTION.MODAL_EMAIL.TITLE</h1>\n\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSubmit()">\n </button>\n </ion-header-bar>\n\n <ion-content scroll="true">\n\n \x3c!-- Encryption info --\x3e\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>SUBSCRIPTION.MODAL_EMAIL.HELP</h4>\n </div>\n\n <form name="subscriptionForm" novalidate="" ng-submit="doSubmit()">\n\n <div class="list" ng-init="setForm(subscriptionForm)">\n\n \x3c!-- email --\x3e\n <label class="item item-input" ng-class="{\'item-input-error\': form.$submitted && (form.email.$invalid || form.email.$error)}">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.EMAIL_LABEL</span>\n <input name="email" type="text" placeholder="{{\'SUBSCRIPTION.MODAL_EMAIL.EMAIL_HELP\' | translate}}" ng-model="formData.content.email" ng-minlength="3" required email>\n </label>\n <div class="form-errors" ng-if="form.$submitted && (form.email.$invalid || form.email.$error)" ng-messages="form.email.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="email">\n <span translate="ERROR.FIELD_NOT_EMAIL"></span>\n </div>\n </div>\n\n \x3c!-- Frequency --\x3e\n <label class="item item-input item-select" ng-class="{\'item-input-error\': form.$submitted && !formData.content.frequency}">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_LABEL</span>\n <select name="frequency" ng-model="formData.content.frequency" style="height: 46px;margin-top: 1px">\n <option value="weekly" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_WEEKLY</option>\n <option value="daily" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_DAILY</option>\n </select>\n </label>\n <div class="form-errors" ng-if="form.$submitted && !formData.content.frequency">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Recipient (service provider) --\x3e\n <a class="item item-input item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.recipient}" ng-click="showNetworkLookup()" style="height: 67px">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.PROVIDER</span>\n <span class="badge animate-fade-in animate-show-hide ng-hide" ng-class="{\'badge-royal\': recipient.name, \'badge-stable\': !recipient.name}" ng-show="recipient && (recipient.name)">\n <i class="ion-person" ng-if="recipient.name"></i> {{recipient.name}}\n </span>\n <span class="badge badge-secondary animate-fade-in animate-show-hide ng-hide" ng-show="formData.recipient">\n <i class="ion-key"></i> {{formData.recipient | formatPubkey}}\n </span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !formData.recipient">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_ADD\' | translate}}\n </button>\n </div>\n\n </form>\n </ion-content>\n</ion-modal-view>\n\n\n\n\n'),e.put("plugins/es/templates/user/edit_profile.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n \x3c!-- no title--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear ion-android-done visible-xs visible-sm" ng-click="submitAndSaveAndClose()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="positive-900-bg hero">\n <div class="content">\n <i class="avatar" ng-style="avatarStyle" ng-class="{\'avatar-wallet\': !loading && !avatar && walletData && !walletData.isMember, \'avatar-member\': !loading && !avatar && walletData.isMember}">\n <button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block" ng-click="showAvatarModal()"></button>\n <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px" ng-click="rotateAvatar()">\n <i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px"></i>\n <i class="icon-secondary ion-forward" style="left: 26px; top: -13px"></i>\n </button>\n <button class="button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm" ng-click="showAvatarModal()"></button>\n </i>\n <h3 class="light">\n <ng-if ng-if="!loading && !formData.title && walletData && walletData.isMember">{{walletData.uid}}</ng-if>\n <ng-if ng-if="!loading && !formData.title && walletData && !walletData.isMember">{{::walletData.pubkey | formatPubkey}}</ng-if>\n <ng-if ng-if="!loading && formData.title">{{formData.title}}</ng-if>\n </h3>\n <h4 class="light">\n <ion-spinner ng-if="loading" icon="android"></ion-spinner>\n </h4>\n </div>\n </div>\n\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col">\n <form name="profileForm" novalidate="" ng-submit="saveAndClose()">\n\n <div class="list item-text-wrap {{::motion.ionListClass}}" ng-init="setForm(profileForm)">\n\n \x3c!-- Public info --\x3e\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>PROFILE.HELP.WARNING_PUBLIC_DATA</h4>\n </div>\n\n <div class="item item-divider">\n {{\'PROFILE.GENERAL_DIVIDER\' | translate}}\n </div>\n\n \x3c!-- title --\x3e\n <ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label">{{\'PROFILE.TITLE\' | translate}}</span>\n <input type="text" name="title" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" id="profile-name" ng-model="formData.title" ng-model-options="{ debounce: 350 }" ng-maxlength="50" required>\n </ion-item>\n <div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 50}"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <ion-item class="item-input item-floating-label item-button-right">\n <span class="input-label" style="width: 100%">{{\'PROFILE.DESCRIPTION\' | translate}}</span>\n <textarea placeholder="{{\'PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n </ion-item>\n\n \x3c!-- position --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n\n \x3c!-- social networks --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include>\n\n <div class="item item-divider">\n {{\'PROFILE.TECHNICAL_DIVIDER\' | translate}}\n </div>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.pubkey.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" name="pubkey" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey" autocomplete="off" ng-pattern="pubkeyPattern" ng-model-options="{ debounce: 250 }">\n </div>\n <div class="form-errors" ng-show="form.pubkey.$error" ng-messages="form.pubkey.$error">\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.INVALID_PUBKEY"></span>\n </div>\n </div>\n\n <div class="item padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm ink" ng-class="{\'button-assertive\': dirty}" type="submit">\n {{\'COMMON.BTN_SAVE\' | translate}}\n </button>\n </div>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/es/templates/user/items_profile.html",'<div ng-if="!formData.profile && !formData.name" class="item gray" translate>PROFILE.NO_PROFILE_DEFINED</div>\n\n\x3c!-- name --\x3e\n<div class="item" ng-if="formData.name && showName">\n <span class="gray" translate>PROFILE.TITLE</span>\n <h3>{{formData.name}}</h3>\n</div>\n\n\x3c!-- About me --\x3e\n<div class="item item-text-wrap" ng-if="formData.profile.description">\n <span class="gray" translate>PROFILE.DESCRIPTION</span>\n <h3 trust-as-html="formData.profile.description"></h3>\n</div>\n\n\x3c!-- Localisation --\x3e\n<div class="item" ng-if="formData.profile.address || formData.profile.city" copy-on-click="{{formData.profile.address ? formData.profile.address + \' \' : \'\'}}{{formData.profile.city}}">\n <span class="gray" translate>LOCATION.LOCATION_DIVIDER</span>\n <h3>\n <span class="text-keep-lines" ng-if="formData.profile.address">{{formData.profile.address}}<br></span>\n {{formData.profile.city}}\n </h3>\n</div>\n\n\x3c!-- Socials networks --\x3e\n<div class="item" ng-if="formData.profile.socials && formData.profile.socials.length" ng-controller="ESSocialsViewCtrl">\n <span class="gray" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\n <div class="list no-padding">\n <ion-item ng-repeat="social in formData.profile.socials | filter:filterFn track by social.url " id="social-{{::social.url|formatSlug}}" class="item-icon-left item-text-wrap no-padding-bottom ink" ng-click="openSocial($event, social)">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">\n {{social.type}}\n <i class="ion-locked" ng-if="social.recipient"></i>\n </p>\n <h4>\n <a>{{::social.url}}</a>\n </h4>\n </ion-item>\n </div>\n</div>\n\n\n'),e.put("plugins/es/templates/wallet/view_wallet_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'hero\'">\n \x3c!-- likes --\x3e\n <h4 class="light">\n <small ng-include="\'plugins/es/templates/common/view_likes.html\'" ng-init="canEdit=true"></small>\n </h4>\n</ng-if>\n\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n \x3c!-- profile --\x3e\n <div class="item item-divider item-divider-top-border">\n <span ng-bind-html="\'PROFILE.PROFILE_DIVIDER\' | translate"></span>\n <a class="badge button button-text button-small button-small-padding" ui-sref="app.user_edit_profile">\n <i class="icon ion-edit"></i>\n <span ng-if="!formData.profile" translate>PROFILE.BTN_ADD</span>\n <span ng-if="formData.profile" translate>PROFILE.BTN_EDIT</span>\n </a>\n </div>\n\n <ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=true"></ng-include>\n\n \x3c!-- subscriptions --\x3e\n <div class="item item-divider item-divider-top-border">\n <span>\n {{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer" ng-click="showSubscriptionHelp=!showSubscriptionHelp" class="icon positive ion-ios-help-outline" title="{{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP\' | translate}}"></i>\n <span>\n\n <a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count" ui-sref="app.edit_subscriptions">\n <i class="icon ion-edit"></i>\n <span translate>SUBSCRIPTION.BTN_ADD</span>\n </a>\n </span></span></div>\n\n <div class="item item-text-wrap positive item-small-height" ng-show="showSubscriptionHelp">\n <small translate>SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP</small>\n </div>\n\n <div ng-if="!formData.subscriptions.count" class="item gray" translate>SUBSCRIPTION.NO_SUBSCRIPTION</div>\n\n <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count" ui-sref="app.edit_subscriptions">\n <i class="icon ion-gear-a"></i>\n <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span>\n <span class="badge badge-calm">{{formData.subscriptions.count}}</span>\n\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- page --\x3e\n <div class="item item-divider item-divider-top-border">\n <span>\n {{\'REGISTRY.WALLET.REGISTRY_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer" ng-click="showPagesHelp=!showPagesHelp" class="icon positive ion-ios-help-outline" title="{{\'REGISTRY.WALLET.REGISTRY_HELP\' | translate}}"></i>\n <span>\n\n <a class="badge button button-text button-small button-small-padding" ng-if="!formData.pages.count" ng-click="showNewPageModal($event)">\n <i class="icon ion-edit"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </a>\n </span></span></div>\n\n <div class="item item-text-wrap positive item-small-height" ng-show="showPagesHelp">\n <small translate>REGISTRY.WALLET.REGISTRY_HELP</small>\n </div>\n\n <div ng-if="!formData.pages.count" class="item gray" translate>REGISTRY.NO_PAGE</div>\n\n <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count" ui-sref="app.wallet_pages">\n <i class="icon ion-social-buffer"></i>\n <span translate>REGISTRY.MY_PAGES</span>\n <span class="badge badge-calm">{{formData.pages.count}}</span>\n\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n</ng-if>\n'),e.put("plugins/es/templates/wot/view_identity_extend.html",'\x3c!-- Hero --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'hero\'">\n \x3c!-- likes --\x3e\n <h4 class="light">\n <small ng-include="\'plugins/es/templates/common/view_likes.html\'"></small>\n </h4>\n</ng-if>\n\n\x3c!-- Top fab buttons --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons-top-fab\'">\n <button id="fab-compose-{{:rebind:formData.pubkey}}" class="button button-fab button-fab-top-left button-fab-hero mini button-stable spin" style="left: 88px" ng-click="showNewMessageModal()">\n <i class="icon ion-compose"></i>\n </button>\n</ng-if>\n\n\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n\n \x3c!-- message --\x3e\n <button class="button button-calm button-raised icon icon-left icon ion-compose ink" ng-click="showNewMessageModal()" title="{{\'MESSAGE.BTN_WRITE\' | translate}}" translate>\n MESSAGE.BTN_WRITE\n </button>\n \x3c!-- Star --\x3e\n <button class="button button-stable button-small-padding ink" ng-if="likeData.stars && !likeData.stars.wasHit" title="{{\'WOT.VIEW.BTN_STAR_HELP\'|translate: likeData.stars }}" ng-click="showStarPopover($event)">\n <i class="icon ion-android-star-outline"></i>\n </button>\n <button class="button button-stable button-small-padding ink" ng-if="likeData.stars.wasHit" title="{{\'WOT.VIEW.BTN_REDO_STAR_HELP\'|translate: likeData.stars }}" ng-click="showStarPopover($event)">\n <i class="icon" ng-class="{\'ion-android-star-half\': likeData.stars.level > 0 && likeData.stars.level <=3, \'ion-android-star\': likeData.stars.level > 3}"></i>\n <span>{{likeData.stars.level}}/5</span>\n </button>\n\n \x3c!-- options --\x3e\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showActionsPopover($event)">\n </button>\n</ng-if>\n\n\x3c!-- General section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n \x3c!-- star level --\x3e\n <div class="item item-icon-left item-text-wrap" ng-if="likeData.stars" ng-click="smallscreen && showStarPopover($event)">\n\n <i class="icon" ng-class="{\'ion-android-star-outline\': likeData.stars.levelAvg <= 2, \'ion-android-star-half\': likeData.stars.levelAvg > 2 && likeData.stars.levelAvg <= 3, \'ion-android-star energized\': likeData.stars.levelAvg > 3}"></i>\n\n <span translate>WOT.VIEW.STARS</span>\n <h4 class="dark">{{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: likeData.stars }}</h4>\n\n <div class="badge" ng-if="likeData.stars.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="badge" ng-if="!likeData.stars.loading">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': likeData.stars.levelAvg > 3, \'assertive\': likeData.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > likeData.stars.levelAvg && value - 0.5 <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > likeData.stars.levelAvg && value - 0.5 > likeData.stars.levelAvg"></b>\n </span>\n <small class="dark">({{likeData.stars.levelAvg}}/5)</small>\n </div>\n </div>\n</ng-if>\n\n\x3c!-- After general section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n <span class="item item-divider item-divider-top-border" translate>PROFILE.PROFILE_DIVIDER</span>\n\n <div class="double-padding-x padding-bottom">\n <ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=false;"></ng-include>\n </div>\n\n</ng-if>\n'),e.put("plugins/es/templates/wot/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n \x3c!--<a class="item item-icon-left assertive ink "\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>--\x3e\n\n \x3c!-- Follow --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.follows" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'follow\'})">\n <i class="icon" ng-class="{\'ion-android-notifications-off\': likeData.follows.wasHit, \'ion-android-notifications\': !likeData.follows.wasHit}"></i>\n <b class="ion-plus icon-secondary" ng-if="!likeData.follows.wasHit" style="font-size: 16px; left: 38px; top: -7px"></b>\n {{(!likeData.follows.wasHit ? \'WOT.VIEW.BTN_FOLLOW\' : \'WOT.VIEW.BTN_STOP_FOLLOW\' )| translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses && !likeData.abuses.wasHit" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses && likeData.abuses.wasHit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'abuse\'})">\n <i class="icon ion-android-warning"></i>\n <b class="ion-close icon-secondary" style="font-size: 16px; left: 38px; top: -7px"></b>\n {{\'COMMON.BTN_REMOVE_REPORTED_ABUSE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/map/templates/user/edit_profile_extend.html",'<div class="item no-padding {{ionItemClass}}" ng-if="formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon">\n <leaflet height="250px" center="map.center" markers="map.markers" defaults="map.defaults">\n </leaflet>\n</div>\n'),e.put("plugins/graph/templates/account/graph_balance.html",'\n \x3c!-- button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <div class="padding-left padding-right">\n <canvas id="account-balance" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-dataset-override="datasetOverride" chart-colors="colors" chart-options="options" chart-labels="labels" chart-click="onChartClick">\n </canvas>\n </div>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/account/graph_certifications.html",'\n <div class="padding-left padding-right">\n <canvas id="account-certifications" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-dataset-override="datasetOverride" chart-colors="colors" chart-options="options" chart-labels="labels" chart-click="onChartClick">\n </canvas>\n </div>\n'),e.put("plugins/graph/templates/account/graph_sum_tx.html",'<div class="row responsive-sm" ng-if="!loading">\n\n <div class="col col-10 hidden-xs hidden-sm"> </div>\n\n <div class="col text-center">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray padding text-wrap" ng-if="inputChart.data.length" translate>GRAPH.ACCOUNT.INPUT_CHART_TITLE</p>\n <canvas id="chart-received-pie" class="chart-pie" chart-data="inputChart.data" chart-labels="inputChart.labels" chart-colors="inputChart.colors" chart-click="onInputChartClick">\n </canvas>\n\n </div>\n\n <div class="col col-10 hidden-xs hidden-sm"> </div>\n\n <div class="col text-center">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray padding text-wrap" ng-if="outputChart.data.length" translate>GRAPH.ACCOUNT.OUTPUT_CHART_TITLE</p>\n <canvas id="chart-sent-pie" class="chart-pie" chart-data="outputChart.data" chart-labels="outputChart.labels" chart-colors="outputChart.colors" chart-click="onOutputChartClick">\n </canvas>\n\n </div>\n\n <div class="col col-10 hidden-xs hidden-sm"> </div>\n\n</div>\n'),e.put("plugins/graph/templates/account/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.ACCOUNT.TITLE\' | translate}}{{id}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="no-padding">\n\n\n\n <div class="list">\n\n \x3c!-- - - - - Balance - - - - --\x3e\n <ng-controller ng-controller="GpAccountBalanceCtrl">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item item-divider" ng-if="!loading">\n {{\'GRAPH.ACCOUNT.BALANCE_DIVIDER\'|translate}}\n <ion-spinner ng-if="loadingRange" class="ion-spinner-small" icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-include="\'plugins/graph/templates/account/graph_balance.html\'" ng-init="setSize(350, 1000)">\n </div>\n </ng-controller>\n\n </div>\n\n <div class="item no-padding-xs" ng-include="\'plugins/graph/templates/account/graph_sum_tx.html\'" ng-controller="GpAccountSumTxCtrl">\n </div>\n\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/common/graph_range_bar.html",'\n <div class="range range-positive no-padding-left no-padding-right">\n <a class="button button-stable button-clear no-padding pull-left" ng-click="goPreviousRange($event)">\n <i class="icon ion-chevron-left"></i>\n </a>\n <input type="range" ng-model="formData.timePct" name="timePct" min="0" max="100" value="{{formData.timePct}}" ng-change="onRangeChanged();" ng-model-options="{ debounce: 250 }">\n <a class="button button-stable button-clear no-padding pull-right" ng-click="goNextRange($event)">\n <i class="icon ion-chevron-right"></i>\n </a>\n </div>\n'),e.put("plugins/graph/templates/common/popover_range_actions.html",'<ion-popover-view class="has-header popover-graph-currency">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- duration divider --\x3e\n <div class="item item-divider">\n {{\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\'|translate}}\n </div>\n\n \x3c!-- duration: hour --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'hour\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'hour\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.HOUR\' | translate"></span>\n </a>\n\n \x3c!-- duration: day --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'day\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'day\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.DAY\' | translate"></span>\n </a>\n\n \x3c!-- duration: month --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'month\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'month\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.MONTH\' | translate"></span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/docstats/graph.html",'\n \x3c!-- graphs button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <canvas id="{{::chartIdPrefix}}{{chart.id}}" class="chart-line" height="{{height}}" width="{{width}}" chart-data="chart.data" chart-labels="labels" chart-dataset-override="chart.datasetOverride" chart-options="chart.options" chart-click="onChartClick">\n </canvas>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/docstats/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.DOC_STATS.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <div class="list">\n\n \x3c!-- Doc stat --\x3e\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-repeat="chart in charts" ng-include="\'plugins/graph/templates/docstats/graph.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/network/view_es_network_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n <a class="button button-text button-small ink" ui-sref="app.doc_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span>{{\'NETWORK.VIEW.BTN_GRAPH\'|translate}}</span>\n </a>\n</ng-if>\n'),e.put("plugins/graph/templates/network/view_es_peer_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.doc_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.DOC_STATS.TITLE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.doc_synchro_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.SYNCHRO.TITLE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n</ng-if>\n\n'),e.put("plugins/graph/templates/synchro/graph.html",'\n \x3c!-- graphs button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <canvas id="synchro-chart-{{chart.id}}" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="chart.data" chart-labels="labels" chart-dataset-override="chart.datasetOverride" chart-options="chart.options">\n </canvas>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/synchro/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.SYNCHRO.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <div class="list">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-repeat="chart in charts" ng-include="\'plugins/graph/templates/synchro/graph.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/market/templates/category/card_category_lg.html",'\n <div class="item card stable-bg padding">\n \x3c!-- header: parent category --\x3e\n <div class="card-header">\n <h3 class="dark" ng-class="{\'bold\': cat.count}">\n <span ng-bind-html="cat.name"></span> <ng-if ng-if="cat.count">({{cat.count}})</ng-if>\n </h3>\n </div>\n\n \x3c!-- children categories--\x3e\n <div class="item-text-wrap">\n <span ng-repeat="cat in cat.children" class="padding-right">\n <a ng-class="{\'bold\': cat.count}" ng-click="onCategoryClick(cat)"><ng-bind-html ng-bind-html="cat.name"></ng-bind-html><ng-if ng-if="cat.count"> ({{cat.count}})</ng-if></a>\n </span>\n </div>\n </div>\n'),e.put("plugins/market/templates/category/list_categories_lg.html",'\n <div class="list half {{::motion.ionListClass}}">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 2 == 0" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n\n <div class="list half {{::motion.ionListClass}}">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 2 == 1" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n'),e.put("plugins/market/templates/category/view_categories.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n \x3c!--<span translate>MARKET.VIEW.TITLE</span>--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n </ion-nav-buttons>\n\n <ion-content>\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list {{::motion.ionListClass}}" ng-if="!loading">\n\n \x3c!-- all categories --\x3e\n <a class="item item-border item-icon-left item-icon-right bold" ng-class="{\'bold\': totalCount}" ng-click="onCategoryClick()">\n <span translate>MARKET.CATEGORY.ALL</span> ({{totalCount}})\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- loop on root categories --\x3e\n <ng-repeat ng-repeat="cat in categories track by cat.id">\n <div class="item item-divider" ng-class="{\'bold\': cat.count}">\n <span ng-bind-html="cat.name"></span> <ng-if ng-if="cat.count">({{cat.count}})</ng-if>\n </div>\n\n \x3c!-- children categories--\x3e\n <a ng-repeat="cat in cat.children track by cat.id" class="item item-border item-icon-left item-icon-right" ng-class="{\'bold\': cat.count}" ng-click="onCategoryClick(cat)">\n <span ng-bind-html="cat.name"></span><span ng-if="cat.count"> ({{cat.count}})</span>\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n </ng-repeat>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/category/view_categories_lg.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n \x3c!--<span translate>MARKET.VIEW.TITLE</span>--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n \x3c!--<button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm"\n ng-click="showActionsPopover($event)">\n </button>--\x3e\n </ion-nav-buttons>\n\n <ion-content class="padding">\n\n <ng-include src="\'plugins/market/templates/category/list_categories_lg.html\'"></ng-include>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/document/item_document_comment.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-ios-chatbubble-outline stable"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4>\n <i class="ion-ios-chatbubble-outline dark"></i>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person" ng-show=":rebind:!compactMode"></i>\n {{:rebind:doc.name}}:\n </span>\n <span class="dark">\n <i class="ion-quote" ng-if=":rebind:!compactMode"></i>\n {{:rebind:doc.message|truncText:50}}\n </span>\n </h4>\n <h4 class="gray"> <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}</h4>\n </div>\n\n <div class="col">\n <h3>\n <a ui-sref="app.wot_identity({pubkey: doc.pubkey, uid: doc.name})">\n\n </a>\n </h3>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/item_document_profile.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url({{:rebind:doc.avatar.src}})"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-person stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 ng-if=":rebind:doc.title">\n <i class="ion-person gray"></i>\n <span class="dark">\n {{:rebind:doc.title}}\n </span>\n <span class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.HAS_REGISTERED\'|translate}}\n </span>\n </h4>\n <h4>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray">\n <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </span>\n </h4>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/item_document_record.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left item-text-wrap ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'positive-100-bg\': doc.updated}" ng-click="selectDocument($event, doc)">\n\n <i ng-if=":rebind:doc.thumbnail" class="avatar" style="background-image: url({{:rebind:doc.thumbnail.src}})"></i>\n <i ng-if=":rebind:!doc.thumbnail" class="icon ion-speakerphone stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h3 ng-if="doc.title">\n <i class="ion-speakerphone dark"></i>\n {{:rebind:doc.title}}\n </h3>\n <h4>\n <span class="dark" ng-if=":rebind:doc.picturesCount > 1">\n <i class="ion-camera"></i> {{:rebind:doc.picturesCount}}\n </span>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person"></i> {{:rebind:doc.name}}\n </span>\n\n\n </h4>\n </div>\n\n <div class="col col-33">\n <small class="gray pull-right"><i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </small>\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/list_documents.html",'\n<ion-list class="list" ng-class="::motion.ionListClass">\n\n <ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-switch on="doc.type">\n <div ng-switch-when="record">\n <ng-include src="::\'plugins/market/templates/document/item_document_record.html\'"></ng-include>\n </div>\n <div ng-switch-when="comment">\n <ng-include src="::\'plugins/market/templates/document/item_document_comment.html\'"></ng-include>\n </div>\n <div ng-switch-when="profile">\n <ng-include src="::\'plugins/market/templates/document/item_document_profile.html\'"></ng-include>\n </div>\n <div ng-switch-default>\n <ng-include src="::\'plugins/es/templates/document/item_document.html\'"></ng-include>\n </div>\n </ng-repeat>\n\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/gallery/modal_slideshow.html",'<ion-modal-view class="modal modal-pictures" on-swipe-down="closeModal()">\n\n <ion-header-bar class="transparent">\n \x3c!-- start/stop buttons --\x3e\n <a class="button button-icon button-small-padding pull-left icon ion-play hidden-xs hidden-sm ink" ng-class="{\'light\': !interval, \'gray\': interval}" title="{{\'MARKET.GALLERY.BTN_START\'|translate}}" ng-click="start()">\n </a>\n <a class="button button-icon button-small-padding pull-left icon ion-pause hidden-xs hidden-sm ink" ng-class="{\'light\': interval, \'gray\': !interval}" title="{{\'MARKET.GALLERY.BTN_PAUSE\'|translate}}" ng-click="stop()">\n </a>\n\n <h1 class="title balanced" ng-bind-html="activeCategory.name"></h1>\n\n <a class="button button-icon pbutton-small-padding pull-right light hidden-xs hidden-sm ink" ng-click="closeModal()">\n <i class="icon ion-close"></i>\n </a>\n </ion-header-bar>\n\n <ion-slide-box on-slide-changed="slideChanged(index)" active-slide="activeSlide" class="has-header">\n <ion-slide ng-repeat="record in activeCategory.pictures">\n\n\n <div class="image" ng-style="::{\'background-image\': record.src ? (\'url(\'+record.src+\')\') : \'\' }">\n <div class="item no-border item-text-wrap dark padding-left">\n <h1 class="item-text-wrap" ng-class="{\'col-75\': record.price && record.type=\'offer\' || record.type=\'need\'}">\n {{record.title}}\n </h1>\n <h3 ng-if="::record.city && record.stock\'">\n <i class="ion-location"></i> {{options.location.prefix|translate}} {{record.city}}\n </h3>\n\n <div class="badge badge-balanced badge-price" ng-if="::record.price && record.type=\'offer\'" ng-class="{\'sold\': !record.stock}">\n {{record.price|formatAmount:record }}\n </div>\n <div class="badge badge-energized badge-price" ng-if="record.type==\'need\'">\n <i class="cion-market-need"></i>\n <span translate>MARKET.TYPE.NEED_SHORT</span>\n </div>\n <span class="badge badge-assertive badge-secondary" ng-if="::!record.stock" translate>\n MARKET.COMMON.SOLD\n </span>\n </div>\n\n <div class="card card-description light" ng-if="::record.src && record.description && true">\n <div class="item item-text-wrap">\n <i class="ion-quote"></i>\n <span ng-bind-html="record.description"></span>\n </div>\n </div>\n </div>\n\n\n\n </ion-slide>\n </ion-slide-box>\n</ion-modal-view>'),e.put("plugins/market/templates/gallery/view_gallery.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n <span translate>MARKET.GALLERY.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n \x3c!--<button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm"\n ng-click="showActionsPopover($event)">\n </button>--\x3e\n </ion-nav-buttons>\n\n <ion-content class="has-header">\n\n <div class="row responsive-sm">\n <div class="col col-20 list">\n <button class="item button button-block button-raised icon icon-left ion-play ink" title="{{!activeCategory ? \'MARKET.GALLERY.BTN_START\' : \'MARKET.GALLERY.BTN_CONTINUE\' | translate}}" ng-click="startSlideShow()">\n {{!activeCategory ? \'MARKET.GALLERY.BTN_START\' : \'MARKET.GALLERY.BTN_CONTINUE\' | translate}}\n </button>\n\n <button class="item button button-block button-raised icon icon-left ion-stop ink" title="{{\'MARKET.GALLERY.BTN_STOP\' | translate}}" ng-disabled="!activeCategory" ng-click="resetSlideShow()">\n {{\'MARKET.GALLERY.BTN_STOP\' | translate}}\n </button>\n </div>\n\n <div class="col list">\n <div class="item item-input item-select no-border">\n <div class="input-label">\n {{\'MARKET.GALLERY.SLIDE_DURATION\' | translate}}\n </div>\n <select ng-model="options.slideDuration" ng-options="i as (slideDurationLabels[i].labelKey | translate:slideDurationLabels[i].labelParams ) for i in slideDurations track by i">\n </select>\n </div>\n <div class="item item-toggle dark">\n <div class="input-label">\n {{\'MARKET.SEARCH.SHOW_CLOSED_RECORD\' | translate}}\n </div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="options.showClosed">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n </div>\n\n <div class="list">\n <ng-repeat ng-repeat="cat in categories | filter:isLoadedCategory track by cat.id" ng-init="catIndex=$index">\n <div class="item item-divider">\n\n <span ng-bind-html="cat.name"></span> ({{cat.count}})\n </div>\n\n <a class="item item-list-detail">\n <ion-scroll direction="x">\n <img ng-repeat="picture in cat.pictures track by picture.id" ng-src="{{::picture.src}}" title="{{::picture.title}}{{::picture.price ? (\' (\' + (picture.price | formatAmount:picture) +\')\') : \'\' }}" ng-click="showPicturesModal(catIndex, $index, true)" class="image-list-thumb">\n </ion-scroll>\n </a>\n </ng-repeat>\n </div>\n </ion-content>\n</ion-view>'),e.put("plugins/market/templates/help/help.html",'\n <a name="join"></a>\n <h2 translate>HELP.JOIN.SECTION</h2>\n\n <a name="join-salt"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.SALT</div>\n <div class="col" translate>HELP.JOIN.SALT</div>\n </div>\n\n <a name="join-password"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.PASSWORD</div>\n <div class="col" translate>HELP.JOIN.PASSWORD</div>\n </div>\n\n <a name="glossary"></a>\n <h2 translate>HELP.GLOSSARY.SECTION</h2>\n\n <a name="pubkey"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.PUBKEY</div>\n <div class="col" translate>HELP.GLOSSARY.PUBKEY_DEF</div>\n </div>\n\n <a name="universal_dividend"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.UNIVERSAL_DIVIDEND</div>\n <div class="col" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div>\n </div>\n\n\n'),e.put("plugins/market/templates/help/modal_help.html",'<ion-view class="modal slide-in-up ng-enter active ng-enter-active">\n\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CLOSE\n </button>\n\n <h1 class="title" translate>HELP.TITLE</h1>\n </ion-header-bar>\n\n <ion-content scroll="true" class="padding">\n\n <ng-include src="\'templates/help/help.html\'"></ng-include>\n\n <div class="padding hidden-xs text-center">\n <button class="button button-positive ink" type="submit" ng-click="closeModal()">\n {{\'COMMON.BTN_CLOSE\' | translate}}\n </button>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/help/view_help.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>HELP.TITLE</span>\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <h1 class="hidden-xs hidden-sm" translate>HELP.TITLE</h1>\n\n <ng-include src="\'templates/help/help.html\'"></ng-include>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/home/home_extend.html",'\n<ng-if ng-if="enable">\n\n <h2 ng-if="$root.config.plugins.market.homeMessage" ng-bind-html="$root.config.plugins.market.homeMessage"></h2>\n\n <div class="row no-padding center" ng-controller="ESSearchPositionItemCtrl">\n\n <div class="item item-divider text-left no-padding-left">\n <span translate>MARKET.HOME.LOCATION_LABEL</span>\n </div>\n\n \x3c!-- location --\x3e\n <div class="item no-padding item-icon-right" style="background-color: white">\n <div class="item-input item-input-search">\n <input type="text" class="visible-xs visible-sm" placeholder="{{(options.location.help||\'MARKET.HOME.LOCATION_HELP\')|translate}}" ng-model="search.location" ng-keydown="onKeydown($event)" ng-change="onLocationChanged()" ng-blur="hideDropdown()" ng-model-options="{ debounce: 650 }">\n <input type="text" id="searchLocationInput" class="hidden-xs hidden-sm" placeholder="{{(options.location.help||\'MARKET.HOME.LOCATION_HELP\')|translate}}" ng-model="search.location" ng-keydown="onKeydown($event)" ng-change="onLocationChanged()" ng-blur="hideDropdown()" ng-model-options="{ debounce: 350 }" on-return="doSearch()">\n </div>\n\n <a class="icon ion-search ink-dark" ng-click="doSearch()" title="{{\'MARKET.HOME.BTN_SHOW_MARKET_OFFER\'|translate}}"></a>\n </div>\n\n \x3c!-- dropdown --\x3e\n <ng-include src="\'plugins/es/templates/common/dropdown_locations.html\'"></ng-include>\n\n </div>\n\n <br class="hidden-xs hidden-sm">\n <br class="hidden-xs hidden-sm">\n <br>\n\n <button type="button" class="button button-block button-balanced button-raised icon icon-left ion-compose ink-dark" ng-click="showNewRecordModal()" translate>MARKET.HOME.BTN_NEW_AD</button>\n\n\n <br class="hidden-xs">\n\n</ng-if>\n\n'),e.put("plugins/market/templates/join/modal_join.html",'<ion-modal-view class="modal-full-height">\n\n <ion-header-bar class="bar-positive">\n\n <button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slides.slider.activeIndex">\n </button>\n <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="!isLastSlide" ng-click="showHelpModal()"></button>\n\n <h1 class="title" translate>ACCOUNT.NEW.TITLE</h1>\n\n <button class="button button-clear icon-right visible-xs" ng-if="!isLastSlide" ng-click="doNext()">\n <span translate>COMMON.BTN_NEXT</span>\n <i class="icon ion-ios-arrow-right"></i>\n </button>\n <button class="button button-clear icon-right visible-xs" ng-if="isLastSlide" ng-click="doNewAccount()">\n <i class="icon ion-android-send"></i>\n </button>\n </ion-header-bar>\n\n\n <ion-slides options="slides.options" slider="slides.slider">\n\n \x3c!-- STEP: salt --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="saltForm" novalidate="" ng-submit="doNext(\'saltForm\')">\n\n <div class="list" ng-init="setForm(saltForm, \'saltForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-salt\')"></a>\n <span translate>ACCOUNT.NEW.SALT_WARNING</span>\n </div>\n\n \x3c!-- salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.username.$invalid}">\n <span class="input-label" translate>LOGIN.SALT</span>\n <input name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required>\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.username.$error" ng-messages="saltForm.username.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.confirmSalt.$invalid}">\n <span class="input-label pull-right" translate>ACCOUNT.NEW.SALT_CONFIRM</span>\n <input name="confirmUsername" type="text" autocomplete="off" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username">\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.confirmUsername.$error" ng-messages="saltForm.confirmUsername.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.SALT_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n <i class="icon ion-arrow-right-a"></i>\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP: password--\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="passwordForm" novalidate="" ng-submit="doNext(\'passwordForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-password\')"></a>\n <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span>\n </div>\n\n <div class="list" ng-init="setForm(passwordForm, \'passwordForm\')">\n\n \x3c!-- password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.password.$invalid}">\n <span class="input-label" translate>LOGIN.PASSWORD</span>\n <input ng-if="!showPassword" name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required>\n <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" autocomplete="off" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required>\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.password.$error" ng-messages="passwordForm.password.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}">\n <span class="input-label" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span>\n <input ng-if="!showPassword" name="confirmPassword" type="password" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n <input ng-if="showPassword" name="confirmPassword" type="text" autocomplete="off" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.confirmPassword.$error" ng-messages="passwordForm.confirmPassword.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.PASSWORD_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n \x3c!-- Show values --\x3e\n <div class="item item-toggle dark">\n <span translate>COMMON.SHOW_VALUES</span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="showPassword">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n\n <div class="padding hidden-xs">\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP 5: profile --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="profileForm" novalidate="" ng-submit="doNext(\'profileForm\')">\n\n\n <div class="list" ng-init="setForm(profileForm, \'profileForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <span translate>MARKET.JOIN.PROFILE.WARNING</span>\n </div>\n\n \x3c!-- title --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': profileForm.$submitted && profileForm.title.$invalid}">\n <span class="input-label" translate>MARKET.JOIN.PROFILE.TITLE</span>\n <input name="title" type="text" placeholder="{{\'MARKET.JOIN.PROFILE.TITLE_HELP\' | translate}}" autocomplete="off" ng-model="formData.title" ng-minlength="4" ng-maxlength="100" required>\n </div>\n <div class="form-errors" ng-show="profileForm.$submitted && profileForm.title.$error" ng-messages="profileForm.title.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <ion-item class="item-input">\n <span class="input-label" translate>MARKET.JOIN.PROFILE.DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.JOIN.PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n </ion-item>\n\n \x3c!-- email --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': profileForm.$submitted && profileForm.email.$invalid}">\n <span class="input-label" translate>MARKET.JOIN.SUBSCRIPTION.EMAIL</span>\n <input name="email" type="text" placeholder="{{\'MARKET.JOIN.SUBSCRIPTION.EMAIL_HELP\' | translate}}" ng-model="formData.email" autocomplete="off" ng-pattern="emailPattern" ng-minlength="4" ng-maxlength="100">\n </div>\n <div class="form-errors" ng-show="profileForm.$submitted && profileForm.email.$error" ng-messages="profileForm.email.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.FIELD_NOT_EMAIL"></span>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!--<cs-extension-point name="last-slide"></cs-extension-point>--\x3e\n\n \x3c!-- STEP 6: last slide --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n\n <div class="padding text-center" translate>MARKET.JOIN.LAST_SLIDE_CONGRATULATION</div>\n\n <div class="list">\n\n <ion-item class="item item-text-wrap item-border">\n <div class="dark pull-right padding-right" ng-if="formData.computing">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n </ion-item>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" ng-click="doNewAccount()" translate>\n COMMON.BTN_SEND\n <i class="icon ion-android-send"></i>\n </button>\n </div>\n </ion-content>\n </ion-slide-page>\n\n \n</ion-slides></ion-modal-view>\n'),e.put("plugins/market/templates/login/modal_event_login.html",'<ion-modal-view class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <h1 class="title" translate>MARKET.EVENT_LOGIN.TITLE</h1>\n <div class="buttons buttons-right">\n <span class="secondary-buttons">\n <button class="button button-positive button-icon button-clear icon ion-android-done visible-xs" ng-click="doLogin()">\n </button>\n </span></div>\n\n </ion-header-bar>\n\n <ion-content>\n <form name="loginForm" novalidate="" ng-submit="doLogin()">\n\n\n <div class="list" ng-init="setForm(loginForm)">\n\n <div class="item item-text-wrap" ng-bind-html="\'MARKET.EVENT_LOGIN.HELP\' | translate">\n </div>\n\n \x3c!-- salt (=username, to enable browser login cache) --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}">\n <span class="input-label hidden-xs" translate>MARKET.EVENT_LOGIN.EMAIL_OR_PHONE</span>\n <input name="username" type="text" placeholder="{{\'MARKET.EVENT_LOGIN.EMAIL_OR_PHONE_HELP\' | translate}}" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" ng-pattern="usernamePattern" required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="MARKET.EVENT_LOGIN.ERROR.INVALID_USERNAME"></span>\n </div>\n </div>\n\n \x3c!-- password\n <label class="item item-input"\n ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span>\n <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}"\n ng-model="formData.password"\n ng-model-options="{ debounce: 650 }"\n select-on-click\n required>\n </label>\n <div class="form-errors"\n ng-show="form.$submitted && form.password.$error"\n ng-messages="form.password.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>--\x3e\n\n\n \x3c!-- remember me --\x3e\n <ion-checkbox ng-model="formData.rememberMe" class="item item-border-large ink">\n <div class="item-content" translate>MARKET.EVENT_LOGIN.REMEMBER_ME</div>\n </ion-checkbox>\n\n \x3c!-- Show public key\n <div class="item item-button-right left">\n <span ng-if="formData.username && formData.password"\n class="input-label" translate>COMMON.PUBKEY</span>\n <a class="button button-light button-small ink animate-if"\n ng-click="showPubkey()"\n ng-if="showPubkeyButton"\n >\n {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}\n </a>\n <h3 class="gray text-no-wrap" ng-if="!computing">\n {{pubkey}}\n </h3>\n <h3 ng-if="computing">\n <ion-spinner icon="android"></ion-spinner>\n </h3>\n </div>--\x3e\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_LOGIN\' | translate}}\n </button>\n </div>\n\n \x3c!-- Register ?\n <div class="text-center no-padding">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <a ng-click="showJoinModal()" translate>\n LOGIN.CREATE_ACCOUNT\n </a>\n </div>\n\n <div class="text-center no-padding">\n <a ng-click="showAccountSecurityModal()" translate>\n LOGIN.FORGOTTEN_ID\n </a>\n </div>--\x3e\n\n \x3c!--div class="padding hidden-xs text-right">\n <a class="assertive ink" ng-click="openNewAccount()" type="button" translate>COMMON.NO_ACOUNT_QUESTION\n </a>\n </div--\x3e\n </form>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/login/modal_login.html",'<ion-modal-view class="modal-full-height modal-login">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <h1 class="title" ng-bind-html="\'LOGIN.TITLE\' | translate">\n </h1>\n <div class="buttons buttons-right">\n <span class="secondary-buttons visible-xs">\n <button class="button button-positive button-icon button-clear icon ion-android-done" style="color: #fff" ng-click="doLogin()">\n </button>\n </span></div>\n\n </ion-header-bar>\n\n <ion-content>\n <form name="loginForm" novalidate="" ng-submit="doLogin()">\n\n\n <div class="list" ng-init="setForm(loginForm)">\n\n <div class="item item-text-wrap" ng-bind-html="\'MARKET.LOGIN.HELP\' | translate">\n </div>\n\n \x3c!-- salt (=username, to enable browser login cache) --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.SALT</span>\n <input name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-model="formData.username" autocomplete="off" ng-model-options="{ debounce: 650 }" class="highlight-light" required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- password --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span>\n <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-model-options="{ debounce: 650 }" select-on-click required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.password.$error" ng-messages="form.password.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n\n \x3c!-- remember me --\x3e\n <ion-checkbox ng-model="formData.rememberMe" class="item item-border-large ink">\n <div class="item-content" translate>MARKET.LOGIN.REMEMBER_ME</div>\n </ion-checkbox>\n\n \x3c!-- Show public key\n <div class="item item-button-right left">\n <span ng-if="formData.username && formData.password"\n class="input-label" translate>COMMON.PUBKEY</span>\n <a class="button button-light button-small ink animate-if"\n ng-click="showPubkey()"\n ng-if="showPubkeyButton"\n >\n {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}\n </a>\n <h3 class="gray text-no-wrap" ng-if="!computing">\n {{pubkey}}\n </h3>\n <h3 ng-if="computing">\n <ion-spinner icon="android"></ion-spinner>\n </h3>\n </div>--\x3e\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_LOGIN\' | translate}}\n </button>\n </div>\n\n \x3c!-- Register ? --\x3e\n <div class="text-center no-padding">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <a ng-click="showJoinModal()" translate>\n LOGIN.CREATE_ACCOUNT\n </a>\n </div>\n\n \x3c!--<div class="text-center no-padding">\n <a ng-click="showAccountSecurityModal()" translate>\n LOGIN.FORGOTTEN_ID\n </a>\n </div>--\x3e\n </form>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/record/edit_record.html",'<ion-view left-buttons="leftButtons" id="editMarket">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!loading && !id" translate>MARKET.EDIT.TITLE_NEW</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-clear button-icon icon visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n <div class="list {{::motion.ionListClass}}" ng-init="setForm(recordForm)">\n\n <div class="item hidden-xs item-text-wrap">\n <h1 ng-if="id" ng-bind-html="formData.title"></h1>\n <h1 ng-if="!id" translate>MARKET.EDIT.TITLE_NEW</h1>\n\n </div>\n <div class="item" ng-if="id||options.type.show">\n <h4 class="gray" ng-if="id">\n <i class="icon ion-calendar"></i>\n {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}} {{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced" ng-if="options.type.show" ng-class="{\'badge-editable\': options.type.canEdit}" ng-click="options.type.canEdit ? showRecordTypeModal() : \'\'">\n <span>{{\'MARKET.TYPE.\'+formData.type|upper|translate}}</span>\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n \x3c!-- category --\x3e\n <a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span> \n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" required>\n </div>\n <div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n <div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n </div>\n\n \x3c!-- price --\x3e\n <ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.price.$invalid}">\n\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.RECORD_PRICE_HELP\' | translate}}" ng-model="formData.price" number-float>\n <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px" ng-if="options.unit.canEdit" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n <b class="ion-arrow-down-b" style="font-size: 12pt"></b>\n </a>\n </ion-item>\n <div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n </div>\n\n \x3c!--dev class="item item-icon-right ink"\n ng-show="formData.price"\n ng-click="openCurrencyLookup()" >\n <span class="item-label gray" translate>MARKET.EDIT.RECORD_CURRENCY</span>\n <span class="badge badge-royal">{{formData.currency}}</span> \n <i class="gray icon ion-ios-arrow-right"></i>\n </dev--\x3e\n\n \x3c!-- fees --\x3e\n <div class="item item-input item-floating-label item-button-right" ng-if="formData.type==\'offer\'" ng-class="{\'item-input-error\': form.$submitted && form.fees.$invalid}">\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_FEES</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="fees" placeholder="{{::\'MARKET.EDIT.RECORD_FEES_HELP\' | translate}}" ng-model="formData.fees" number-float>\n <div class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px" ng-if="options.unit.canEdit">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n </div>\n </div>\n <div class="form-errors" ng-show="form.$submitted && form.fees.$invalid" ng-messages="form.fees.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n </div>\n\n \x3c!-- stock --\x3e\n <div class="item item-input item-floating-label item-button-right" ng-if="formData.type==\'offer\'" ng-class="{\'item-input-error\': form.$submitted && form.stock.$invalid}">\n <div class="input-label">{{::\'MARKET.EDIT.RECORD_STOCK\' | translate}}</div>\n\n <input type="number" name="stock" placeholder="{{::\'MARKET.EDIT.RECORD_STOCK_HELP\' | translate}}" ng-model="formData.stock" number-int>\n </div>\n <div class="form-errors" ng-show="form.$submitted && form.stock.$invalid" ng-messages="form.stock.$error">\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n </div>\n\n \x3c!-- position --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n\n \x3c!-- buttons --\x3e\n <div class="item padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/record/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>MARKET.TYPE.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm">\n \t<div class="list padding">\n <h3 translate>MARKET.TYPE.SELECT_TYPE</h3>\n <button class="button button-block button-stable icon icon-left cion-market-offer" ng-click="closeModal(\'offer\')" translate>MARKET.TYPE.OFFER</button>\n <button class="button button-block button-stable icon icon-left cion-market-need" ng-click="closeModal(\'need\')" translate>MARKET.TYPE.NEED</button>\n </div>\n</ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/record/popover_unit.html",'<ion-popover-view class="popover-unit">\n <ion-content scroll="false">\n <div class="list">\n <a class="item item-icon-left" ng-class="{ \'selected\': !useRelative}" ng-click="setUseRelative(false)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': !useRelative}"></i>\n <i ng-bind-html="formData.currency | currencySymbol:false"></i>\n </a>\n <a class="item item-icon-left" ng-class="{ \'selected\': $parent.useRelative}" ng-click="setUseRelative(true)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': useRelative}"></i>\n <i ng-bind-html="formData.currency | currencySymbol:true"></i>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/record/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>MARKET.VIEW.MENU_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n \x3c!--<a class="item item-icon-left assertive ink "\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>--\x3e\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="canSold" ng-click="sold()">\n <i class="icon ion-minus-circled"></i>\n {{\'MARKET.VIEW.BTN_SOLD_AD\' | translate}}\n </a>\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="canReopen" ng-click="reopen()">\n <i class="icon ion-unlocked"></i>\n {{\'MARKET.VIEW.BTN_REOPEN\' | translate}}\n </a>\n\n \x3c!-- Write to vendor --\x3e\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="!canEdit" ng-click="showNewMessageModal()">\n <i class="icon ion-compose"></i>\n {{\'MARKET.VIEW.BTN_WRITE_\'+formData.type |upper|translate}}\n </a>\n\n \x3c!-- Follow --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'follow\'})">\n <i class="icon" ng-class="{\'ion-android-notifications-off\': likeData.follows.wasHit, \'ion-android-notifications\': !likeData.follows.wasHit}"></i>\n <b class="ion-plus icon-secondary" ng-if="!likeData.follows.wasHit" style="font-size: 16px; left: 38px; top: -7px"></b>\n {{(!likeData.follows.wasHit ? \'MARKET.VIEW.BTN_FOLLOW\' : \'MARKET.VIEW.BTN_STOP_FOLLOW\' )| translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && !likeData.abuses.wasHit" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n\x3c!-- <b class="ion-plus icon-secondary" style="font-size: 16px; left: 38px; top: -7px;"></b>--\x3e\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses.wasHit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'abuse\'})">\n <i class="icon ion-android-warning"></i>\n <b class="ion-close icon-secondary" style="font-size: 16px; left: 38px; top: -7px"></b>\n {{\'COMMON.BTN_REMOVE_REPORTED_ABUSE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),
|
||
e.put("plugins/market/templates/record/view_record.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n <span translate>MARKET.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content class="grid">\n\n <div class="row no-padding">\n <div class="col col-15 hidden-xs hidden-sm hidden-md"> </div>\n\n <div class="col col-main no-padding">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list {{::motion.ionListClass}} item-text-wrap no-padding-xs">\n\n \x3c!-- desktop : title and location --\x3e\n <div class="item item-text-wrap hidden-xs hidden-sm" ng-if="!smallscreen">\n\n \x3c!-- title --\x3e\n <h1 ng-bind-html="formData.title"></h1>\n\n \x3c!-- location and category--\x3e\n <h2 class="gray">\n <a class="positive" ng-if="formData.city" ui-sref="app.market_lookup({location:formData.city, lat: formData.geoPoint && formData.geoPoint.lat, lon:formData.geoPoint && formData.geoPoint.lon})">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.category.name"> | </span>\n <a ng-if="formData.category.name" ui-sref="app.market_lookup({category:formData.category.id})">\n <i class="icon ion-flag"></i>\n <span ng-bind-html="::formData.category.name"></span>\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.uid})">\n <span ng-if="issuer.name||issuer.uid" class="positive">\n <i class="icon ion-person"></i>\n {{::issuer.name||issuer.uid}}\n </span>\n <span ng-if="!issuer.name && !issuer.uid" class="gray">\n <i class="icon ion-key"></i>\n {{::formData.issuer|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.creationTime|formatFromNow}}\n <span class="gray hidden-xs">|\n {{formData.creationTime | formatDate}}\n </span>\n </span>\n </h4>\n <h4 class="dark" ng-if="formData.time - formData.creationTime > 86400">\n <i class="icon ion-edit"></i>\n <span translate>MARKET.COMMON.LAST_UPDATE</span>\n <span>{{::formData.time | formatDate}}</span>\n </h4>\n \x3c!-- likes --\x3e\n <h4>\n <ng-include src="\'plugins/es/templates/common/view_likes.html\'"></ng-include>\n </h4>\n <div class="badge" ng-if="options.type.show" ng-class="{\'badge-energized\': formData.type == \'need\', \'badge-calm\': formData.type == \'offer\'}">\n <i class="cion-market-{{formData.type}}"></i>\n <span>{{\'MARKET.TYPE.\'+formData.type|upper|translate}}</span>\n </div>\n </div>\n\n \x3c!-- mobile: title and location --\x3e\n <div class="item item-text-wrap" ng-if="smallscreen">\n\n \x3c!-- title --\x3e\n <h1 ng-bind-html="formData.title"></h1>\n\n\n <h2 class="gray">\n <a class="positive" ng-if="formData.city" ui-sref="app.market_lookup({location:formData.location})">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::formData.city"></span>\n </a>\n <br>\n <a ng-if="formData.category.name" ui-sref="app.market_lookup({category:formData.category.id})">\n <i class="icon ion-flag"></i>\n <span ng-bind-html="::formData.category.name"></span>\n </a>\n\n </h2>\n <h4>\n <i class="icon ion-clock"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.uid})">\n <span class="positive" ng-if="issuer.name||issuer.uid">\n <i class="icon ion-person"></i>\n {{::issuer.name||issuer.uid}}\n </span>\n <span class="gray" ng-if="!issuer.name && !issuer.uid">\n <i class="icon ion-key"></i>\n {{::issuer.pubkey|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <span class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </span>\n </span>\n </h4>\n\n \x3c!-- likes --\x3e\n <h4>\n <ng-include src="\'plugins/es/templates/common/view_likes.html\'"></ng-include>\n </h4>\n\n \x3c!-- fab button--\x3e\n <div class="visible-xs visible-sm">\n\n \x3c!-- like --\x3e\n <button id="fab-like-market-record-{{id}}" class="button button-fab button-fab-top-right button-stable mini spin" ng-click="toggleLike($event)">\n <i class="icon ion-heart" ng-class="{\'gray\': !likeData.likes.wasHit, \'calm\': likeData.likes.wasHit}"></i>\n </button>\n\n </div>\n </div>\n\n\n \x3c!-- mobile: price --\x3e\n <div class="item visible-xs no-padding-top no-padding-bottom">\n\n <div class="badge badge-price" ng-class="::{\'badge-energized\': formData.type == \'need\', \'badge-calm\': formData.type == \'offer\'}" ng-if="formData.price">\n <i class="icon" ng-class="::{\'cion-market-need\': formData.type === \'need\', \'ion-pricetag\': formData.type === \'offer\'}"></i>\n <span ng-bind-html="::formData.price | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative} "></span>\n </div>\n <div class="badge badge-secondary" ng-if="formData.fees">\n <span class="dark">\n <i class="ion-plus" ng-if="::formData.price"></i>\n <ng-bind-html ng-bind-html="::formData.fees | formatAmount: {currency: formData.feesCurrency, useRelative: $root.settings.useRelative}"></ng-bind-html>\n </span>\n <span class="gray">{{\'MARKET.VIEW.RECORD_FEES_PARENTHESIS\'|translate}} | </span>\n <span class="gray">\n <i class="ion-pie-graph"></i>\n {{\'MARKET.VIEW.RECORD_STOCK\'|translate}}\n <ng-if ng-if="formData.stock > 0"><span class="dark">{{::formData.stock}}</span> <i class="ion-checkmark balanced"></i></ng-if>\n <ng-if ng-if="formData.stock === 0"><i class="ion-close assertive"></i> <span class="assertive bold" translate>MARKET.COMMON.SOLD</span></ng-if>\n </span>\n </div>\n <div class="badge badge-secondary badge-assertive" ng-if="!formData.fees&&!formData.stock">\n <i class="ion-close"></i> <span class="bold" translate>MARKET.COMMON.SOLD</span>\n </div>\n </div>\n\n\n\n \x3c!-- Buttons bar--\x3e\n <a id="record-share-anchor-{{id}}"></a>\n <div class="item large-button-bar hidden-xs hidden-sm">\n\n \x3c!-- Share button --\x3e\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n\n \x3c!-- Message button --\x3e\n <button class="button button-stable button-small-padding icon ion-compose" ng-if="!canEdit" ng-click="showNewMessageModal()" title="{{\'MARKET.VIEW.BTN_WRITE_\'+formData.type |upper|translate}}">\n </button>\n\n \x3c!-- Like button --\x3e\n <button class="button button-stable button-small-padding ink-dark" ng-if="!canEdit" title="{{\'COMMON.BTN_LIKE\' | translate }}" ng-click="toggleLike($event)">\n <i class="icon ion-heart" ng-class="{\'gray\': !likeData.likes.wasHit, \'calm\': likeData.likes.wasHit}"></i>\n </button>\n\n \x3c!--<button class="button button-stable icon-left ink-dark"\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>--\x3e\n <button class="button button-stable icon-left ink-dark" ng-if="canSold" title="{{\'MARKET.VIEW.BTN_SOLD_AD\' | translate}}" ng-click="sold()">\n <i class="icon ion-minus-circled"></i>\n {{\'MARKET.VIEW.BTN_SOLD\' | translate}}\n </button>\n <button class="button button-stable icon-left ink-dark" ng-if="canReopen" ng-click="reopen()">\n <i class="icon ion-unlocked"></i>\n {{\'MARKET.VIEW.BTN_REOPEN\' | translate}}\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-if="!canEdit" ng-click="showActionsPopover($event)">\n </button>\n\n </div>\n\n <ion-item class="item-text-wrap" ng-if="options.description.show && formData.description">\n <p class="text-italic">\n <i class="icon ion-quote"></i>\n <span trust-as-html="formData.description"></span>\n </p>\n </ion-item>\n\n <span class="item item-icon-left item-button-right hidden-xs" ng-if="formData.price||formData.fees">\n <ng-if ng-if="formData.price">\n <i class="calm icon ion-pricetag"></i>\n <h1 class="calm" ng-bind-html="::formData.price | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative}"></h1>\n </ng-if>\n <h3>\n <ng-if ng-if="formData.fees">\n <span class="dark">\n <i class="ion-plus" ng-if="::formData.price"></i>\n <ng-bind-html ng-bind-html="formData.fees | formatAmount: {currency: formData.feesCurrency, useRelative: $root.settings.useRelative}"></ng-bind-html>\n </span>\n <span class="gray">{{\'MARKET.VIEW.RECORD_FEES_PARENTHESIS\'|translate}} | </span>\n </ng-if>\n <span class="gray">\n <i class="ion-pie-graph"></i>\n {{\'MARKET.VIEW.RECORD_STOCK\'|translate}}\n <ng-if ng-if="formData.stock > 0"><span class="dark">{{::formData.stock}}</span> <i class="ion-checkmark balanced"></i></ng-if>\n <ng-if ng-if="formData.stock === 0"><i class="ion-close assertive"></i> <span class="assertive bold" translate>MARKET.COMMON.SOLD</span></ng-if>\n </span>\n </h3>\n </span>\n <span class="item hidden-xs" ng-if="!formData.price && !formData.fees && formData.stock === 0">\n <div class="badge badge-secondary badge-assertive"><i class="ion-close"></i> <span class="bold" translate>MARKET.COMMON.SOLD</span></div>\n </span>\n\n <div class="lazy-load">\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n </div>\n\n <div class="col col-33 hidden-xs hidden-sm hidden-md padding padding-top list" style="display: inline-block; max-width: 350px">\n\n \x3c!-- issuer card --\x3e\n <a class="item item-avatar card-meta item item-border-large dark-100-bg dark animate-ripple animate-show-hide ng-hide" ng-show="issuer.stars && !loading" ui-sref="app.wot_identity({pubkey: issuer.pubkey, uid: issuer.name})">\n <div class="item-text-wrap light">\n\n <i ng-if="!issuer.avatar" class="item-image icon ion-person"></i>\n <i ng-if="issuer.avatar" class="item-image avatar" style="background-image: url({{issuer.avatar.src}})"></i>\n\n <h3>\n <span ng-if="issuer.name||issuer.uid" class="positive">\n {{::issuer.name||issuer.uid}}\n </span>\n <span ng-if="!issuer.name&&!issuer.uid" class="gray">\n <b class="ion-key"></b>\n {{::issuer.pubkey|formatPubkey}}\n </span>\n </h3>\n\n <h3 class="align-right" title="{{\'WOT.VIEW.STARS\' | translate }}">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': issuer.stars.levelAvg > 3, \'assertive\': issuer.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= issuer.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > issuer.stars.levelAvg && value - 0.5 <= issuer.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > issuer.stars.levelAvg && value - 0.5 > issuer.stars.levelAvg"></b>\n </span><br>\n </h3>\n <h4 class="gray">{{issuer.stars.levelAvg}}/5 ({{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: issuer.stars }})</h4>\n </div>\n </a>\n\n\n\n \x3c!-- More similar ads --\x3e\n <div class="list list-more-record animate-ripple no-padding" ng-if="!search.loading && search.results.length">\n\n <div class="item item-divider" ng-if="!search.loading && search.results.length">\n <span translate>MARKET.VIEW.MORE_LIKE_THIS</span>\n </div>\n\n <ng-include ng-repeat="rec in search.results" src="\'plugins/market/templates/search/item_record.html\'">\n </ng-include>\n </div>\n </div>\n\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/search/item_record.html",'\n<div class="item no-padding">\n\n <a class="card card-record stable-bg ink" ng-click="showRecord($event, $index)">\n\n <div class="card-item item-text-wrap padding-right" ng-class="::{\'item-thumbnail-left\': rec.thumbnail, \'padding-left\': !rec.thumbnail}">\n <i class="item-image" ng-if="::rec.thumbnail" style="background-image: url(\'{{::rec.thumbnail.src}}\')"></i>\n <h2 class="padding-top" ng-bind-html="::rec.title | truncText:100"></h2>\n <h4 class="gray">\n <span class="positive" ng-if="::rec.location">\n <i class="icon ion-location"></i> {{::options.location.prefix|translate}}<span ng-bind-html="rec.location"></span>\n </span>\n <span ng-show="rec.time">\n <br ng-show="rec.location">\n <i class="icon ion-clock"></i> {{::rec.time | formatFromNow}}\n {{::\'MARKET.SEARCH.BY\'|translate}}\n <span class="dark">{{::rec.name || (rec.pubkey|formatPubkey)}}</span>\n </span>\n <span ng-if="rec.stock>1"><i class="icon ion-pie-graph"></i> {{::rec.stock}}</span>\n </h4>\n <div ng-if="rec.picturesCount > 1" class="badge badge-balanced badge-picture-count">{{::rec.picturesCount}} <i class="icon ion-camera"></i>\n </div>\n <div ng-if="rec.stock===0" class="badge badge-assertive">\n <small><i class="ion-close"></i>\n <span translate>MARKET.COMMON.SOLD</span></small>\n </div>\n\n </div>\n <div class="card-footer" style="height: 45px">\n <div class="badge badge-price badge-calm" ng-if="rec.type===\'offer\' && rec.price">\n <span ng-bind-html=":rebind:rec.price|formatAmount:{currency: rec.currency, useRelative: $root.settings.useRelative}"></span>\n </div>\n <div class="badge badge-calm" ng-if="rec.type==\'offer\' && !rec.price && options.type.show">\n <i class="cion-market-offer"></i>\n <span translate>MARKET.TYPE.OFFER_SHORT</span>\n </div>\n <div class="badge badge-energized" ng-if="rec.type==\'need\' && options.type.show">\n <i class="cion-market-need"></i>\n <span translate>MARKET.TYPE.NEED_SHORT</span>\n </div>\n </div>\n </a>\n\n</div>\n'),e.put("plugins/market/templates/search/list_records.html",' \x3c!-- result label --\x3e\n <div class="padding" style="display: block; height: 60px">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>MARKET.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>MARKET.SEARCH.RESULTS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n </div>\n </div>\n\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="padding assertive" ng-if="!search.loading && search.results.length===0 && search.advanced != null" translate>\n COMMON.SEARCH_NO_RESULT\n </div>\n\n <div class="list {{::motion.ionListClass}} no-padding" ng-if="!search.loading && search.results.length">\n\n <ng-include ng-repeat="rec in search.results" src="\'plugins/market/templates/search/item_record.html\'">\n </ng-include>\n </div>\n\n <ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n'),e.put("plugins/market/templates/search/list_records_lg.html",'\n<div class="padding-xs" style="display: block; height: 60px">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>MARKET.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>MARKET.SEARCH.RESULTS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && search.results.length===0 && search.advanced != null" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<div class="list {{::motion.ionListClass}} light-bg" ng-if="!search.loading && search.results.length">\n\n <a ng-repeat="rec in search.results track by rec.id" class="item item-record item-border-large ink padding-xs" ui-sref="app.market_view_record({id: rec.id, title: rec.urlTitle})">\n\n <div class="row row-record">\n <div class="col item-text-wrap item-thumbnail-left">\n <i ng-if="::rec.thumbnail" class="item-image" style="background-image: url({{::rec.thumbnail.src}})"></i>\n <i class="item-image ion-speakerphone" ng-if="::!rec.thumbnail"></i>\n <h2 ng-bind-html="rec.title"></h2>\n <h4 class="positive" ng-if="rec.city">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::rec.city"></span>\n <span class="gray" ng-if="::rec.distance">\n ({{::rec.distance|formatDecimal}} {{::geoUnit}})\n </span>\n </h4>\n <h4 class="gray" ng-if="rec.creationTime">\n <i class="icon ion-clock"></i>\n {{::rec.creationTime | formatFromNow}}\n {{::\'MARKET.SEARCH.BY\'|translate}}\n <span class="dark">{{::rec.name || (rec.pubkey|formatPubkey)}}</span>\n </h4>\n <span ng-if="::rec.picturesCount > 1" class="badge badge-balanced badge-picture-count">{{::rec.picturesCount}} <i class="icon ion-camera"></i></span>\n </div>\n <div class="col col-20" style="max-width: 180px">\n <h3 class="gray" ng-if="::rec.category" ng-bind-html="::rec.category.name"></h3>\n <h5 ng-if="::rec.stock>1" class="gray hidden-xs hidden-sm"><i class="icon ion-pie-graph"></i> <span class="">{{::rec.stock}} <i class="ion-checkmark balanced"></i></span></h5>\n <div class="badge badge-price" ng-if="::rec.price" ng-class="{\'badge-calm\': rec.type==\'offer\', \'badge-energized\': rec.type==\'need\'}">\n <i class="cion-market-{{rec.type}}"></i>\n <span ng-bind-html=":rebind:rec.price|formatAmount:{currency: rec.currency, useRelative: $root.settings.useRelative}"></span>\n </div>\n <div class="badge badge-price" ng-if="::!search.type && !rec.price" ng-class="::{\'badge-calm\': rec.type==\'offer\', \'badge-energized\': rec.type==\'need\'}">\n <i class="cion-market-{{::rec.type}}"></i>\n {{::\'MARKET.TYPE.\'+rec.type+\'_SHORT\'|upper|translate}}\n </div>\n </div>\n <div class="col hidden-sm hidden-xs">\n <h4 class="gray text-wrap text-italic" ng-if="::!!rec.description">\n <i class="icon ion-quote"></i>\n <span ng-bind-html="::rec.description | truncText:500"></span>\n </h4>\n <div ng-if="::!rec.stock" class="badge badge-assertive" translate>MARKET.COMMON.SOLD</div>\n </div>\n </div>\n </a>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/search/lookup.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span ng-if="entered && !search.category" translate>MARKET.SEARCH.TITLE</span>\n <span ng-if="search.category" ng-bind-html="search.category.name"></span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doRefresh()">\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-funnel visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content class="lookupForm" bind-notifier="{ rebind: $root.settings.useRelative }">\n\n <form ng-submit="doSearch()">\n\n <a ng-if="!search.category && options.category.show" class="item item-icon-right ink" ui-sref="app.market_categories">\n <span class="gray"> <i class="gray ion-android-funnel"></i> {{\'MARKET.SEARCH.BTN_SHOW_CATEGORIES\'|translate}}</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n </label>\n\n \x3c!-- location --\x3e\n <ng-include src="\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl" ng-init=""></ng-include>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n </form>\n\n \n\n \x3c!-- list of records --\x3e\n <ng-include src="\'plugins/market/templates/search/list_records.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-market-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus spin" ng-click="showNewRecordModal()">\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/search/lookup_actions_popover.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>MARKET.VIEW.MENU_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- last record --\x3e\n <a class="item item-icon-left ink" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'MARKET.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n\n \x3c!-- show closed Ads ? --\x3e\n <a class="item item-icon-left ink" ng-click="toggleShowClosed();">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.showClosed"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.showClosed"></i>\n <span translate>MARKET.SEARCH.SHOW_CLOSED_RECORD</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/search/lookup_lg.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span translate>MARKET.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="lookupForm padding no-padding-xs stable-100-bg" bind-notifier="{ rebind:$root.settings.useRelative }">\n\n <div class="padding-top hidden-xs hidden-sm" style="display: block; height: 60px">\n\n \x3c!-- show categories button --\x3e\n <div class="pull-left">\n <a class="button button-text button-small ink" ng-if="options.category.show" ng-class="{\'button-text-positive\': search.showCategories, \'button-text-dark\': !search.showCategories}" ng-click="search.showCategories=!search.showCategories;">\n <span translate>MARKET.SEARCH.BTN_SHOW_CATEGORIES</span>\n <i class="icon ion-arrow-down-b"></i>\n </a>\n </div>\n\n \x3c!-- new record button --\x3e\n <div class="pull-right">\n <button class="button button-small button-positive button-clear ink padding-right" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n {{\'MARKET.COMMON.BTN_NEW_AD\' | translate}}\n </button>\n </div>\n </div>\n\n \x3c!-- categories drop down --\x3e\n <div class="list dropdown-list" ng-mouseleave="search.showCategories=false;" ng-show="search.showCategories" scroll="true" ng-controller="MkListCategoriesCtrl" ng-init="load()">\n <div class="text-center" ng-show="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <ng-include class="no-border no-padding" ng-show="!loading" src="\'plugins/market/templates/category/list_categories_lg.html\'">\n </ng-include>\n </div>\n\n <form ng-submit="doSearch()">\n\n \x3c!-- search text --\x3e\n <div class="item no-padding light-bg">\n\n <div class="item-input light-bg">\n <div class="animate-show-hide ng-hide" ng-show="entered">\n\n \x3c!-- selected location --\x3e\n <div ng-show="!search.loading && search.geoPoint && search.location" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px">\n <i class="icon ion-location"></i>\n {{search.location.split(\',\')[0]}}\n <span ng-if="search.geoDistance">({{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: search.geoDistance} }})</span>\n <i class="icon ion-close" ng-click="removeLocation()"> </i>\n </div>\n\n \x3c!-- selected category --\x3e\n <div ng-show="search.category.name" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px">\n <i class="icon ion-flag"></i>\n {{\'MARKET.SEARCH.CATEGORY\'|translate}}\n <span ng-bind-html="search.category.name"></span>\n <i class="icon ion-close" ng-click="removeCategory()"> </i>\n </div>\n\n </div>\n\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" id="marketSearchText" ng-model="search.text" on-return="doSearch()">\n </div>\n\n </div>\n\n \x3c!-- location --\x3e\n <ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-if="entered && !search.geoPoint && options.location.show" ng-controller="ESSearchPositionItemCtrl"></ng-include>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n </form>\n\n <div ng-if="!search.loading && !search.category && options.category.show" class="padding-right visible-xs visible-sm" style="display: block; height: 35px">\n <a class="button button-text button-small button-text-positive pull-right ink" ui-sref="app.market_categories">\n <i class="icon ion-android-funnel"></i>\n {{\'MARKET.SEARCH.BTN_SHOW_CATEGORIES\' | translate}}\n </a>\n </div>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px">\n <div class="hidden-xs hidden-sm pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.advanced, \'button-text-stable\': !search.advanced}" ng-click="search.advanced=!search.advanced">\n {{\'MARKET.SEARCH.BTN_OPTIONS\' | translate}}\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n \n\n </div>\n\n <div class="hidden-xs hidden-sm pull-right">\n\n <a class="button button-text button-small ink icon ion-clock" ng-if="!options.type.show" ng-class="{\'button-text-positive\': search.type==\'last\'}" ng-click="doGetLastRecord()">\n {{\'MARKET.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n \n <a class="button button-text button-small ink icon cion-market-offer" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'offer\'}" ng-click="toggleAdType(\'offer\')">\n {{\'MARKET.SEARCH.BTN_OFFERS\' | translate}}\n </a>\n\n <a class="button button-text button-small ink icon cion-market-need" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'need\'}" ng-click="toggleAdType(\'need\')">\n {{\'MARKET.SEARCH.BTN_NEEDS\' | translate}}\n </a>\n \n <button class="button button-small button-stable ink" ng-click="doSearch()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n </div>\n </div>\n\n \x3c!-- list of records --\x3e\n <ng-include src="\'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-market-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-compose hidden-md hidden-lg spin" ng-click="showNewRecordModal()">\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/search/lookup_options.html",'\n\n \x3c!-- Show closed ad ? --\x3e\n <div ng-if="search.advanced" class="item item-icon-left item-input item-toggle stable-bg">\n <i class="icon ion-speakerphone gray"></i>\n <b class="icon-secondary ion-close-circled assertive" style="top:7px; left: 34px"></b>\n <span class="input-label item-icon-left-padding" ng-click="search.showClosed=!search.showClosed">\n {{\'MARKET.SEARCH.SHOW_CLOSED_RECORD\' | translate}}\n </span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="search.showClosed">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n \x3c!-- Show OLD ad ? --\x3e\n <div ng-if="search.advanced" class="item item-icon-left item-input item-toggle stable-bg">\n <i class="icon ion-clock gray"></i>\n <b class="icon-secondary ion-close-circled assertive" style="top:7px; left: 34px"></b>\n <span class="input-label item-icon-left-padding" ng-click="search.showOld=!search.showOld">\n {{\'MARKET.SEARCH.SHOW_OLD_RECORD\' | translate}}\n </span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="search.showOld">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n'),e.put("plugins/market/templates/wallet/view_wallet_extend.html",'\n\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n\n <ion-item class="item-icon-left item-text-wrap ink" ng-if="formData.profile.pubkey" copy-on-click="{{:rebind:formData.profile.pubkey}}">\n <i class="icon ion-card"></i>\n <span translate>MARKET.WALLET.DUNITER_PUBKEY</span>\n <h4 id="pubkey" class="dark text-left">{{:rebind:formData.profile.pubkey}}</h4>\n </ion-item>\n\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-help-outline positive"></i>\n <span ng-bind-html="\'MARKET.WALLET.DUNITER_ACCOUNT\'|translate:{currency:$root.currency.name}"></span>\n\n <h4 ng-if="formData.profile.pubkey" class="gray" translate>MARKET.WALLET.DUNITER_ACCOUNT_HELP</h4>\n <h4 ng-if="!formData.profile.pubkey" class="gray" translate>MARKET.WALLET.DUNITER_ACCOUNT_NO_PUBKEY_HELP</h4>\n </div>\n\n \x3c!-- star level --\x3e\n <div class="item item-icon-left item-text-wrap" ng-if="likeData.stars">\n\n <i class="icon" ng-class="{\'ion-android-star-outline\': likeData.stars.levelAvg <= 2, \'ion-android-star-half\': likeData.stars.levelAvg > 2 && likeData.stars.levelAvg <= 3, \'ion-android-star energized\': likeData.stars.levelAvg > 3}"></i>\n <span translate>WOT.VIEW.STARS</span>\n <h4 class="dark">{{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: likeData.stars }}</h4>\n\n <div class="badge">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': likeData.stars.levelAvg > 3, \'assertive\': likeData.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > likeData.stars.levelAvg && value - 0.5 <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > likeData.stars.levelAvg && value - 0.5 > likeData.stars.levelAvg"></b>\n </span>\n <small class="dark">({{likeData.stars.levelAvg}}/5)</small>\n </div>\n </div>\n\n <div class="visible-xs visible-sm">\n <div class="item item-divider item-divider-top-border">\n {{\'MENU.MARKET\' | translate}}\n </div>\n\n \x3c!-- market records --\x3e\n <a class="item item-icon-left item-icon-right" ui-sref="app.market_wallet_records">\n <i class="icon ion-speakerphone"></i>\n {{\'MENU.MY_RECORDS\' | translate}}\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n </div>\n\n</ng-if>\n'),e.put("plugins/market/templates/wallet/view_wallet_records.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>MENU.MY_RECORDS</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doSearch()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n \n\n <button class="button button-calm ink" ng-click="showNewRecordModal()">\n {{\'MARKET.COMMON.BTN_NEW_AD\' | translate}}\n </button>\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm" ng-class="::{\'padding-horizontal\': !smallscreen}">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n <button id="fab-wallet-add-market-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/wot/view_identity_extend.html",'\n\x3c!-- General section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n <ion-item class="item-icon-left item-text-wrap ink" ng-if="formData.profile.pubkey" copy-on-click="{{:rebind:formData.profile.pubkey}}">\n <i class="icon ion-card"></i>\n <span translate>MARKET.WOT.VIEW.DUNITER_PUBKEY</span>\n <h4 id="pubkey" class="dark text-left">{{:rebind:formData.profile.pubkey}}</h4>\n </ion-item>\n\n <div class="item item-icon-left item-text-wrap item-wallet-event">\n <i class="icon ion-ios-help-outline positive"></i>\n <span ng-bind-html="\'MARKET.WOT.VIEW.DUNITER_ACCOUNT\'|translate:{currency:$root.currency.name}"></span>\n <h4 class="gray" ng-if="formData.profile.pubkey" translate>MARKET.WOT.VIEW.DUNITER_ACCOUNT_HELP</h4>\n <h4 ng-if="!formData.profile.pubkey" trust-as-html="\'MARKET.WOT.VIEW.DUNITER_ACCOUNT_HELP_ASK_USER\'|translate"></h4>\n </div>\n</ng-if>\n\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n <div class="item item-divider item-divider-top-border">\n {{\'MENU.MARKET\' | translate}}\n </div>\n\n \x3c!-- market records --\x3e\n <a class="item item-icon-left item-icon-right" ui-sref="app.market_identity_records({pubkey: formData.pubkey})">\n <i class="icon ion-speakerphone"></i>\n {{\'MARKET.WOT.VIEW.BTN_RECORDS\' | translate}}\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n</ng-if>\n'),e.put("plugins/market/templates/wot/view_identity_records.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>MENU.MY_RECORDS</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doSearch()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm" ng-class="::{\'padding-horizontal\': !smallscreen}">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n</ion-view>\n')}]),angular.module("cesium.es.plugin",["cesium.es.services","cesium.es.app.controllers","cesium.es.common.controllers","cesium.es.settings.controllers","cesium.es.wot.controllers","cesium.es.wallet.controllers","cesium.es.profile.controllers","cesium.es.message.controllers","cesium.es.notification.controllers","cesium.es.registry.controllers","cesium.es.subscription.controllers","cesium.es.document.controllers","cesium.es.network.controllers"]),b.prototype.regexp={API_REGEXP:/^([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\/[^\/]+)?$/,LOCAL_IP_ADDRESS:/^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/},b.prototype.keyID=function(){var e=this.ep||this.getEP();return e.useBma?[this.pubkey||"Unknown",e.dns,e.ipv4,e.ipv6,e.port,e.useSsl,e.path].join("-"):[this.pubkey||"Unknown",e.ws2pid,e.path].join("-")},b.prototype.copyValues=function(e){var n=this;["version","currency","pub","endpoints","hash","status","block","signature"].forEach((function(t){e[t]=n[t]}))},b.prototype.copyValuesFrom=function(e){var n=this;["version","currency","pub","endpoints","block","signature"].forEach((function(t){n[t]=e[t]}))},b.prototype.json=function(){var e=this,n={};return["version","currency","endpoints","status","block","signature"].forEach((function(t){n[t]=e[t]})),n.raw=this.raw&&this.getRaw(),n.pubkey=this.pubkey,n},b.prototype.getEP=function(){if(this.ep)return this.ep;var e=null,n=this.regexp.API_REGEXP;return this.endpoints.forEach((function(t){var i=!e&&n.exec(t);i&&(e={api:i[1]||"",dns:i[2]||"",ipv4:i[3]||"",ipv6:i[4]||"",port:i[5]||80,path:i[6]||"",useSsl:443==i[5]})})),e||{}},b.prototype.getEndpoints=function(e){return e?("string"==typeof e&&(e=new RegExp("^"+e)),this.endpoints.reduce((function(n,t){return t.match(e)?n.concat(t):n}),[])):this.endpoints},b.prototype.hasEndpoint=function(e){var n=this.regexp[e]||new RegExp("^"+e),t=this.getEndpoints(n);return t&&t.length>0},b.prototype.hasEsEndpoint=function(){var e=this.getEsEndpoints();return e&&e.length>0},b.prototype.getEsEndpoints=function(){return this.getEndpoints(/^(ES_CORE_API|ES_USER_API|ES_SUBSCRIPTION_API|GCHANGE_API)/)},b.prototype.getDns=function(){var e=this.ep||this.getEP();return e.dns?e.dns:null},b.prototype.getIPv4=function(){var e=this.ep||this.getEP();return e.ipv4?e.ipv4:null},b.prototype.getIPv6=function(){var e=this.ep||this.getEP();return e.ipv6?e.ipv6:null},b.prototype.getPort=function(){var e=this.ep||this.getEP();return e.port?e.port:null},b.prototype.getHost=function(){var e=this.ep||this.getEP();return(443==e.port||e.useSsl)&&e.dns?e.dns:this.hasValid4(e)?e.ipv4:e.dns?e.dns:e.ipv6?"["+e.ipv6+"]":""},b.prototype.getURL=function(){var e=this.ep||this.getEP(),n=this.getHost();return(443==e.port||e.useSsl?"https":"http")+"://"+n+(e.port?":"+e.port:"")},b.prototype.getServer=function(){var e=this.ep||this.getEP(),n=this.getHost();return n+(n&&e.port?":"+e.port:"")},b.prototype.hasValid4=function(e){return!(!e.ipv4||e.ipv4.match(this.regexp.LOCAL_IP_ADDRESS))},b.prototype.isReachable=function(){return!!this.getServer()},b.prototype.isSsl=function(){return(this.ep||this.getEP()).useSsl},b.prototype.isTor=function(){return(this.ep||this.getEP()).useTor},b.prototype.isHttp=function(){return this.ep||this.getEP(),!bma.useTor},angular.module("cesium.es.services",["cesium.es.http.services","cesium.es.comment.services","cesium.es.social.services","cesium.es.settings.services","cesium.es.crypto.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.message.services","cesium.es.modal.services","cesium.es.wallet.services","cesium.es.subscription.services","cesium.es.geo.services","cesium.es.document.services","cesium.es.registry.services","cesium.es.network.services"]),angular.module("cesium.es.comment.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.profile.services"]).factory("esComment",["$rootScope","$q","UIUtils","BMA","esHttp","csWallet","csWot",function(e,n,t,i,a,o,s){return{instance:function(t){var i={commons:["issuer","creationTime","time","message","reply_to"]},r={index:t,fields:{commons:i.commons},raw:{search:a.post("/"+t+"/comment/_search"),remove:a.record.remove(t,"comment"),wsChanges:a.ws("/ws/_changes"),add:new a.record.post("/"+t+"/comment",{creationTime:!0}),update:new a.record.post("/"+t+"/comment/:id/_update",{creationTime:!0})}};return r.raw.refreshTreeLinks=function(e){return r.raw.addTreeLinks(e,!0)},r.raw.addTreeLinks=function(e,t){(e=e||{}).result=e.result||[],e.mapById=e.mapById||{};var o={};if(_.forEach(_.values(e.mapById),(function(n){if(n.reply_to&&!n.parent){var i=e.mapById[n.reply_to];i||(i=new T(n.reply_to),o[i.id]=n.id,e.mapById[i.id]=i),t&&i.containsReply(n)||i.addReply(n)}})),!_.size(o)){var s=n.defer();return s.resolve(e),s.promise}var l={query:{terms:{_id:_.keys(o)}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:0,size:1e3,_source:i.commons};return console.debug("[ES] [comment] Getting missing comments in tree"),r.raw.search(l).then((function(n){return n.hits.total?(_.forEach(n.hits.hits,(function(n){var t=e.mapById[n._id];t.copyFromJson(n._source),t.html=a.util.parseAsHtml(t.message),delete o[t.id]})),_.size(o)&&console.error("Comments has invalid [reply_to]: "+_.values(o).join(",")),r.raw.addTreeLinks(e)):(console.error("[ES] [comment] Comments has invalid [reply_to]: "+_.values(o).join(",")),e)}))},r.raw.loadDataByRecordId=function(e,n){(n=n||{}).from=n.from||0,n.size=n.size||20,n.loadAvatar=!angular.isDefined(n.loadAvatar)||n.loadAvatar,n.loadAvatarAllParent=!!angular.isDefined(n.loadAvatarAllParent)&&n.loadAvatar&&n.loadAvatarAllParent,n.size<0&&(n.size=1e3);var t={query:{term:{record:e}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:n.from,size:n.size,_source:i.commons},o={total:0,mapById:{},result:[],pendings:{}};return r.raw.search(t).then((function(e){return e.hits.total?(o.total=e.hits.total,o.result=e.hits.hits.reduce((function(e,n){var t=new T(n._id,n._source);return t.html=a.util.parseAsHtml(t.message),o.mapById[t.id]=t,e.concat(t)}),o.result),r.raw.addTreeLinks(o)):o})).then((function(){if(n.loadAvatar)return n.loadAvatarAllParent?s.extendAll(_.values(o.mapById),"issuer"):s.extendAll(o.result,"issuer")})).then((function(){return o.result=o.result.sort((function(e,n){return e.creationTime-n.creationTime})),o}))},r.raw.createOnDeleteListener=function(e){return function(n){var t=_.findIndex(e.result,{id:n.id});-1!==t&&(e.result.splice(t,1),delete e.mapById[n.id],o.isUserPubkey(n.issuer)&&r.raw.remove(n.id,o.data.keypair).catch((function(e){throw console.error(e),new Error("MARKET.ERROR.FAILED_REMOVE_COMMENT")})))}},r.raw.startListenChanges=function(n,i,l){(i=i||{}).result=i.result||[],i.mapById=i.mapById||{},i.pendings=i.pendings||{},l=l||e;var c=r.raw.createOnDeleteListener(i);_.forEach(i.result,(function(e){e.addOnRemoveListener(c)}));var u=Date.now();console.info("[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]".format(t,n.substr(0,8)));var d=a.websocket.changes(t+"/comment");return d.open().then((function(){console.debug("[ES] [comment] Websocket opened in {0} ms".format(Date.now()-u)),d.on((function(e){e&&l.$applyAsync((function(){var t=i.mapById[e._id];"DELETE"===e._operation?t&&t.remove():e._source&&e._source.record===n&&(t?(t.copyFromJson(e._source),t.html=a.util.parseAsHtml(t.message),r.raw.refreshTreeLinks(i)):i.pendings&&i.pendings[e._source.creationTime]||e._source.issuer==o.data.pubkey?console.debug("Skip comment received by WS (already in pending)"):((t=new T(e._id,e._source)).addOnRemoveListener(c),t.isnew=!0,t.html=a.util.parseAsHtml(t.message),i.mapById[e._id]=t,r.raw.refreshTreeLinks(i).then((function(){return s.extend(t,"issuer")})).then((function(){i.result.push(t)}))))}))}))}))},r.raw.save=function(e,n,t){(n=n||{}).result=n.result||[],n.mapById=n.mapById||{},n.pendings=n.pendings||{};var i,s=t.id,l={creationTime:s?t.creationTime||t.time:moment().utc().unix(),message:t.message,record:e,issuer:o.data.pubkey};return t.reply_to||t.parent?l.reply_to=t.reply_to||t.parent.id:l.reply_to=null,s?(i=n.mapById[s]).copy(t):((i=new T(null,l)).addOnRemoveListener(r.raw.createOnDeleteListener(n)),i.uid=o.data.uid,i.name=o.data.name,i.avatar=o.data.avatar,i.isnew=!0,t.parent&&t.parent.addReply(i),n.result.push(i)),i.html=a.util.parseAsHtml(i.message),s?r.raw.update(l,{id:s}).then((function(){return i})):(n.pendings=n.pendings||{},n.pendings[l.creationTime]=l,r.raw.add(l).then((function(e){return i.id=e,n.mapById[e]=i,delete n.pendings[l.creationTime],i})))},r.raw.stopListenChanges=function(e){console.debug("[ES] [comment] Stopping websocket on comments"),_.forEach(e.result,(function(e){e.cleanAllListeners()})),r.raw.wsChanges().close()},r.load=r.raw.loadDataByRecordId,r.save=r.raw.save,r.changes={start:r.raw.startListenChanges,stop:r.raw.stopListenChanges},r}}}]),angular.module("cesium.es.http.services",["ngResource","ngApi","cesium.services","cesium.config"]).factory("esHttp",["$q","$timeout","$rootScope","$state","$sce","$translate","$window","$filter","CryptoUtils","UIUtils","csHttp","csConfig","csSettings","csCache","BMA","csWallet","csPlatform","Api",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g,h,b){var f=!!("true"===d.httpsMode||!0===d.httpsMode||"force"===d.httpsMode||s.location&&"https:"===s.location.protocol);function T(i,a,s,T){var v,O,R=this,N={ES_USER_API:"ES_USER_API",ES_SUBSCRIPTION_API:"ES_SUBSCRIPTION_API",ES_USER_API_ENDPOINT:"ES_USER_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))",ANY_API_ENDPOINT:"([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\/[^\\/]+)?",MAX_UPLOAD_BODY_SIZE:d.plugins&&d.plugins.es&&d.plugins.es.maxUploadBodySize||2097152,GCHANGE_API:"GCHANGE_API",like:{KINDS:["VIEW","LIKE","DISLIKE","FOLLOW","ABUSE","STAR"]}},I={IMAGE_SRC:k("data:([A-Za-z//]+);base64,(.+)"),URL:P("(www\\.|https?://(www\\.)?)[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)"),HASH_TAG:P("(?:^|[\t\n\rs ])#([0-9_-\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)"),USER_TAG:P("(?:^|[\t\n\rs ])@("+E.constants.regexp.USER_ID+")"),ES_USER_API_ENDPOINT:k(N.ES_USER_API_ENDPOINT),API_ENDPOINT:k(N.ANY_API_ENDPOINT)},S=0,A=r("truncUrl");function C(e,n,t,i){!e&&p.data&&(e=e||(p.data.plugins&&p.data.plugins.es?p.data.plugins.es.host:null),n=n||(e?p.data.plugins.es.port:null),t=angular.isDefined(t)?t:443==n||p.data.plugins.es.useSsl||f),R.alive=!1,R.host=e,R.port=n||(t||f?443:80),R.useSsl=angular.isDefined(t)?t:443==R.port||f,R.server=u.getServer(e,n)}function D(e){if(!(e=e||p.data).plugins||!e.plugins.es)return!1;var n=e.plugins.es.host,t=443==e.plugins.es.port||e.plugins.es.useSsl||f;return L(n,e.plugins.es.port||(t?443:80),t)}function L(e,n,t){return R.host===e&&R.port===n&&(angular.isUndefined(t)||t==R.useSsl)}function y(e){R.data.isFallback=e}function k(e){return new RegExp("^"+e+"$")}function P(e){return new RegExp(e)}function M(n,t){return t=t||e.defer(),R.data.isFallback&&R.started&&R.stop(),R.data.isFallback=!1,O=null,t.resolve(n),t.promise}function w(e,n){for(var t="@"===(n=n||"#")?I.USER_TAG:I.HASH_TAG,i=e&&t.exec(e),a=i&&[];i;){var o=i[1];_.contains(a,o)||a.push(o),i=(e=e.substr(i.index+i[1].length+1)).length>0&&t.exec(e)}return a}function U(n,t){t=t||{};var i=R.post(n);return function(n,a){if(!g.isLogin())return e.reject("Wallet must be login before sending record to ES node");t.creationTime&&!n.creationTime&&(n.creationTime=moment().utc().unix());var o=moment().utc().unix();n.time=!n.time||n.time<o?o:n.time+1;var s=g.data.keypair,r=angular.copy(n);delete r.signature,delete r.hash,r.issuer=g.data.pubkey,r.version||(r.version=2),t.tagFields&&function(e,n){n=n||["title","description"],e.tags=n.reduce((function(n,t){var i=e[t],a=i&&w(i);return a?n.concat(a):n}),[])}(r,t.tagFields);var c=JSON.stringify(r);return l.util.hash(c).then((function(e){return l.sign(e,s).then((function(n){return c='{"hash":"{0}","signature":"{1}",'.format(e,n)+c.substring(1),i(c,a).then((function(e){return m.clear("esHttp-"),e})).catch((function(e){var n=R.byteCount(r);if(n>N.MAX_UPLOAD_BODY_SIZE)throw{message:"ERROR.ES_MAX_UPLOAD_BODY_SIZE",length:n};throw e}))}))}))}}function x(n,t){return function(i){if(!g.isLogin())return e.reject("Wallet must be login before sending record to ES node");var a={version:2,index:n,type:t,id:i,issuer:g.data.pubkey,time:moment().utc().unix()},o=JSON.stringify(a);return l.util.hash(o).then((function(e){return l.sign(e,g.data.keypair).then((function(n){return o='{"hash":"{0}","signature":"{1}",'.format(e,n)+o.substring(1),R.post("/history/delete")(o).then((function(e){return e}))}))}))}}function B(n,t){var i=U("/{0}/{1}/:id/_like".format(n,t));return function(a,o){if((o=o||{}).kind=o.kind&&o.kind.toUpperCase()||"LIKE",!g.isLogin())return e.reject("Wallet must be login before sending record to ES node");var s={version:2,index:n,type:t,id:a,kind:o.kind};return o.comment&&(s.comment=o.comment),angular.isDefined(o.level)&&(s.level=o.level),i(s)}}R.data={isFallback:!1},R.cache={getByPath:{},postByPath:{},wsByPath:{}},R.api=new b(this,"esHttp"),R.started=!1,R.init=C,C(i,a,s),R.useCache=!!angular.isDefined(T)&&T,R.cleanCache=function(){console.debug("[ES] [http] Cleaning requests cache..."),_.keys(R.cache.wsByPath).forEach((function(e){R.cache.wsByPath[e].close()})),R.cache={getByPath:{},postByPath:{},wsByPath:{}},m.clear("esHttp-")},R.copy=function(e){return R.started&&R.stop(),R.init(e.host,e.port,e.useSsl||443==e.port),R.data.isTemporary=!1,R.start(!0)},R.date={now:u.date.now},R.byteCount=function(e){return e="string"==typeof e?e:JSON.stringify(e),encodeURI(e).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length-1},R.getUrl=function(e){return u.getUrl(R.host,R.port,e,R.useSsl)},R.get=function(n,t){t=R.useCache&&t;var i=n+(t?"#"+t:""),a=function(o){if(!R.started)return R._startPromise||console.warn("[ES] [http] Trying to get [{0}] before start(). Waiting...".format(n)),R.ready().then((function(n){return n?a(o):e.reject("ERROR.ES_CONNECTION_ERROR")}));var s=R.cache.getByPath[i];return s||(s=t?u.getWithCache(R.host,R.port,n,R.useSsl,t,null,null,"esHttp-"):u.get(R.host,R.port,n,R.useSsl),R.cache.getByPath[i]=s),s(o)};return a},R.post=function(n){var t=function(i,a){if(!R.started)return R._startPromise||console.error("[ES] [http] Trying to post [{0}] before start()...".format(n)),R.ready().then((function(n){return n?t(i,a):e.reject("ERROR.ES_CONNECTION_ERROR")}));var o=R.cache.postByPath[n];return o||(o=u.post(R.host,R.port,n,R.useSsl),R.cache.postByPath[n]=o),o(i,a)};return t},R.ws=function(e){return function(){var n=R.cache.wsByPath[e];return n&&!n.isClosed()||((n=u.ws(R.host,R.port,e,R.useSsl)).onclose=function(){delete R.cache.wsByPath[e]},R.cache.wsByPath[e]=n),n}},R.wsChanges=function(e){var n=R.ws("/ws/_changes")();if(!e)return n;var t=n.open;return n.open=function(){return t.call(n).then((function(n){n?n.send(e):console.warn("Trying to access ws changes, but no sock anymore... already open ?")}))},n},R.isAlive=function(){return u.get(R.host,R.port,"/node/summary",R.useSsl)().then((function(e){var n=e&&e.duniter&&e.duniter.software||"unknown";return"gchange-pod"===n||"cesium-plus-pod"===n||(console.error("[ES] [http] Not a Gchange Pod, but a {0} node. Please check '/summary/node'".format(n)),!1)})).catch((function(){return!1}))},R.checkNodeAlive=function(e){if(e)return y(!D()),!0;if(angular.isUndefined(e))return R.isAlive().then(R.checkNodeAlive);var n=p.data.plugins&&p.data.plugins.es||{};O=O||{host:n.host,port:n.port};var t=n.fallbackNodes&&S<n.fallbackNodes.length&&n.fallbackNodes[S++];if(!t)return o("ERROR.ES_CONNECTION_ERROR",{server:R.server}).then(c.alert.info),!1;var i=u.getServer(t.host,t.port);return c.loading.hide(),o("CONFIRM.ES_USE_FALLBACK_NODE",{old:R.server,new:i}).then(c.alert.confirm).then((function(e){return!!e&&(R.cleanCache(),R.init(t.host,t.port,t.useSsl||443==t.port),R.isAlive().then(R.checkNodeAlive))}))},R.isStarted=function(){return R.started},R.ready=function(){return R.started?e.when(!0):R._startPromise||R.start()},R.start=function(n){return R._startPromise?R._startPromise:R.started?e.when(R.alive):(R._startPromise=h.ready().then((function(){n||R.init()})).then((function(){console.debug("[ES] [http] Starting on [{0}]{1}...".format(R.server,R.useSsl?" (SSL on)":""));var e=Date.now();return R.checkNodeAlive().then((function(n){return R.alive=n,n?(v=[p.api.data.on.reset(t,M,R)],console.debug("[ES] [http] Started in "+(Date.now()-e)+"ms"),R.api.node.raise.start(),R.started=!0,delete R._startPromise,S=0,!0):(console.error("[ES] [http] Could not start [{0}]: node unreachable".format(R.server)),R.started=!0,delete R._startPromise,S=0,!1)}))})),R._startPromise)},R.stop=function(){return console.debug("[ES] [http] Stopping..."),_.forEach(v,(function(e){e()})),v=[],y(!1),delete R._startPromise,R.alive?(R.cleanCache(),R.alive=!1,R.started=!1,R.api.node.raise.stop()):R.started=!1,e.when()},R.restart=function(){return R.stop(),n(R.start,200)},R.image={},R.image.fromHit=function(e,n){if(e&&e._source){var t=e._source[n];if(t&&t._content_type&&t._content_type.startsWith("image/")){var i={};if(t._content)i.src="data:"+t._content_type+";base64,"+t._content;else{var a=t._content_type.substr(6),o=[e._index,e._type,e._id,"_image",n].join("/");o="/"+o+"."+a,i.src=R.getUrl(o)}return t._title&&(i.title=t._title),t._name&&(i.name=t._name),i}}},R.api.registerEvent("node","start"),R.api.registerEvent("node","stop");var F={getServer:u.getServer,node:{summary:R.get("/node/summary"),parseEndPoint:function(e){var n=I.API_ENDPOINT.exec(e);if(n)return{api:n[1]||"",dns:n[2]||"",ipv4:n[3]||"",ipv6:n[4]||"",port:n[5]||80,path:n[6]||"",useSsl:443==n[5]}},same:L,sameAsSettings:D,isFallback:function(){return R.data.isFallback}},websocket:{changes:R.wsChanges,block:R.ws("/ws/block"),peer:R.ws("/ws/peer")},wot:{member:{uids:R.get("/wot/members")}},network:{peering:{self:R.get("/network/peering")},peers:R.get("/network/peers")},record:{post:U,remove:x,count:function(e,n,t){var i=R.get("/{0}/{1}/_search?size=0".format(e,n),t);return function(e){return i(e).then((function(e){return e&&e.hits&&e.hits.total}))}}},like:{toggle:function(n,t){var i=function(e,n){var t=R.get("/like/record/_search?_source=false&q=:q"),i="index:{0} AND type:{1} AND id:".format(e,n);return function(e,n){(n=n||{}).kind=n.kind||"LIKE";var a=i+e;return n.kind&&(a+=" AND kind:"+n.kind.toUpperCase()),n.issuer&&(a+=" AND issuer:"+n.issuer),t({q:a}).then((function(e){return(e&&e.hits&&e.hits.hits||[]).map((function(e){return e._id}))}))}}(n,t),a=B(n,t),o=x("like","record");return function(n,t){return(t=t||{}).kind=t.kind||"LIKE",g.isLogin()?i(n,{kind:t.kind,issuer:g.data.pubkey}).then((function(i){return i&&i.length?e.all(_.map(i,(function(e){return o(e)}))).then((function(){return-1*i.length})):a(n,t).then((function(){return 1}))})):e.reject("Wallet must be login before sending record to ES node")}},add:B,remove:function(e,n){var t=x("like","record");return function(e){if(e)return t(e)}},count:function(e,n){var t=R.post("/like/record/_search");return function(i,a){(a=a||{}).kind=a.kind&&a.kind.toUpperCase()||"LIKE",a.level=angular.isDefined(a.level)?a.level:"STAR"===a.kind;var o={query:{bool:{filter:[{term:{index:e}},{term:{type:n}},{term:{id:i}},{term:{kind:a.kind.toUpperCase()}}]}},size:0};return a.issuer&&(o.query.bool.should={term:{issuer:a.issuer}},o.size=1,o._source=["issuer"]),a.level&&(o.aggs={level_sum:{sum:{field:"level"}}},o._source=o._source||[],o._source.push("level")),t(o).then((function(e){var n=e&&e.hits,t=n&&a.issuer?_.findIndex(n.hits,(function(e){return e._source.issuer===a.issuer})):-1,i={total:n&&n.total||0,wasHit:-1!==t||!1,wasHitId:-1!==t&&n.hits[t]._id||!1};return a.level&&(i.level=-1!==t?n.hits[t]._source.level:void 0,i.levelSum=e.aggregations&&e.aggregations.level_sum.value||0,i.levelAvg=i.total&&Math.floor(10*(i.levelSum/i.total+.5))/10-.5||0),i}))}}},image:{fromAttachment:function(e){if(!e||!e._content_type||!e._content||0===e._content.length)return null;var n={src:"data:"+e._content_type+";base64,"+e._content};return e._title&&(n.title=e._title),e._name&&(n.name=e._name),n},toAttachment:function(e){if(!e||!e.src)return null;var n=I.IMAGE_SRC.exec(e.src);if(!n)return null;var t={_content_type:n[1],_content:n[2]};return e.title&&(t._title=e.title),e.name&&(t._name=e.name),t}},hit:{empty:function(){return{_id:null,_index:null,_type:null,_version:null,_source:{}}}},util:{parseTags:w,parseAsHtml:function(e,n){var t=e?function(e){return e?e.replace(/</g,"<").replace(/>/g,">"):e}(e.trim()):void 0;if(t){(n=n||{}).tagState=n.tagState||"app.wot_lookup",n.uidState=n.uidState||"app.wot_identity_uid",!n.newLine&&angular.isDefined(n.newLine)||(t=t.replace(/\n/g,"<br>\n"));var i=function(e){for(var n=e&&I.URL.exec(e),t=n&&[];n;){var i=n[0];_.contains(t,i)||t.push(i),n=(e=e.substr(n.index+n[0].length+1))&&I.URL.exec(e)}return t}(t);_.forEach(i,(function(e){var n=e.startsWith("http://")||e.startsWith("https://")?e:"http://"+e,i='<a on-tap="openLink($event, \'{0}\')" href="{1}" target="_blank">{2}</a>'.format(n,n,A(e));t=t.replace(e,i)}));var a=w(t);_.forEach(a,(function(e){var i="<a ui-sref=\"{0}({hash: '{1}'})\">#{2}</a>".format(n.tagState,e,e);t=t.replace("#"+e,i)}));var o=w(t,"@");_.forEach(o,(function(e){var i="<a ui-sref=\"{0}({uid: '{1}'})\">@{2}</a>".format(n.uidState,e,e);t=t.replace("@"+e,i)}));var s=function(e,n,t){for(var i=P("(?:^|[\\r\\s])("+(n=n||"##")+"([^#></]+)<br>)"),a=e&&i.exec(e),o=a&&[],s=a&&[];a;){var r=a[1];_.contains(o,r)||(o.push(r),s.push({line:r,title:a[2]})),a=(e=e.substr(a.index+a[1].length+1)).length>0&&i.exec(e)}return s}(t,"#+[ ]*");_.forEach(s,(function(e){var n=e.line.lastIndexOf("#",5)+1;t=t.replace(e.line,"<h{0}>{1}</h{2}>".format(n,e.title,n))}))}return t},findObjectInTree:function e(n,t){if(n)return n[t]?n[t]:Array.isArray(n)?n.reduce((function(n,i){return n||e(i,t)}),!1):"object"==typeof n?_.reduce(_.keys(n),(function(i,a){return i||e(n[a],t)}),!1):void 0}},cache:u.cache,constants:N};F.constants.regexp=I,angular.merge(R,F)}f&&console.debug("[ES] [https] Enable SSL (forced by config or detected in URL)");var v=new T(void 0,void 0,void 0,!0);return v.instance=function(e,n,t,i){return new T(e,n,t,i)},v.lightInstance=function(e,n,t,i){function a(t,i){return u.get(e,n,t)(i).then((function(e){return e&&e.hits&&e.hits.total}))}return n=n||80,t=angular.isDefined(t)?t:443==+n,{host:e,port:n,useSsl:t,node:{summary:u.getWithCache(e,n,"/node/summary",t,u.cache.LONG,!1,i)},network:{peering:{self:u.get(e,n,"/network/peering",t,i)},peers:u.get(e,n,"/network/peers",t,i)},blockchain:{current:u.get(e,n,"/blockchain/current?_source=number,hash,medianTime",t,i)},record:{count:function(e,n){return a("/{0}/{1}/_search?size=0".format(e,n))}},subscription:{count:function(e){return a("/subscription/record/_search?size=0&q="+_.keys(e||{}).reduce((function(n,t){return(n&&n+" AND "||"")+t+":"+e[t]}),""))}}}},v}]),angular.module("cesium.es.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esSettings")}]).factory("esSettings",["$rootScope","$q","$timeout","Api","esHttp","csConfig","csSettings","CryptoUtils","Device","UIUtils","csWallet",function(e,n,t,i,a,o,s,r,l,c,u){var d,p,m={includes:["locale","useRelative","useLocalStorage","expertMode","logoutIdle"],excludes:["newIssueVersion","timeout","cacheTimeMs","time","login","build"],plugins:{es:{excludes:["enable","host","port","useSsl","fallbackNodes","minVersion","document","maxUploadBodySize","defaultCountry"],notifications:{}}},helptip:{excludes:["installDocUrl"]}},E=angular.merge({plugins:{es:{askEnable:!1,notifications:{readTime:!0,txSent:!0,txReceived:!0,certSent:!0,certReceived:!0},invitations:{readTime:!0},defaultCountry:void 0,enableGoogleApi:!1,googleApiKey:void 0,wot:{enableMixedSearch:!0},geoDistance:"20km"}}},{plugins:{es:{minVersion:"1.2.0",document:{index:"user",type:"profile"}}}},{plugins:{es:o.plugins&&o.plugins.es||{}}}),g=this,h=new i("esSettings"),b=!1;function f(e,t){return t=t||n.defer(),angular.merge(e,E),t.resolve(e),t.promise}function T(e,i){return i=i||n.defer(),e&&e.pubkey&&e.keypair?r.isLoaded()?(console.debug("[ES] [settings] Loading user settings..."),(a=e.pubkey,o=e.keypair,l=Date.now(),n.all([r.box.keypair.fromSignKeypair(o),g.get({id:a}).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))]).then((function(e){var n=e[0];if((e=e[1])&&e._source){var t=e._source;if(t.time!==s.data.time){var i=r.util.decode_base58(t.nonce);return r.box.open(t.content,i,n.boxPk,n.boxSk).then((function(e){var n=JSON.parse(e||"{}");return n.time=t.time,console.debug("[ES] [settings] Loaded user settings in "+(Date.now()-l)+"ms"),n})).catch((function(e){return console.error("[ES] [settings] Could not read stored settings: "+(e&&e.message||"decryption error")),delete s.data.time,null}))}console.debug("[ES] [settings] Loaded user settings in "+(Date.now()-l)+"ms (no update need)")}}))).then((function(e){if(e)return angular.merge(s.data,e),d=e,console.debug("[ES] [settings] Successfully load settings from ES"),O()})).then((function(){i.resolve(e)})).catch((function(e){i.reject(e)})),i.promise):(console.debug("[ES] [settings] Waiting crypto lib loading..."),t((function(){return T(e,i)}),50)):(i.resolve(),i.promise);var a,o,l}function v(e){if(!b){var i=p&&p.length>0;R();var o=g.isEnable();u.isLogin()&&(!i&&o?T(u.data):function e(i){if(!u.isLogin())return n.when();var o=function e(n,t){var i={};return t.includes&&_.forEach(_.keys(t),(function(e){"includes"!==e&&"excludes"!==e&&t.includes.push(e)})),_.forEach(_.keys(n),(function(a){t.includes&&!_.contains(t.includes,a)||t.excludes&&_.contains(t.excludes,a)||(n[a]&&"object"==typeof n[a]&&t[a]&&"object"==typeof t[a]?i[a]=e(n[a],t[a]):i[a]=n[a])})),i}(i,m);if(d&&angular.equals(o,d))return n.when();if(!r.isLoaded())return console.debug("[ES] [settings] Waiting crypto lib loading..."),t((function(){return e()}),50);var l=a.date.now();return console.debug("[ES] [settings] Saving user settings... at time "+l),n.all([r.box.keypair.fromSignKeypair(u.data.keypair),r.util.random_nonce()]).then((function(e){var n=e[0],t=e[1],a={issuer:u.data.pubkey,nonce:r.util.encode_base58(t),time:l},s=JSON.stringify(o);return r.box.pack(s,t,n.boxPk,n.boxSk).then((function(e){return a.content=e,i.time?g.update(a,{id:a.issuer}):g.add(a)}))})).then((function(){return s.data.time=l,d=o,console.debug("[ES] [settings] Saved user settings in "+(a.date.now()-l)+"ms"),O()})).catch((function(e){throw console.error(e),e}))}(e))}}function O(){return b?n.when():(b=!0,s.store().then((function(){b=!1})).catch((function(e){throw b=!1,e})))}function R(){var n=g.isEnable();return!n&&p&&p.length>0?(console.debug("[ES] [settings] Disable"),_.forEach(p,(function(e){e()})),p=[],a.stop().then((function(){h.state.raise.changed(n)}))):!n||p&&0!==p.length?void 0:a.start().then((function(t){if(t){if(console.debug("[ES] [settings] Enable"),function(){p=[s.api.data.on.reset(e,f,this),u.api.data.on.login(e,T,this)]}(),u.isLogin())return T(u.data).then((function(){h.state.raise.changed(n)}));h.state.raise.changed(n)}else console.error("[ES] node could not be started !!")}))}return g.api=h,g.get=a.get("/user/settings/:id"),g.add=a.record.post("/user/settings"),g.update=a.record.post("/user/settings/:id/_update"),g.isEnable=function(){return s.data.plugins&&s.data.plugins.es&&s.data.plugins.es.enable&&!!s.data.plugins.es.host},g.setPluginSaveSpecs=function(e,n){e&&n&&(m.plugins[e]=angular.copy(n))},h.registerEvent("state","changed"),s.ready().then((function(){return s.api.data.on.changed(e,v,this),a.api.node.on.stop(e,(function(){d=null}),this),R()})),g}]),angular.module("cesium.es.social.services",["cesium.es.crypto.services"]).factory("SocialUtils",["$filter","$q","CryptoUtils","BMA","csWallet","esCrypto",function(e,n,t,i,a,o){function s(){var s={URI:"([a-zA−Z0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",EMAIL:"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",PHONE:"[+]?[0-9. ]{9,15}",socials:{facebook:"https?://((fb.me)|((www.)?facebook.com))",twitter:"https?://(www.)?twitter.com",googleplus:"https?://plus.google.com(/u)?",youtube:"https?://(www.)?youtube.com",github:"https?://(www.)?github.com",tumblr:"https?://(www.)?tumblr.com",snapchat:"https?://(www.)?snapchat.com",linkedin:"https?://(www.)?linkedin.com",vimeo:"https?://(www.)?vimeo.com",instagram:"https?://(www.)?instagram.com",wordpress:"https?://([a-z]+)?wordpress.com",diaspora:"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org",duniter:"duniter://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",bitcoin:"bitcoin://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",curve25519:"curve25519://("+i.constants.regexp.PUBKEY+"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)"}};function r(e){return new RegExp("^"+e+"$")}function l(e){var n;if(s.URI.test(e)){var t=s.URI.exec(e)[1],i=e;if("http"==t||"https"==t){var a=e.indexOf("/",t.length+3);a>0&&(i=e.substring(0,a))}_.keys(s.socials).forEach((function(e){if(s.socials[e].test(i))return n=e,!1})),n||(n="web")}else s.EMAIL.test(e)?n="email":s.PHONE.test(e)&&(n="phone");return n||console.warn("[ES] [social] Unable to detect type of social URL: "+e),n}function c(e){if((e=e?e.trim():e)&&e.length>0)return e.startsWith("www.")&&(e="http://"+e),{type:l(e),url:e}}function u(n){if(!n||!n.length)return[];var t={};return n.forEach((function(n){if("curve25519"==n.type?(delete n.issuer,n.valid&&angular.merge(n,c(n.url))):n=c(n.url),n){var i=e("formatSlug")(n.url);t[i]=n}})),_.values(t)}return s.URI=r(s.URI),s.EMAIL=r(s.EMAIL),s.PHONE=r(s.PHONE),_.keys(s.socials).forEach((function(e){s.socials[e]=r(s.socials[e])})),{get:c,reduce:u,createForEncryption:function(e,n){return{recipient:e,type:"curve25519",url:n}},open:function e(i,r,l){if(l=l||a.data.pubkey,!t.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),$timeout((function(){return e(i,r,l)}),100);var c=_.filter(i||[],(function(e){var n=e.url&&"curve25519"==e.type&&s.socials.curve25519.exec(e.url);return!!n&&(e.recipient=n[1],e.nonce=n[2],e.url=n[3],e.issuer=r,e.valid=e.recipient===l,e.valid)}));return c.length?o.box.open(c,void 0,"issuer","url").then((function(){return u(i)})):n.when(u(i))},pack:function e(i){if(!t.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),$timeout((function(){return e(i)}),100);var a=_.filter(i||[],(function(e){return"curve25519"==e.type&&e.url&&e.recipient}));return a.length?t.util.random_nonce().then((function(e){return n.all(a.reduce((function(n,t){return n.concat(o.box.pack(t,void 0,"recipient","url",e))}),[]))})).then((function(e){return e.reduce((function(e,n){return e.concat({type:"curve25519",url:"curve25519://{0}:{1}@{2}".format(n.recipient,n.nonce,n.url)})}),[])})):n.when(i)}}}var r=s();return r.instance=s,r}]),angular.module("cesium.es.crypto.services",["ngResource","cesium.services"]).factory("esCrypto",["$q","$rootScope","CryptoUtils",function(e,n,t){function i(n){if(!n)throw new Error("Missing keypair");return n.boxPk&&n.boxSk?e.when(n):e.all([t.box.keypair.skFromSignSk(n.signSk),t.box.keypair.pkFromSignPk(n.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{box:{getKeypair:i,pack:function(n,a,o,s,r){if(!n[o=o||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(s=s||"content")&&(s=[s]),n=angular.copy(n);var l=t.util.decode_base58(n[o]);return e.all([i(a),t.box.keypair.pkFromSignPk(l),r?e.when(r):t.util.random_nonce()]).then((function(i){var a=i[0].boxSk,o=i[1],r=i[2];return e.all(s.reduce((function(e,i){return n[i]?e.concat(t.box.pack(n[i],r,o,a)):e}),[])).then((function(e){var i=0;return _.forEach(s,(function(t){n[t]?n[t]=e[i++]:n[t]=null})),n.nonce=t.util.encode_base58(r),n}))}))},open:function(n,a,o,s){o=o||"issuer","string"==typeof(s=s||"content")&&(s=[s]);var r=(new Date).getTime(),l={},c=[i(a)];return e.all(n.reduce((function(e,n){var i=n[o];if(!i)throw"Record has no "+o;return l[i]?res:e.concat(t.box.keypair.pkFromSignPk(t.util.decode_base58(i)).then((function(e){l[i]=e})))}),c)).then((function(i){var a=i[0];return e.all(n.reduce((function(e,n){var i=l[n[o]],r=t.util.decode_base58(n.nonce);return n.valid=!0,e.concat(s.reduce((function(e,o){return n[o]?e.concat(t.box.open(n[o],r,i,a.boxSk).then((function(e){n[o]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+o),n.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+((new Date).getTime()-r)+"ms"),n}))}}}}]),angular.module("cesium.es.profile.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esProfile")}]).factory("esProfile",["$rootScope","$q","esHttp","SocialUtils","csWot","csWallet","csPlatform","esSettings",function(e,n,t,i,a,o,s,r){var l,c=this;function u(e,n){return((n=n||{}).raw?c.raw.getAll:c.raw.get)({id:e}).then((function(a){if(a&&a.found&&a._source){var s={name:a._source.title,source:a._source};return s.name&&s.name.length,s.avatar=t.image.fromHit(a,"avatar"),n.raw||(s.description=t.util.parseAsHtml(s.source.description)),s.source.socials&&s.source.socials.length&&(s.source.socials=_.uniq(s.source.socials,!1,(function(e){return e.url}))),o.isLogin()?i.open(s.source.socials,e).then((function(){return s})):(s.source.socials=_.filter(s.source.socials,(function(e){return"curve25519"!=e.type})),s)}})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))}function d(e,n,i,a){if(!n||!n.hits||!n.hits.total)return e;var o,s={};i=i||{},a=a||"pubkey",_.forEach(n.hits.hits,(function(n){var r="avatar";if("user"===n._index){if(!(o=i&&i[n._id])){var l={};l[a]=n._id,o=[l],e.push(l)}}else if("user"!==n._index){s[n._index]||(s[n._index]=!0,e.push({id:"divider-"+n._index,divider:!0,index:n._index}));var c={id:n._index+"-"+n._id,index:n._index,templateUrl:"plugins/es/templates/wot/lookup_item_{0}.html".format(n._index),state:"app.view_{0}".format(n._index),stateParams:{id:n._id,title:n._source.title},creationTime:n._source.creationTime,memberCount:n._source.memberCount,type:n._source.type};o=[c],e.push(c),r="thumbnail"}avatar=t.image.fromHit(n,r),_.forEach(o,(function(e){e.avatar=avatar,function(e,n,i){e.avatar=e.avatar||t.image.fromHit(n,"avatar"),e.name=n._source.title,e.name&&e.name.length,e.description=n._source.description||e.description,e.city=n._source.city||e.city,n.highlight&&(n.highlight.title&&(e.name=n.highlight.title[0]),n.highlight.tags&&(e.tags=n.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[])))}(e,n)}))})),_.keys(s).length&&e.splice(0,0,{id:"divider-identities",divider:!0,index:"profile"})}function p(e,n){var i={highlight:{fields:{title:{},tags:{}}},from:(n=n||{}).from||0,size:n.size||100,_source:n._source||["title","avatar._content_type","time","city"]};if(e){i.query={},i.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]};var a=e?t.util.parseTags(e):void 0;a&&i.query.bool.should.push({terms:{tags:a}})}else delete i.highlight,i.sort={time:"desc"};return n.mixedSearch&&(console.debug("[ES] [profile] Mixed search: enable"),e&&(i.indices_boost={user:100,page:1,group:.01}),i._source=i._source.concat(["description","creationTime","membersCount","type"])),(n.mixedSearch?c.raw.mixedSearch:c.raw.search)(i).then((function(e){var n=[];return d(n,e),n}))}function m(e,i,a,o){if(o=o||n.defer(),!(e||i&&i.length))return o.resolve(i),o.promise;var s;a=a||"pubkey";var r=(e=e?e.toLowerCase().trim():e)?t.util.parseTags(e):void 0,l={query:{},highlight:{fields:{title:{},tags:{}}},from:0,size:100,_source:["title","avatar._content_type"]};if(i.length>0){s={},_.forEach(i,(function(e){var n=e[a];if(n){var t=s[n];t?t.push(e):(t=[e],s[n]=t)}}));var u=_.keys(s);l.size=u.length<=l.size?l.size:u.length,e?(l.query.constant_score={filter:{bool:{should:[{terms:{_id:u}},{bool:{must:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]}}]}}},r&&l.query.constant_score.filter.bool.should.push({terms:{tags:r}})):(delete l.highlight,l.query.constant_score={filter:{terms:{_id:u}}})}else{if(!e)return o.resolve(i),o.promise;l.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},r&&l.query.bool.should.push({terms:{tags:r}})}return(0,c.raw.search)(l).then((function(e){d(i,e,s,a),o.resolve(i)})).catch((function(e){e&&e.ucode&&404==e.ucode?o.resolve(i):o.reject(e)})),o.promise}function E(e,t){return t=t||n.defer(),e&&e.pubkey?(u(e.pubkey).then((function(n){n&&(e.name=n.name,e.avatar=n.avatar,e.profile=n.source,e.profile.description=n.description),t.resolve(e)})).catch((function(n){t.reject(e)})),t.promise):(t.resolve(),t.promise)}function g(){var n=t.alive;!n&&l&&l.length>0?(console.debug("[ES] [profile] Disable"),_.forEach(l,(function(e){e()})),l=[]):!n||l&&0!==l.length||(console.debug("[ES] [profile] Enable"),function(){l=[a.api.data.on.load(e,E,this),a.api.data.on.search(e,m,this)]}())}return c.raw={getFields:t.get("/user/profile/:id?&_source_exclude=avatar._content&_source=:fields"),get:t.get("/user/profile/:id?&_source_exclude=avatar._content"),getAll:t.get("/user/profile/:id"),search:t.post("/user/profile/_search"),mixedSearch:t.post("/user,page/profile,record/_search"),countLikes:t.like.count("user","profile")},s.ready().then((function(){return t.api.node.on.start(e,g,this),t.api.node.on.stop(e,g,this),g()})),{search:function(e){return p(void 0,e)},searchText:p,getAvatarAndName:function(e){return c.raw.getFields({id:e,fields:"title,avatar._content_type"}).then((function(e){var n;return e&&e._source&&((n={name:e._source.title}).avatar=t.image.fromHit(e,"avatar")),n})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))},get:u,add:t.record.post("/user/profile",{tagFields:["title","description"],creationTime:!0}),update:t.record.post("/user/profile/:id/_update",{tagFields:["title","description"],creationTime:!0}),remove:t.record.remove("user","profile"),avatar:t.get("/user/profile/:id?_source=avatar"),fillAvatars:function(e,n){return m(null,e,n)},like:{toggle:t.like.toggle("user","profile"),add:t.like.add("user","profile"),remove:t.like.remove("user","profile"),count:c.raw.countLikes}}}]),angular.module("cesium.es.notification.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esNotification")}]).factory("esNotification",["$rootScope","$q","$timeout","$translate","$state","esHttp","csConfig","csSettings","csWallet","csWot","UIUtils","BMA","CryptoUtils","csPlatform","Api",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E){var g,h={MESSAGE_CODES:["MESSAGE_RECEIVED"],INVITATION_CODES:["INVITATION_TO_CERTIFY"],DEFAULT_LOAD_SIZE:20},b={commons:["type","code","params","reference","recipient","time","hash","read_signature"]},T=this,v=new E(this,"esNotification");function O(e,n){(n=n||{}).codes=n.codes||{},n.codes.excludes=n.codes.excludes||h.EXCLUDED_CODES;var t={bool:{must:[{term:{recipient:e}}]}};if(n.codes&&n.codes.includes)t.bool.must.push({terms:{code:n.codes.includes}});else{var i=[];r.getByPath("plugins.es.notifications.txSent",!1)||i.push("TX_SENT"),r.getByPath("plugins.es.notifications.txReceived",!0)||i.push("TX_RECEIVED"),r.getByPath("plugins.es.notifications.certSent",!1)||i.push("CERT_SENT"),r.getByPath("plugins.es.notifications.certReceived",!0)||i.push("CERT_RECEIVED"),n.codes.excludes&&_.forEach(n.codes.excludes,(function(e){i.push(e)})),i.length&&(t.bool.must_not={terms:{code:i}})}return n.readTime&&t.bool.must.push({range:{time:{gt:n.readTime}}}),t}function R(e,n){var t={query:O(e,n)};return t.query.bool.must.push({missing:{field:"read_signature"}}),T.raw.postCount(t).then((function(e){return e.count}))}function N(n){if(n&&l.isLogin())if(_.contains(h.INVITATION_CODES,n.code))v.event.raise.newInvitation(n);else{if(!_.contains(h.MESSAGE_CODES,n.code)){var t=new f(n,D);return t.id=n.id||t.id,c.extendAll([t]).then((function(){e.$$phase?I(t):e.$apply((function(){I(t)}))})).then((function(){return A(t)}))}v.event.raise.newMessage(n)}}function I(e){return l.data.notifications=l.data.notifications||{},l.data.notifications.unreadCount++,v.data.raise.new(e),e}function S(e){return e?String(e).replace(/<[^>]*>/gm,"").replace(/&[^;]+;/gm,""):""}function A(t,o){n.all([i(o||"COMMON.NOTIFICATION.TITLE"),i(t.message,t)]).then((function(n){C(S(n[0]),{body:S(n[1]),icon:t.avatar&&t.avatar.src||"./img/logo.png",lang:i.use(),tag:t.id,onclick:function(){e.$applyAsync((function(){"function"==typeof t.markAsRead&&t.markAsRead(),t.state&&a.go(t.state,t.stateParams)}))}})}))}function C(e,n){if("Notification"in window)if("granted"===Notification.permission){var t=new Notification(e,n);t.onclick=n.onclick||t.onclick}else"denied"!==Notification.permission&&Notification.requestPermission((function(t){"granted"===t&&C(e,n)}))}function D(e){!e.read&&e.id&&(e.id?(e.read=!0,p.sign(e.hash,l.data.keypair).then((function(n){return T.raw.postReadById(n,{id:e.id})})).catch((function(e){console.error("[ES] [notification] Error while trying to mark event as read.",e)}))):console.error("[ES] [notification] Could not mark as read: no 'id' found!",e))}function L(e){e.notifications=e.notifications||{},e.notifications.unreadCount=null,T.raw.ws.getUserEvent().close()}function y(e,i){if(i=i||n.defer(),!e||!e.pubkey||!e.keypair)return i.resolve(),i.promise;console.debug("[ES] [notification] Loading count...");var a=(new Date).getTime();return R(e.pubkey,{readTime:r.data.wallet?r.data.wallet.notificationReadTime:0,excludeCodes:h.EXCLUDED_CODES}).then((function(n){e.notifications=e.notifications||{},e.notifications.unreadCount=n,n>0&&t((function(){A({message:"COMMON.NOTIFICATION.HAS_UNREAD",count:n,state:"app.view_notifications"},"COMMON.APP_NAME")}),500),console.debug("[ES] [notification] Loaded count ("+n+") in "+((new Date).getTime()-a)+"ms"),i.resolve(e)})).catch((function(e){i.reject(e)})).then((function(){console.debug("[ES] [notification] Starting listen user event...");var n=T.raw.ws.getUserEvent();return g.push(n.close),n.on(N,{pubkey:e.pubkey,locale:r.data.locale.id}).catch((function(e){console.error("[ES] [notification] Unable to listen user event",e),u.alert.error("ACCOUNT.ERROR.WS_CONNECTION_FAILED")}))})),i.promise}function k(){var n=o.alive;if(!n&&g&&g.length>0)console.debug("[ES] [notification] Disable"),_.forEach(g,(function(e){e()})),g=[],l.isLogin()&&L(l.data);else if(n&&(!g||0===g.length)&&(console.debug("[ES] [notification] Enable"),function(){g=[l.api.data.on.login(e,y,this),l.api.data.on.init(e,L,this),l.api.data.on.reset(e,L,this)]}(),l.isLogin()))return y(l.data)}return h.EXCLUDED_CODES=h.MESSAGE_CODES.concat(h.INVITATION_CODES),T.raw={postCount:o.post("/user/event/_count"),postSearch:o.post("/user/event/_search"),postReadById:o.post("/user/event/:id/_read"),ws:{getUserEvent:o.ws("/ws/event/user/:pubkey/:locale"),getChanges:o.ws("/ws/_changes")}},v.registerEvent("data","new"),v.registerEvent("event","newInvitation"),v.registerEvent("event","newMessage"),m.ready().then((function(){return o.api.node.on.start(e,k,this),o.api.node.on.stop(e,k,this),k()})),T.load=function(e,n){(n=n||{}).from=n.from||0,n.size=n.size||h.DEFAULT_LOAD_SIZE;var t={query:O(e,n),sort:[{time:{order:"desc"}}],from:n.from,size:n.size,_source:b.commons};return T.raw.postSearch(t).then((function(e){if(!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=new f(n._source,D);return t.id=n._id,e.concat(t)}),[]);return c.extendAll(n)}))},T.unreadCount=R,T.html5={emit:C},T.api=v,T.websocket={event:T.raw.ws.getUserEvent,change:T.raw.ws.getChanges},T.constants=h,T}]),angular.module("cesium.es.message.services",["ngResource","cesium.services","cesium.crypto.services","cesium.wot.services","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esMessage")}]).factory("esMessage",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","esHttp","csWallet","esWallet","csWot","esNotification",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m){var E,g={commons:["issuer","recipient","title","content","time","nonce","read_signature"],notifications:["issuer","time","hash","read_signature"]},h={postSearch:c.post("/message/inbox/_search"),postSearchByType:c.post("/message/:type/_search"),getByTypeAndId:c.get("/message/:type/:id"),postReadById:c.post("/message/inbox/:id/_read")},b=new a(this,"esMessage");function T(e){e.messages=e.messages||{},e.messages.unreadCount=null}function v(e){e.messages&&delete e.messages}function O(n,t){if(t=t||e.defer(),!n||!n.pubkey)return t.resolve(),t.promise;console.debug("[ES] [message] Loading count...");var i=(new Date).getTime();return function(e){if(!(e=e||(u.isLogin()?u.data.pubkey:e)))throw new Error("no pubkey, and user not connected.");var n={query:{bool:{must:[{term:{recipient:e}},{missing:{field:"read_signature"}}]}}};return c.post("/message/inbox/_count")(n).then((function(e){return e.count}))}(n.pubkey).then((function(e){n.messages=n.messages||{},n.messages.unreadCount=e,console.debug("[ES] [message] Loaded count ("+e+") in "+((new Date).getTime()-i)+"ms"),t.resolve(n)})).catch((function(e){console.error("Error chile counting message: "+(e.message?e.message:e)),t.resolve(n)})),t.promise}function R(e){console.debug("[ES] [message] detected new message (from notification service)");var n=new f(e);n.issuer=n.pubkey,delete n.pubkey,p.extend(n,"issuer").then((function(){u.data.messages=u.data.messages||{},u.data.messages.unreadCount++,b.data.raise.new(n)}))}function N(e,n,t,i){return t=t||"/message/inbox",d.box.record.pack(e,n,i,["title","content"]).then((function(e){return c.record.post(t)(e)}))}function I(n,t){if(n=n||u.data.pubkey,!u.isLogin())return e.when([]);(t=t||{}).type=t.type||"inbox",t.from=t.from||0,t.size=t.size||1e3,t._source=t._source||g.commons;var i={sort:{time:"desc"},from:t.from,size:t.size,_source:t._source};return"inbox"==t.type?i.query={bool:{filter:{term:{recipient:n}}}}:i.query={bool:{filter:{term:{issuer:n}}}},h.postSearchByType(i,{type:t.type}).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var i=n._source||{};return i.id=n._id,i.read="outbox"==t.type||!!i.read_signature,delete i.read_signature,e.concat(i)}),[]);return console.debug("[ES] [message] Loading {0} {1} messages".format(n.length,t.type)),n}))}function S(n,t,i){var a=(new Date).getTime(),s={},r=[d.box.getKeypair(t)];return e.all(n.reduce((function(e,n){return s[n.issuer]?res:e.concat(o.box.keypair.pkFromSignPk(o.util.decode_base58(n.issuer)).then((function(e){s[n.issuer]=e})))}),r)).then((function(t){var a=t[0];return e.all(n.reduce((function(e,n){var t=s[n.issuer],r=o.util.decode_base58(n.nonce);return n.valid=!0,e.concat(o.box.open(n.title,r,t,a.boxSk).then((function(e){n.title=e})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher title"),n.valid=!1})),o.box.open(n.content,r,t,a.boxSk).then((function(e){n.content=e,i?function(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim(),e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"..."))}(n):e&&(n.html=c.util.parseAsHtml(e))})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher content"),n.valid=!1})))}),[]))})).then((function(){return console.debug("[ES] [message] All messages decrypted in "+((new Date).getTime()-a)+"ms"),n}))}function A(n){var t=r.developers||[{pubkey:"38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE"}];n&&n.content&&t&&t.length&&(console.info("[ES] [message] Sending logs to developers..."),n.issuer=u.data.pubkey,n.title=n.title||"Sending log",n.time=c.date.now(),u.getKeypair().then((function(i){return e.all(t.reduce((function(e,t){return t.pubkey?e.concat(N(angular.merge({recipient:t.pubkey},n),i)):e}),[]))})).then((function(e){console.info("[ES] [message] Logs sent to {0} developers".format(e.length))})))}function C(){var e=c.alive;!e&&E&&E.length>0?(console.debug("[ES] [message] Disable"),_.forEach(E,(function(e){e()})),E=[],u.isLogin()&&v(u.data)):!e||E&&0!==E.length||(console.debug("[ES] [message] Enable"),function(){E=[u.api.data.on.login(n,O,this),u.api.data.on.init(n,T,this),u.api.data.on.reset(n,v,this),m.api.event.on.newMessage(n,R,this),u.api.error.on.send(n,A,this)]}(),u.isLogin()&&O(u.data))}return b.registerEvent("data","new"),b.registerEvent("data","delete"),b.registerEvent("data","sent"),s.ready().then((function(){return c.api.node.on.start(n,C,this),c.api.node.on.stop(n,C,this),C()})),{api:b,search:h.postSearch,notifications:{load:function(n){if(!u.isLogin())return e.when([]);(n=n||{}).from=n.from||0,n.size=n.size||10;var t={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:u.data.pubkey}}}},from:n.from,size:n.size,_source:g.notifications};return h.postSearch(t).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,t.read=!!t.read_signature,delete t.read_signature,e.concat(t)}),[]);return p.extendAll(n,"issuer")}))}},load:function(n){return u.isLogin()?((n=n||{}).type=n.type||"inbox",n._source=g.commons,n.summary=!angular.isDefined(n.summary)||n.summary,I(u.data.pubkey,n).then((function(e){return S(e,u.data.keypair,n.summary)})).then((function(e){var t="inbox"==n.type?"issuer":"recipient";return p.extendAll(e,t)})).then((function(e){return u.data.messages=u.data.messages||{},u.data.messages.count=e.length,e}))):e.when([])},get:function(e,n){return(n=n||{}).type=n.type||"inbox",n.summary=!!angular.isDefined(n.summary)&&n.summary,h.getByTypeAndId({id:e,type:n.type}).then((function(e){if(e.found){var t=e._source;return t.id=e._id,t.read="outbox"==n.type||!!t.read_signature,delete t.read_signature,S([t],u.data.keypair,n.summary).then((function(){var e="inbox"==n.type?"issuer":"recipient";return p.extend(t,e)}))}}))},send:function(e){return u.getKeypair().then((function(n){return N(e,n).then((function(t){return l.data.plugins.es.message&&angular.isDefined(l.data.plugins.es.message.outbox)&&!l.data.plugins.es.message.outbox?t:N(e,n,"/message/outbox","issuer").catch((function(e){return console.error("Failed to store message to outbox: "+e),t}))})).then((function(e){return b.data.raise.sent(e),e}))}))},remove:function(e,n){return n=n||"inbox",c.record.remove("message",n)(e).then((function(t){return"inbox"==n&&(u.data.messages=u.data.messages||{},u.data.messages.count=u.data.messages.count>0?u.data.messages.count-1:0),b.data.raise.delete(e),t}))},removeAll:function(n){return n=n||"inbox",I(u.data.pubkey,{type:n,from:0,size:1e3,_source:!1}).then((function(t){if(t&&t.length){var i=_.pluck(t,"id");return e.all(t.reduce((function(e,t){return e.concat(c.record.remove("message",n)(t.id))}),[])).then((function(){return i}))}})).then((function(e){"inbox"==n&&(u.data.messages=u.data.messages||{},u.data.messages.count=0,u.data.messages.unreadCount=0),_.forEach(e,b.data.raise.delete)}))},markAsRead:function(n,t){if(t=t||"inbox",n.read){var i=e.defer();return i.resolve(),i.promise}return n.read=!0,u.getKeypair().then((function(e){return o.sign(n.hash,e)})).then((function(e){return h.postReadById(e,{id:n.id})})).then((function(){"inbox"==t&&(u.data.messages=u.data.messages||{},u.data.messages.unreadCount=u.data.messages.unreadCount?u.data.messages.unreadCount-1:0)}))},markAllAsRead:function(){return I(u.data.pubkey,{type:"inbox",from:0,size:1e3,_source:["hash","read_signature"]}).then((function(n){if(n&&n.length)return n=_.filter(n,{read:!1}),e.all(n.reduce((function(e,n){return e.concat(o.sign(n.hash,u.data.keypair).then((function(e){return h.postReadById(e,{id:n.id})})))}),[]))})).then((function(){u.data.messages=u.data.messages||{},u.data.messages.unreadCount=0}))},fields:{commons:g.commons}}}]),angular.module("cesium.es.modal.services",["cesium.modal.services","cesium.es.message.services"]).factory("esModals",["$state","ModalUtils","UIUtils","csWallet",function(e,n,t,i){function a(){if(i.data.notifications.unreadCount=0,i.data.notifications&&i.data.notifications.history.length){var e=i.data.notifications.history[0],n=e?e.time:0;csSettings.data.wallet=csSettings.data.wallet||{},n&&csSettings.data.wallet.notificationReadTime!=n&&(csSettings.data.wallet.notificationReadTime=n,csSettings.store())}}return{showMessageCompose:function(e){return n.show("plugins/es/templates/message/modal_compose.html","ESMessageComposeModalCtrl",e,{focusFirstInput:!0})},showNotifications:function(n,i){return t.popover.show(i,{templateUrl:"plugins/es/templates/common/popover_notification.html",scope:n,autoremove:!1,afterHidden:a}).then((function(n){n&&(n.onRead&&"function"==typeof n.onRead&&n.onRead(),n.state&&e.go(n.state,n.stateParams))}))},showNewInvitation:function(e){return n.show("plugins/es/templates/invitation/modal_new_invitation.html","ESNewInvitationModalCtrl",e)},showNewPage:function(t){return n.show("plugins/es/templates/registry/modal_record_type.html",void 0,{title:"REGISTRY.EDIT.TITLE_NEW"}).then((function(n){n&&e.go("app.registry_add_record",{type:n})}))},showNetworkLookup:function(e){return n.show("plugins/es/templates/network/modal_network.html","ESNetworkLookupModalCtrl",e,{focusFirstInput:!1})}}}]),angular.module("cesium.es.wallet.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.crypto.services"]).factory("esWallet",["$q","$rootScope","$timeout","CryptoUtils","csPlatform","csWallet","esCrypto","esProfile","esHttp",function(e,n,t,i,a,o,s,r,l){var c;function u(e){e.avatar=null,e.profile=null,e.name=null,o.events.cleanByContext("esWallet"),e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function d(n,a){if(a=a||e.defer(),!n||!n.pubkey||!n.keypair)return a.resolve(),a.promise;if(!i.isLoaded())return console.debug("[ES] [wallet] Waiting crypto lib loading..."),t((function(){return d(n,a)}),50);console.debug("[ES] [wallet] Loading user avatar+name...");var o=Date.now();return r.getAvatarAndName(n.pubkey).then((function(e){e?(n.name=e.name,n.avatarStyle=e.avatarStyle,n.avatar=e.avatar,console.debug("[ES] [wallet] Loaded user avatar+name in "+(Date.now()-o)+"ms")):console.debug("[ES] [wallet] No user avatar+name found"),a.resolve(n)})).catch((function(e){a.reject(e)})),a.promise}function p(n,t){t=t||e.defer(),o.events.cleanByContext("esWallet"),console.debug("[ES] [wallet] Loading full user profile...");var i=Date.now();return r.get(n.pubkey).then((function(e){e&&(n.name=e.name,n.avatar=e.avatar,n.profile=e.source,n.profile.description=e.description,console.debug("[ES] [wallet] Loaded full user profile in "+(Date.now()-i)+"ms")),t.resolve()})),t.promise}function m(){if(!o.isLogin())throw new Error("Unable to get box keypair: user not connected !");var n=o.data.keypair;return n&&n.boxPk&&n.boxSk?e.when(n):s.box.getKeypair(n).then((function(e){return o.data.keypair.boxSk=e.boxSk,o.data.keypair.boxPk=e.boxPk,console.debug("[ES] [wallet] Secret box keypair successfully computed"),o.data.keypair}))}function E(){var e=l.alive;if(!e&&c&&c.length>0){if(console.debug("[ES] [wallet] Disable"),_.forEach(c,(function(e){e()})),c=[],o.isLogin())return u(o.data)}else if(e&&(!c||0===c.length)&&(console.debug("[ES] [wallet] Enable"),function(){c=[o.api.data.on.login(n,d,this),o.api.data.on.finishLoad(n,p,this),o.api.data.on.init(n,u,this),o.api.data.on.reset(n,u,this)]}(),o.isLogin()))return d(o.data)}return a.ready().then((function(){return l.api.node.on.start(n,E,this),l.api.node.on.stop(n,E,this),E()})),this.box={getKeypair:m,record:{pack:function(e,n,t,i,a){return m().then((function(n){return s.box.pack(e,n,t,i,a)}))},open:function(e,n,t,i){return m().then((function(n){return s.box.open(e,n,t,i)}))}}},this}]),angular.module("cesium.es.geo.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esGeo")}]).factory("esGeo",["$rootScope","$q","csConfig","csSettings","csHttp",function(e,n,t,i,a){var o=this;function s(e){return o.raw.google.search({address:e,key:o.raw.google.apiKey}).then((function(e){if(e&&e.results&&e.results.length)return e.results.reduce((function(e,n){return e.concat({display_name:n.address_components&&n.address_components.reduce((function(e,n){return n.long_name?e.concat(n.long_name):e}),[]).join(", "),lat:n.geometry&&n.geometry.location&&n.geometry.location.lat,lon:n.geometry&&n.geometry.location&&n.geometry.location.lng})}),[])}))}o.raw={osm:{search:a.get("nominatim.openstreetmap.org",443,"/search.php?format=json"),license:{name:"OpenStreetMap",url:"https://www.openstreetmap.org/copyright"}},google:{apiKey:void 0,search:a.get("maps.google.com",443,"/maps/api/geocode/json")},searchByIP:a.get("freegeoip.net",443,"/json/:ip")},o.raw.google.apiKey=t.plugins&&t.plugins.es&&t.plugins.es.googleApiKey;var r=!!o.raw.google.apiKey;return i.ready().then((function(){function n(e){r||(o.raw.google.apiKey=e.plugins.es.googleApiKey),o.raw.google.enable=o.raw.google.apiKey&&e.plugins&&e.plugins.es&&e.plugins.es.enableGoogleApi}i.api.data.on.changed(e,n,this),n(i.data)})),{point:{current:function(){return navigator.geolocation?n((function(e,n){console.debug("[ES] [geo] Getting current GPS position..."),navigator.geolocation.getCurrentPosition((function(t){if(!t||!t.coords)return console.error("[ES] [geo] navigator geolocation > Unknown format:",t),void n({message:"navigator geolocation > Unknown format"});e({lat:t.coords.latitude,lon:t.coords.longitude})}),(function(e){n(e)}),{timeout:5e3})})):n.reject()},searchByAddress:function(e){"string"==typeof e&&(e={q:e}),e.q&&(e.q=e.q.trim().replace(/\n/g,",").replace(/(?:^|[\t\n\r\s ])([A−Z09-]+)(?:$|[\t\n\r\s ])/g,"").replace(/,[ ,]+/g,", ")),e.addressdetails=1;var n=new Date;return o.raw.osm.search(e).then((function(e){if(e)return e=e.reduce((function(e,n){return"waterway"!=n.class&&"railway"!=n.class&&n.address?(n.address.city=n.address.city||n.address.village||n.address.town||n.address.postcode,n.address.road=n.address.road||n.address.suburb||n.address.hamlet,n.address.postcode&&n.address.city==n.address.postcode&&delete n.address.postcode,n.address.city?e.concat({id:n.place_id,name:n.display_name,address:n.address,lat:n.lat,lon:n.lon,class:n.class,license:o.raw.osm.license}):e):e}),[]),console.debug("[ES] [geo] Found {0} address position(s)".format(e&&e.length||0,(new Date).getTime()-n.getTime()),e),e.length?e:void 0})).catch((function(n){return t=n,i=e.q?e.q:(e.street?e.street+", ":"")+e.city+(e.country?", "+e.country:""),console.debug("[ES] [geo] Search position failed on [OSM]. Trying [google] service"),s(i).catch((function(e){throw console.debug("[ES] [geo] Search position failed on [google] service"),t||e}));var t,i}))},searchByIP:function(e){return o.raw.searchByIP({ip:e}).then((function(e){return e?{lat:e.latitude,lng:e.longitude}:void 0}))},distance:function(e,n,t,i,a){var o=Math.PI*e/180,s=Math.PI*t/180,r=n-i,l=Math.PI*r/180,c=Math.sin(o)*Math.sin(s)+Math.cos(o)*Math.cos(s)*Math.cos(l);return c=60*(c=180*(c=Math.acos(c))/Math.PI)*1.1515,"km"==a?1.609344*c:"N"==a?.8684*c:c}},google:{isEnable:function(){return o.raw.google.enable&&o.raw.google.apiKey},searchByAddress:s}}}]),angular.module("cesium.es.subscription.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esSubscription")}]).factory("esSubscription",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","esSettings","CryptoUtils","UIUtils","csWallet","csWot","BMA","csPlatform","esWallet",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E){var g,h=this;function b(e){e.subscriptions=null}function f(e,t,i){return i=i||n.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [subscription] Loading subscriptions count..."),h.raw.count({pubkey:e.pubkey}).then((function(n){e.subscriptions=e.subscriptions||{},e.subscriptions.count=n&&n.hits&&n.hits.total,console.debug("[ES] [subscription] Loaded count ("+e.subscriptions.count+")"),i.resolve(e)})).catch((function(n){console.error("[ES] [subscription] Error while counting subscription: "+(n.message?n.message:n)),i.resolve(e)})),i.promise):(i.resolve(),i.promise)}function T(){var n=i.alive;if(!n&&g&&g.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(g,(function(e){e()})),g=[],u.isLogin())return b(u.data)}else if(n&&(!g||0===g.length)&&(console.debug("[ES] [subscription] Enable"),function(){g=[u.api.data.on.load(e,f,this),u.api.data.on.init(e,b,this),u.api.data.on.reset(e,b,this)]}(),u.isLogin()))return f(u.data)}return h.raw={getAll:i.get("/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer"),count:i.get("/subscription/record/_search?size=0&q=issuer::pubkey"),add:i.record.post("/subscription/record"),update:i.record.post("/subscription/record/:id/_update"),category:{get:i.get("/subscription/category/:id"),all:i.get("/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key")}},m.ready().then((function(){return i.api.node.on.start(e,T,this),i.api.node.on.stop(e,T,this),T()})),h.record={load:function(e,n){return h.raw.getAll({issuer:e}).then((function(e){var t=e&&e.hits&&e.hits.total&&e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[])||[];return E.box.record.open(t,n,"issuer","issuerContent").then((function(e){return _.forEach(e,(function(e){e.content=JSON.parse(e.issuerContent||"{}"),delete e.issuerContent,delete e.recipientContent})),e}))}))},add:function(e){if(!(e&&e.type&&e.content&&e.recipient))return n.reject("Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'");var t=u.data.pubkey,i=JSON.stringify(e.content);return l.util.random_nonce().then((function(a){return n.all([E.box.record.pack({issuer:t,issuerContent:i},u.data.keypair,"issuer","issuerContent",a),E.box.record.pack({recipient:e.recipient,recipientContent:i},u.data.keypair,"recipient","recipientContent",a)])})).then((function(n){var t=angular.merge(n[0],n[1]);return t.type=e.type,h.raw.add(t).then((function(n){return e.id=n,e}))}))},update:function(e){if(!e||!e.content||!e.recipient)return n.reject("Missing arguments 'record' or 'record.content', or 'record.recipient'");var t=u.data.pubkey,i=JSON.stringify(e.content);return l.util.random_nonce().then((function(a){return n.all([E.box.record.pack({issuer:t,issuerContent:i},u.data.keypair,"issuer","issuerContent",a),E.box.record.pack({recipient:e.recipient,recipientContent:i},u.data.keypair,"recipient","recipientContent",a)])})).then((function(n){var t=angular.merge(n[0],n[1]);return t.type=e.type,h.raw.update(t,{id:e.id}).then((function(){return e}))}))},remove:i.record.remove("subscription","record")},h.category={all:function(){if(h.raw.categories&&h.raw.categories.length){var e=n.defer();return e.resolve(h.raw.categories),e.promise}return h.raw.category.all().then((function(e){if(0===e.hits.total)h.raw.categories=[];else{var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[]);_.forEach(n,(function(e){n[e.id]=e})),h.raw.categories=n}return h.raw.categories}))},get:function(e){return h.raw.category.get(e).then((function(e){var n=e._source;return n.id=e._id,n}))}},h.constants={},h}]),angular.module("cesium.es.document.services",["ngResource","cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esDocument")}]).factory("esDocument",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","csWot","csWallet","esHttp",function(e,n,t,i,a,o,s,r,l,c,u,d){var p={commons:["issuer","pubkey","hash","time","recipient","nonce","read_signature"],peer:["*"],movement:["*"]},m={search:d.post("/:index/:type/_search"),searchText:d.get("/:index/:type/_search?q=:text&_source=:source")};function E(e){if(!e||!e.index||!e.type)throw new Error("Missing mandatory options [index, type]");var n="desc";return"peer"==e.type?(e.sort&&!e.sort.time||(n=e.sort&&e.sort.time||n,e.sort={"stats.medianTime":{nested_path:"stats",order:n}}),e._source=p.peer,e.getTimeFunction=function(e){return e.time=e.stats&&e.stats.medianTime,e.time}):"movement"==e.type&&(e.sort&&!e.sort.time||(n=e.sort&&e.sort.time||n,e.sort={medianTime:n}),e._source=e._source||p.movement,e.getTimeFunction=function(e){return e.time=e.medianTime,e.time}),e}function g(e,n){n.issuerField=n.issuerField||"pubkey";var t=(e&&e.hits&&e.hits.hits||[]).reduce((function(e,t){var i=t._source||{};return i.index=t._index,i.type=t._type,i.id=t._id,i.pubkey=i.issuer||n.issuerField&&i[n.issuerField]||i.pubkey,i.time=n.getTimeFunction&&n.getTimeFunction(i)||i.time,i.thumbnail=d.image.fromHit(t,"thumbnail"),e.concat(i)}),[]),i=t.reduce((function(e,n){return n.recipient?(n.recipient={pubkey:n.recipient},e.concat(n.recipient)):e}),[]);return c.extendAll(t.concat(i)).then((function(){return{hits:t,took:e.took,total:e&&e.hits&&e.hits.total||0}}))}return{search:function(e){var n={from:(e=E(e)).from||0,size:e.size||40,sort:e.sort||{time:"desc"},_source:e._source||p.commons};return e.query&&(n.query=e.query),m.search(n,{index:e.index,type:e.type}).then((function(n){return g(n,e)}))},searchText:function(e,n){var t={text:e,index:(n=n||{}).index||"user",type:n.type||"event",from:n.from||0,size:n.size||40,sort:n.sort||"time:desc",source:n._source&&n._source.join(",")||p.commons.join(",")};console.debug("[ES] [wallet] [document] [{0}/{1}] Loading documents...".format(n.index,n.type));var i=Date.now();return m.searchText(t).then((function(e){return g(e,n)})).then((function(e){return console.debug("[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms".format(n.index,n.type,e&&e.hits&&e.hits.length||0,Date.now()-i)),e}))},remove:function(n,t){return n&&n.index&&n.type&&n.id?u.isLogin()?d.record.remove(n.index,n.type)(n.id,t):e.reject("User not login"):e.reject("Could not remove document: missing mandatory fields")},removeAll:function(n,t){return n&&n.length?u.isLogin()?e.all(n.reduce((function(e,n){return e.concat(d.record.remove(n.index,n.type)(n.id))}),[])):e.reject("User not login"):e.when()},fields:{commons:p.commons},fromHit:function(e){return g({hits:{hits:[e]}},E({index:e._index,type:e._type})).then((function(e){return e.hits[0]}))}}}]),angular.module("cesium.es.network.services",["ngApi","cesium.es.http.services"]).factory("esNetwork",["$rootScope","$q","$interval","$timeout","$window","csSettings","csConfig","esHttp","Api","BMA",function(e,n,t,i,a,o,s,r,l,c){factory=function(e){var u,d="https:"===a.location.protocol,p=new l(this,"csNetwork-"+e),m={pod:null,listeners:[],loading:!0,peers:[],filter:{endpointFilter:null,online:!0,ssl:void 0,tor:void 0},sort:{type:null,asc:!0},expertMode:!1,knownBlocks:[],mainBlock:null,searchingPeersOnNetwork:!1,timeout:s.timeout},E=function(e){return e&&[e.number,e.hash].join("-")},g=function(){m.peers=[],m.searchingPeersOnNetwork=!0,m.loading=!0,m.pod=m.pod||r;var e=[];return u&&t.cancel(u),u=t((function(){e.length?v(e):m.loading&&!m.searchingPeersOnNetwork&&(m.loading=!1,t.cancel(u),R(!0),console.debug("[network] Finish: {0} peers found.".format(m.peers.length)))}),1e3),n.when().then((function(){return m.filter.online?m.pod.network.peers().then((function(t){var i=[];if(_.forEach(t.peers,(function(n){"UP"==n.status&&i.push(h(n,e))})),i.length)return n.all(i)})).catch((function(e){console.error(e)})):m.pod.network.peers().then((function(t){var i=[];if(_.forEach(t.peers,(function(n){"UP"!==n.status&&i.push(h(n,e))})),i.length)return n.all(i)}))})).then((function(){m.searchingPeersOnNetwork=!1})).catch((function(e){console.error(e),m.searchingPeersOnNetwork=!1}))},h=function(e,t){t=t||m.newPeers;var i=f(e),a=!1,o=i.reduce((function(e,n){var i=_.findWhere(m.peers,{id:n.id}),o=i?i.buid:null,s=!!i&&i.online;return e.concat(T(n).then((function(e){i?!e||e.online!==m.filter.online&&"all"!==m.filter.online?(console.debug("[network] Peer [{0}] removed (cause: {1})".format(n.server,e?e.online?"UP":"DOWN":"filtered")),m.peers.splice(m.peers.indexOf(i),1),a=!0):e.buid!==o?(console.debug("[network] {0} endpoint [{1}] new current block".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server)),a=!0):s!==e.online?(console.debug("[network] {0} endpoint [{1}] is now {2}".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server,e.online?"UP":"DOWN")),a=!0):console.debug("[network] {0} endpoint [{1}] unchanged".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server)):!e||e.online!==m.filter.online&&"all"!==m.filter.online||(console.debug("[network] {0} endpoint [{1}] is {2}".format(e.ep&&e.ep.api||"",e.server,e.online?"UP":"DOWN")),t.push(e),a=!0)})))}),[]);return(1===o.length?o[0]:n.all(o)).then((function(){return a}))},f=function(e,n){if(!e)return[];var t=new b(e);if(!n){var i=t.getEndpoints();if(!i)return[];var a=i.reduce((function(e,n){var t=r.node.parseEndPoint(n);return t?e.concat(t):e}),[]);if(a.length>1)return a.reduce((function(n,t){return n.concat(f(e,t))}),[]);n=a[0]}return t.ep=n,t.server=t.getServer(),t.dns=t.getDns(),t.blockNumber=t.block&&t.block.replace(/-.+$/,""),t.id=t.keyID(),[t]},T=function(e){return function(e){return!(m.filter&&(m.filter.endpointFilter&&(e.ep&&e.ep.api&&e.ep.api!==m.filter.endpointFilter||!e.hasEndpoint(m.filter.endpointFilter))||!m.filter.online&&"UP"===e.status||angular.isDefined(m.filter.ssl)&&e.isSsl()!=m.filter.ssl||angular.isDefined(m.filter.tor)&&e.isTor()!=m.filter.tor))}(e)?!m.filter.online||"all"===m.filter.online&&"DOWN"===e.status||!e.getHost()?(e.online=!1,n.when(e)):d&&!e.isSsl()?(e.online="UP"===e.status,e.buid=-1,delete e.version,n.when(e)):e.ep.useTor?(e.online="UP"==e.status,e.buid=-1,delete e.software,delete e.version,n.when(e)):(e.api=e.api||r.lightInstance(e.getHost(),e.getPort(),e.isSsl(),m.timeout),e.api.blockchain.current().then((function(n){return e.currentNumber=n.number,e.online=!0,e.buid=E(n),e.medianTime=n.medianTime,-1===m.knownBlocks.indexOf(e.buid)&&m.knownBlocks.push(e.buid),e})).catch((function(n){if(n&&n.ucode==c.errorCodes.NO_CURRENT_BLOCK)return e.online=!0,e.buid=E({number:0,hash:c.constants.ROOT_BLOCK_HASH}),e.difficulty=0,e;if(!e.secondTry){var t=e.ep||e.getEP();if(t.dns&&-1==e.server.indexOf(t.dns))return e.secondTry=!0,e.api=r.lightInstance(t.dns,t.port,t.useSsl),T(e)}return e.online=!1,e.currentNumber=null,e.buid=null,e})).then((function(e){return m.filter.online&&e&&e.online?(e.docCount={},n.all([m.expertMode?e.api.node.summary().then((function(n){e.software=n&&n.duniter&&n.duniter.software||void 0,e.version=n&&n.duniter&&n.duniter.version||"?"})).catch((function(){e.software=void 0,e.version="?"})):n.when(),e.api.record.count(m.document.index,m.document.type).then((function(n){e.docCount.record=n})).catch((function(){e.docCount.record=void 0})),e.api.subscription.count({recipient:e.pubkey,type:"email"}).then((function(n){e.docCount.emailSubscription=n})).catch((function(){e.docCount.emailSubscription=void 0}))])):e})).then((function(){return delete e.api,e}))):n.when()},v=function(e,n){if((e=e||m.newPeers).length){var t=_.map(m.peers,(function(e){return e.id})),i=!1,a=0;_.forEach(e.splice(0),(function(e){t[e.id]||(m.peers.push(e),t[e.id]=e,i=!0,a++)})),i&&(console.debug("[network] Flushing {0} new peers...".format(a)),R(n))}},O=function(e,n,t){if(!e)return 0;var i=0;n>(e=e.toLowerCase()).length&&(n=e.length),i+=e.charCodeAt(0);for(var a=1;a<n;a++)i+=Math.pow(.001,a)*e.charCodeAt(a);return t?1e3-i:i},R=function(e){var n={};_.forEach(m.peers,(function(e){if(e.buid){var t=n[e.buid];t&&t.medianTime?!t.medianTime&&e.medianTime&&(t.medianTime=e.medianTime):(t={buid:e.buid,count:0,medianTime:e.medianTime},n[e.buid]=t),-1!=t.buid&&t.count++}})),_.forEach(_.values(n),(function(e){e.pct=100*e.count/m.peers.length}));var t=_.max(n,(function(e){return e.count}));_.forEach(m.peers,(function(e){e.hasMainConsensusBlock=e.buid==t.buid,e.hasConsensusBlock=e.buid&&!e.hasMainConsensusBlock&&n[e.buid].count>1,e.hasConsensusBlock&&(e.consensusBlockDelta=n[e.buid].medianTime-t.medianTime)})),m.peers=_.uniq(m.peers,!1,(function(e){return e.id})),m.peers=_.sortBy(m.peers,(function(e){var t=0;if(m.sort.type){var i=0;i+="name"==m.sort.type?O(e.name,10,m.sort.asc):0,i+="software"==m.sort.type?O(e.software,10,m.sort.asc):0,i+="api"==m.sort.type&&(e.hasEndpoint("ES_SUBSCRIPTION_API")&&(m.sort.asc?1:-1)||0)+(e.hasEndpoint("ES_USER_API")&&(m.sort.asc?.01:-.01)||0)+(e.isSsl()&&(m.sort.asc?.75:-.75)||0)||0,t+=1e10*(i+="doc_count"==m.sort.type&&e.docCount?m.sort.asc?1e9-e.docCount:e.docCount:0)}return t+=1e9*(e.online?1:0),t+=1e8*(e.hasMainConsensusBlock?1:0),t+=1e6*(e.hasConsensusBlock?n[e.buid].pct:0),m.expertMode?(t+=100*(e.difficulty?1e4-e.difficulty:0),t+=1*(e.uid?O(e.uid,2,!0):0)):(t+=100*(e.uid?O(e.uid,2,!0):0),t+=1*(e.uid?0:O(e.pubkey,2,!0))),-t})),!e||!t.buid||m.mainBlock&&m.mainBlock.buid===t.buid||(m.mainBlock=t,p.data.raise.mainBlockChanged(t)),p.data.raise.changed(m)},N=function(e,n){return n=n||{},r.ready().then((function(){I(),m.pod=e||r,m.filter=n.filter?angular.merge(m.filter,n.filter):m.filter,m.sort=n.sort?angular.merge(m.sort,n.sort):m.sort,m.expertMode=angular.isDefined(n.expertMode)?n.expertMode:m.expertMode,m.timeout=angular.isDefined(n.timeout)?n.timeout:s.timeout,console.info("[network] Starting network from [{0}]".format(m.pod.server));var t=Date.now();return m.listeners=[m.pod.websocket.block().onListener((function(e){if(e&&!m.loading){var n=[e.number,e.hash].join("-");-1===m.knownBlocks.indexOf(n)&&(console.debug("[network] Receiving block: "+n.substring(0,20)),m.knownBlocks.push(n),1===m.knownBlocks.length||(m.loading=!0,i((function(){console.debug("[network] new block received by WS: will refresh peers"),g()}),2e3,!1)))}})),m.pod.websocket.peer().onListener((function(e){if(e&&!m.loading){var n=[];h(e,n).then((function(e){e&&(n.length>0?v(n,!0):(console.debug("[network] [ws] Peers updated received"),R(!0)))}))}}))],g().then((function(e){return console.debug("[network] Started in "+(Date.now()-t)+"ms"),e}))}))},I=function(){m.pod&&(console.info("[network-service] Stopping..."),_.forEach(m.listeners,(function(e){e()})),m.listeners=[]),m.pod=null,m.listeners=[],m.peers.splice(0),m.filter={endpointFilter:null,online:!0},m.sort={type:null,asc:!0},m.expertMode=!1,m.knownBlocks=[],m.mainBlock=null,m.loading=!0,m.searchingPeersOnNetwork=!1,m.timeout=s.timeout,m.document={index:o.data.plugins.es&&o.data.plugins.es.document&&o.data.plugins.es.document.index||"user",type:o.data.plugins.es&&o.data.plugins.es.document&&o.data.plugins.es.document.type||"profile"}},S=function(e){return m.pod?N().then((function(){return n(e)})):n(e)};return p.registerEvent("data","changed"),p.registerEvent("data","mainBlockChanged"),p.registerEvent("data","rollback"),{id:e,data:m,start:N,close:I,hasPeers:function(){return m.peers&&m.peers.length>0},getPeers:function(){return m.peers},sort:function(e){e=e||{},m.filter=e.filter?angular.merge(m.filter,e.filter):m.filter,m.sort=e.sort?angular.merge(m.sort,e.sort):m.sort,R(!1)},getTrustedPeers:function(){return S((function(e,n){e(m.peers.reduce((function(e,n){return n.hasMainConsensusBlock&&n.uid?e.concat(n):e}),[]))}))},getKnownBlocks:function(){return m.knownBlocks},getMainBlockUid:function(){return S((function(e,n){e(m.mainBuid)}))},loadPeers:g,isBusy:function(){return m.loading},api:p}};var u=factory("default");return u.instance=factory,u}]),v.$inject=["$scope","UIUtils","$q","Device"],N.$inject=["$scope","$focus","$filter","UIUtils","SocialUtils"],I.$inject=["$scope"],R.$inject=["$scope","$filter","$state","$focus","$timeout","$anchorScroll","UIUtils"],O.$inject=["$scope","UIUtils","$timeout","parameters"],S.$inject=["$scope"],A.$inject=["$scope","csConfig","esGeo","ModalUtils"],C.$inject=["$scope","$q","csConfig","esGeo","ModalUtils"],D.$inject=["$scope","$timeout","UIUtils","ModalUtils","csConfig","esGeo"],y.$inject=["$scope","$q","$translate","esGeo","parameters"],k.$inject=["$scope","$q","$timeout","$translate","$ionicPopup","UIUtils","csWallet","esHttp"],angular.module("cesium.es.common.controllers",["ngResource","cesium.es.services"]).controller("ESPicturesEditCtrl",v).controller("ESPicturesEditCtrl",v).controller("ESSocialsEditCtrl",N).controller("ESSocialsViewCtrl",I).controller("ESCommentsCtrl",R).controller("ESCategoryModalCtrl",O).controller("ESAvatarModalCtrl",S).controller("ESPositionEditCtrl",A).controller("ESLookupPositionCtrl",C).controller("ESSearchPositionItemCtrl",D).controller("ESSearchPositionModalCtrl",y).controller("ESLikesCtrl",k),P.$inject=["$scope","esSettings","PluginService"],M.$inject=["$scope","esSettings","PluginService"],w.$inject=["$scope","$state","PluginService","esSettings","UIUtils"],U.$inject=["$scope","$state","csSettings","csWallet"],angular.module("cesium.es.app.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&(e.extendState("app",{points:{"nav-buttons-right":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-discover":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"}}}),e.extendState("app",{points:{"profile-popover-user":{templateUrl:"plugins/es/templates/common/popover_profile_extend.html",controller:"ESProfilePopoverExtendCtrl"}}}))}]).controller("ESExtensionCtrl",P).controller("ESJoinCtrl",M).controller("ESMenuExtendCtrl",w).controller("ESProfilePopoverExtendCtrl",U),x.$inject=["$scope","$window","$q","$translate","$ionicPopup","UIUtils","Modals","csHttp","csConfig","csSettings","esHttp","esSettings","esModals"],angular.module("cesium.es.settings.controllers",["cesium.es.services"]).config(["PluginServiceProvider","$stateProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&(e.extendState("app.settings",{points:{plugins:{templateUrl:"plugins/es/templates/settings/settings_extend.html",controller:"ESExtensionCtrl"}}}),n.state("app.es_settings",{url:"/settings/es",views:{menuContent:{templateUrl:"plugins/es/templates/settings/plugin_settings.html",controller:"ESPluginSettingsCtrl"}}}))}]).controller("ESPluginSettingsCtrl",x),B.$inject=["$scope","$controller","$state","csWallet","esModals"],
|
||
F.$inject=["$scope","$controller","UIUtils","esHttp","esProfile"],angular.module("cesium.es.wallet.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendState("app.view_wallet",{points:{hero:{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletLikesCtrl"},"after-general":{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletViewCtrl"}}})}]).controller("ESWalletViewCtrl",B).controller("ESWalletLikesCtrl",F),H.$inject=["$scope","$controller","$ionicPopover","UIUtils","csWallet","esHttp","esProfile","esModals"],angular.module("cesium.es.wot.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendStates(["app.wot_identity","app.wot_identity_uid"],{points:{hero:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},general:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"after-general":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"buttons-top-fab":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"}}})}]).controller("ESWotIdentityViewCtrl",H),W.$inject=["$scope","$rootScope","$q","$timeout","$state","$focus","$translate","$controller","$ionicHistory","UIUtils","BMA","esHttp","esProfile","ModalUtils","Device"],angular.module("cesium.es.profile.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.user_edit_profile",{cache:!1,url:"/wallet/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},data:{auth:!0}})}]).controller("ESViewEditProfileCtrl",W),V.$inject=["$scope","$state","$translate","$ionicHistory","$ionicPopover","$timeout","esModals","UIUtils","csWallet","esMessage"],G.$inject=["$scope","$controller","UIUtils"],Y.$inject=["$scope","Modals","UIUtils","csWallet","esHttp","esMessage","parameters"],j.$inject=["$scope","$state","$timeout","$translate","$ionicHistory","$ionicPopover","UIUtils","esModals","esMessage"],$.$inject=["$scope","UIUtils","$state","$timeout","csWallet","esHttp","esMessage","esModals"],angular.module("cesium.es.message.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.user_message",{url:"/user/message?type",views:{menuContent:{templateUrl:"plugins/es/templates/message/list.html",controller:"ESMessageListCtrl"}}}).state("app.user_new_message",{cache:!1,url:"/user/message/new?pubkey&uid&title&content",views:{menuContent:{templateUrl:"plugins/es/templates/message/compose.html",controller:"ESMessageComposeCtrl"}}}).state("app.user_view_message",{cache:!1,url:"/user/message/view/:type/:id",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}}})}]).controller("ESMessageListCtrl",V).controller("ESMessageComposeCtrl",G).controller("ESMessageComposeModalCtrl",Y).controller("ESMessageViewCtrl",j).controller("PopoverMessageCtrl",$),K.$inject=["$scope","$rootScope","$ionicPopover","$state","$timeout","UIUtils","esHttp","csSettings","csWallet","esNotification"],q.$inject=["$scope","$timeout","$controller","UIUtils","$state"],angular.module("cesium.es.notification.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.view_notifications",{url:"/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}}})}]).controller("NotificationsCtrl",K).controller("PopoverNotificationsCtrl",q),z.$inject=["$scope","$q","$ionicHistory","csWot","csWallet","UIUtils","ModalUtils","esSubscription"],X.$inject=["$scope","Modals","csSettings","esHttp","csWot","esModals","parameters"],angular.module("cesium.es.subscription.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_subscriptions",{cache:!1,url:"/wallet/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{auth:!0,minData:!0}}).state("app.edit_subscriptions_by_id",{cache:!1,url:"/wallets/:id/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{login:!0,minData:!0}})}]).controller("ViewSubscriptionsCtrl",z).controller("ModalEmailSubscriptionsCtrl",X),Q.$inject=["$scope","$ionicPopover","$location","$timeout","csSettings","csWallet","UIUtils","esHttp","esDocument"],J.$inject=["$scope","$controller","$timeout","$state"],angular.module("cesium.es.document.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.document_search",{url:"/data/search/:index/:type?q",views:{menuContent:{templateUrl:"plugins/es/templates/document/lookup.html",controller:"ESDocumentLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESDocumentLookupCtrl",Q).controller("ESLastDocumentsCtrl",J),Z.$inject=["$scope","$state","$location","$ionicPopover","$window","$translate","esHttp","UIUtils","csConfig","csSettings","csCurrency","esNetwork","csWot"],ee.$inject=["$scope","$controller","parameters"],ie.$inject=["$scope","$q","$window","$state","UIUtils","csWot","esHttp","csHttp","csSettings"],ne.$inject=["$scope","$controller"],te.$inject=["$scope","$q","csSettings","csCurrency","csHttp","esHttp"],angular.module("cesium.es.network.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.es_network",{url:"/network/data?online&expert",cache:!1,views:{menuContent:{templateUrl:"plugins/es/templates/network/view_es_network.html",controller:"ESNetworkLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.view_es_peer",{url:"/network/data/peer/:server?ssl&tor",cache:!1,views:{menuContent:{templateUrl:"plugins/es/templates/network/view_es_peer.html",controller:"ESPeerViewCtrl"}},data:{preferHttp:!0}})}]).controller("ESNetworkLookupCtrl",Z).controller("ESNetworkLookupModalCtrl",ee).controller("ESPeerViewCtrl",ie).controller("ESNetworkLookupPopoverCtrl",ne).controller("ESPeerInfoPopoverCtrl",te),angular.module("cesium.es.registry.services",["ngResource","cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esRegistry")}]).factory("esRegistry",["$rootScope","$q","csPlatform","csSettings","csWallet","csWot","esHttp","esComment","esGeo",function(e,n,t,i,a,o,s,r,l){var c,u={commons:["title","description","issuer","time","address","city","creationTime","avatar._content_type","picturesCount","type","category","socials","pubkey","geoPoint"]},d=this;function p(e){e.pages=null}function m(e,t){return t=t||n.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [registry] Loading pages count..."),d.raw.count({pubkey:e.pubkey}).then((function(n){e.pages=e.pages||{},e.pages.count=n&&n.hits&&n.hits.total,console.debug("[ES] [registry] Loaded pages count ("+e.pages.count+")"),t.resolve(e)})).catch((function(n){console.error("[ES] [registry] Error while counting page: "+(n.message?n.message:n)),t.resolve(e)})),t.promise):(t.resolve(),t.promise)}function E(){if(d.raw.categories&&d.raw.categories.length){var e=n.defer();return e.resolve(d.raw.categories),e.promise}return d.raw.category.all().then((function(e){if(0===e.hits.total)d.raw.categories=[];else{var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[]);_.forEach(n,(function(e){n[e.id]=e})),d.raw.categories=n}return d.raw.categories}))}function g(e,n){if(e){var t=e._source;return t.category&&t.category.id&&(t.category=n[t.category.id]),e.highlight&&(e.highlight.title&&(t.title=e.highlight.title[0]),e.highlight.description&&(t.description=e.highlight.description[0]),e.highlight.location&&(t.location=e.highlight.location[0]),e.highlight.tags&&(t.tags=e.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[]))),t.avatar=s.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(t.pictures=e._source.pictures.reduce((function(e,n){return e.concat(s.image.fromAttachment(n.file))}),[])),t}}function h(){var n=s.alive;if(!n&&c&&c.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(c,(function(e){e()})),c=[],a.isLogin())return p(a.data)}else if(n&&(!c||0===c.length)&&(console.debug("[ES] [subscription] Enable"),function(){c=[a.api.data.on.login(e,m,this),a.api.data.on.init(e,p,this),a.api.data.on.reset(e,p,this)]}(),a.isLogin()))return m(a.data)}return d.raw={count:s.get("/page/record/_search?size=0&q=issuer::pubkey"),searchText:s.get("/page/record/_search?q=:search"),search:s.post("/page/record/_search"),get:s.get("/page/record/:id"),getCommons:s.get("/page/record/:id?_source="+u.commons.join(",")),category:{get:s.get("/page/category/:id"),all:s.get("/page/category/_search?sort=order&from=0&size=1000&_source=name,parent")}},t.ready().then((function(){return s.api.node.on.start(e,h,this),s.api.node.on.stop(e,h,this),h()})),d.category={all:E,get:function(e){return d.raw.category.get(e).then((function(e){var n=e._source;return n.id=e._id,n}))}},d.record={search:function(e){return(e=e||{}).from=e.from||0,e.size=e.size||20,e._source=e._source||u.commons,e.highlight=e.highlight||{fields:{title:{},description:{}}},n.all([E(),d.raw.search(e)]).then((function(n){var t=n[0];if(!(n=n[1])||!n.hits||!n.hits.total)return{total:0,hits:[]};var i=s.util.findObjectInTree(e.query,"geo_distance"),a=i&&i.geoPoint,o=i&&i.distance&&i.distance.replace(new RegExp("[0-9 ]+","gm"),""),r=n.hits.hits.reduce((function(e,n){var i=g(n,t);return i.id=n._id,a&&i.geoPoint&&o&&(i.distance=l.point.distance(a.lat,a.lon,i.geoPoint.lat,i.geoPoint.lon,o)),e.concat(i)}),[]);return{total:n.hits.total,hits:r}}))},load:function(e,t){return(t=t||{}).raw=!!angular.isDefined(t.raw)&&t.raw,t.fecthPictures=angular.isDefined(t.fetchPictures)?t.fetchPictures:t.raw,n.all([E(),t.fecthPictures?d.raw.get({id:e}):d.raw.getCommons({id:e})]).then((function(e){var n=e[0],i=e[1],a=g(i,n);return t.raw||(a.description=s.util.parseAsHtml(a.description,{tagState:"app.registry_lookup"})),o.extend({pubkey:a.issuer}).then((function(e){return{id:i._id,issuer:e,record:a}}))}))},add:s.record.post("/page/record",{tagFields:["title","description"],creationTime:!0}),update:s.record.post("/page/record/:id/_update",{tagFields:["title","description"]}),remove:s.record.remove("page","record"),fields:{commons:u.commons},picture:{all:s.get("/page/record/:id?_source=pictures")},comment:r.instance("page")},d.currency={all:s.get("/currency/record/_search?_source=currencyName,peers.host,peers.port"),get:s.get("/currency/record/:id/_source")},d}]),ae.$inject=["$scope","$focus","$timeout","$filter","$controller","$location","$translate","$ionicPopover","Device","UIUtils","ModalUtils","BMA","csSettings","csWallet","esModals","esRegistry","esHttp"],oe.$inject=["$scope","$controller","$timeout","UIUtils","csWallet"],se.$inject=["$scope","$rootScope","$state","$q","$timeout","$ionicPopover","$ionicHistory","$translate","$anchorScroll","csConfig","csWallet","esRegistry","UIUtils","esHttp"],re.$inject=["$scope","$timeout","$state","$q","$ionicHistory","$focus","$translate","$controller","Device","UIUtils","ModalUtils","csWallet","esHttp","esRegistry"],angular.module("cesium.es.registry.controllers",["cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){e.state("app.registry_lookup",{url:"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup.html",controller:"ESRegistryLookupCtrl"}},data:{large:"app.registry_lookup_lg",silentLocationChange:!0}}).state("app.registry_lookup_lg",{url:"/wot/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup_lg.html",controller:"ESRegistryLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.wallet_pages",{url:"/wallet/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0}}).state("app.view_page",{url:"/page/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.view_page_anchor",{url:"/page/view/:id/:title/:anchor",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.registry_add_record",{cache:!1,url:"/page/add/:type",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}}).state("app.registry_edit_record",{cache:!1,url:"/page/edit/:id/:title",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}})}]).controller("ESRegistryLookupCtrl",ae).controller("ESWalletPagesCtrl",oe).controller("ESRegistryRecordViewCtrl",se).controller("ESRegistryRecordEditCtrl",re),angular.module("cesium.market.services",["cesium.market.converse.services","cesium.market.modal.services","cesium.market.record.services","cesium.market.wallet.services","cesium.market.settings.services"]),angular.module("cesium.market.plugin",["cesium.market.app.controllers","cesium.market.join.controllers","cesium.market.login.controllers","cesium.market.search.controllers","cesium.market.record.controllers","cesium.market.wallet.controllers","cesium.market.category.controllers","cesium.market.wot.controllers","cesium.market.document.controllers","cesium.market.services"]).run(["csConfig","Modals","mkModals",function(e,n,t){e.plugins&&e.plugins.market&&e.plugins.market.enable&&(console.debug("[plugin] [market] Override login and join modals"),n.showLogin=t.showLogin,n.showJoin=t.showJoin)}]),angular.module("cesium.market.modal.services",["cesium.modal.services"]).factory("mkModals",["ModalUtils",function(e){return{showHelp:function(n){return e.show("plugins/market/templates/help/modal_help.html","HelpModalCtrl",n)},showJoin:function(n){return e.show("plugins/market/templates/join/modal_join.html","MkJoinModalCtrl",n)},showLogin:function(n){return e.show("plugins/market/templates/login/modal_login.html","MarketLoginModalCtrl",n)},showEventLogin:function(n){return e.show("plugins/market/templates/login/modal_event_login.html","MarketEventLoginModalCtrl",n)}}}]),angular.module("cesium.market.record.services",["ngResource","cesium.services","cesium.es.services","cesium.market.settings.services"]).factory("mkRecord",["$q","csSettings","BMA","csConfig","esHttp","esComment","esGeo","csWot","csCurrency","mkSettings",function(e,n,t,i,a,o,s,r,l,c){return function(){var n={commons:["category","title","description","issuer","time","creationTime","location","address","city","price","unit","currency","thumbnail._content_type","picturesCount","type","stock","fees","feesCurrency","geoPoint"]},t={_internal:{}},i={localSale:{excludes:["cat2","cat3","cat4","cat5","cat7","cat28","cat71","cat8","cat66","cat56","cat31","cat48"]}};function u(n){(n=n||{}).filter=angular.isDefined(n.filter)?n.filter:void 0;var a=t._internal.filteredCategories&&t._internal.filteredCategories[n.filter];if(a&&a.length){var o=e.defer();return o.resolve(a),o.promise}var s=n.filter&&i[n.filter]&&i[n.filter].excludes,r=s&&function(e){return _.contains(s,e)};return t._internal.category.all().then((function(e){if(0===e.hits.total)return[];var i=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,r&&(t.parent&&r(t.parent)||r(t.id))?e:e.concat(t)}),[]);return _.forEach(i,(function(e){i[e.id]=e})),t._internal.filteredCategories=t._internal.filteredCategories||{},t._internal.filteredCategories[n.type]=i,i}))}function d(e,n,t,i){i=i||{};var o=e._source;return o.category&&o.category.id&&(o.category=n[o.category.id]),o.price&&i.convertPrice&&t&&"UD"===o.unit&&(o.price=o.price*t),o.fees&&i.convertPrice&&t&&(!o.feesCurrency||o.feesCurrency===o.currency)&&"UD"===o.unit&&(o.fees=o.fees*t),i.html&&e.highlight?(e.highlight.title&&(o.title=e.highlight.title[0]),e.highlight.description?o.description=e.highlight.description[0]:o.description=a.util.parseAsHtml(o.description,{tagState:"app.market_lookup"}),e.highlight.location&&(o.location=e.highlight.location[0]),e.highlight.city&&(o.city=e.highlight.city[0]),o.category&&e.highlight["category.name"]&&(o.category.name=e.highlight["category.name"][0])):i.html&&(o.description=a.util.parseAsHtml(o.description,{tagState:"app.market_lookup"})),o.thumbnail=a.image.fromHit(e,"thumbnail"),e._source.pictures&&e._source.pictures.reduce&&(o.pictures=e._source.pictures.reduce((function(e,n){return n&&n.file?e.concat(a.image.fromAttachment(n.file)):e}),[])),o.location&&!o.city&&(o.city=o.location),o}return t._internal.record={postSearch:a.post("/market/record/_search")},t._internal.category={get:a.get("/market/category/:id"),all:a.get("/market/category/_search?sort=order&size=1000&_source=name,parent"),search:a.post("/market/category/_search")},t._internal.searchText=a.get("/market/record/_search?q=:search"),t._internal.search=a.post("/market/record/_search"),t._internal.get=a.get("/market/record/:id"),t._internal.getCommons=a.get("/market/record/:id?_source="+n.commons.join(",")),t.category={all:function(){if(t._internal.categories&&t._internal.categories.length){var n=e.defer();return n.resolve(t._internal.categories),n.promise}return t._internal.category.all().then((function(e){if(0===e.hits.total)t._internal.categories=[];else{var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[]);_.forEach(n,(function(e){n[e.id]=e})),t._internal.categories=n}return t._internal.categories}))},filtered:u,get:function(e){return t._internal.category.get(e).then((function(e){var n=e._source;return n.id=e._id,n}))},searchText:a.get("/market/category/_search?q=:search"),search:a.post("/market/category/_search"),stats:function n(i){if(!(i=i||{}).currencies)return c.currencies().then((function(e){return i.currencies=e,n(i)}));var a={size:0,aggs:{category:{nested:{path:"category"},aggs:{by_id:{terms:{field:"category.id",size:1e3}}}}}},o=[],s=[];if(i.withStock&&o.push({range:{stock:{gt:0}}}),!i.withOld){var r=i.minTime?i.minTime:Date.now()/1e3-31536e3;r=60*Math.floor(r/60/60)*60,o.push({range:{time:{gte:r}}})}i.currencies&&i.currencies.length&&o.push({terms:{currency:i.currencies}}),(s.length||o.length)&&(a.query={bool:{}},s.length&&(a.query.bool.should=s),o.length&&(a.query.bool.filter=o));var l={request_cache:!angular.isDefined(i.cache)||i.cache};return e.all([u(i),t._internal.record.postSearch(a,l)]).then((function(e){var n=e[0],t=(e=e[1]).aggregations.category&&e.aggregations.category.by_id&&e.aggregations.category.by_id.buckets||[],i={};return t.forEach((function(e){var t=n[e.key];t&&(i[e.key]=e.doc_count,t.parent&&(i[t.parent]=(i[t.parent]||0)+e.doc_count))})),n.reduce((function(e,n){return e.concat(angular.merge({count:i[n.id]||0},n))}),[])})).then((function(e){var n=_.groupBy(e,(function(e){return e.parent||"roots"}));return _.forEach(n.roots,(function(e){e.children=n[e.id]})),n.roots})).catch((function(e){console.error(e)}))}},t.record={search:function(i){return(i=i||{}).from=i.from||0,i.size=i.size||20,i._source=i._source||n.commons,i.highlight=i.highlight||{fields:{title:{},description:{},"category.name":{},tags:{}}},e.all([t.category.all(),l.currentUD().then((function(e){return e})).catch((function(e){return console.error(e),1})),t._internal.search(i)]).then((function(e){var n=e[0],t=e[1];if(!(e=e[2])||!e.hits||!e.hits.total)return{total:0,hits:[]};var o=a.util.findObjectInTree(i.query,"geo_distance"),r=o&&o.geoPoint,l=o&&o.distance&&o.distance.replace(new RegExp("[0-9 ]+","gm"),""),c=e.hits.hits.reduce((function(e,i){var a=d(i,n,t,{convertPrice:!0,html:!0});return a.id=i._id,r&&a.geoPoint&&l&&(a.distance=s.point.distance(r.lat,r.lon,a.geoPoint.lat,a.geoPoint.lon,l)),e.concat(a)}),[]);return{total:e.hits.total,hits:c}}))},load:function(n,i){return(i=i||{}).fetchPictures=!angular.isDefined(i.fetchPictures)||i.fetchPictures,i.convertPrice=!!angular.isDefined(i.convertPrice)&&i.convertPrice,e.all([t.category.all(),l.currentUD().catch((function(e){return console.error("Could not get current UD",e),1})),i.fetchPictures?t._internal.get({id:n}):t._internal.getCommons({id:n})]).then((function(e){var n=e[0],t=e[1],a=e[2],o=d(a,n,t,i);return r.extend({pubkey:o.issuer}).then((function(e){var n={id:a._id,issuer:e,record:o};return o.price&&!o.currency?c.currencies().then((function(e){return o.currency=e&&e[0],n})):n}))}))},setStock:function(e,n){return t._internal.get({id:e}).then((function(i){if(i&&i._source){var a=i._source;return a.stock=n||0,a.id=e,t.record.update(a,{id:e})}}))},pictures:function(e){var n={from:(e=e||{}).from||0,size:e.size||20,_source:e._source||["category","title","price","unit","currency","city","pictures","stock","unitbase","description","type"]},i=[],a=[];if(e.category&&a.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.category}}}}}}),e.categories&&a.push({nested:{path:"category",query:{bool:{filter:{terms:{"category.id":e.categories}}}}}}),e.withStock&&a.push({range:{stock:{gt:0}}}),!e.withOld){var o=e.minTime?e.minTime:Date.now()/1e3-31536e3;o=60*Math.floor(o/60/60)*60,a.push({range:{time:{gte:o}}})}return e.currencies&&e.currencies.length&&a.push({terms:{currency:e.currencies}}),(i.length||a.length)&&(n.query={bool:{}},i.length&&(n.query.bool.should=i),a.length&&(n.query.bool.filter=a)),t.record.search(n).then((function(e){return(e.hits||[]).reduce((function(e,n){return n.pictures&&n.pictures.length?(angular.merge(n,n.pictures[0]),delete n.pictures,delete n.thumbnail,e.concat(n)):e}),[])}))},add:a.record.post("/market/record"),update:a.record.post("/market/record/:id/_update"),remove:a.record.remove("market","record"),moreLikeThis:function(i,a){var o=(a=a||{}).size||6,s={from:a.from||0,size:2*o,_source:a._source||n.commons,query:{more_like_this:{fields:["title","category.name","type","city"],like:[{_index:"market",_type:"record",_id:i}],min_term_freq:1,max_query_terms:12}}};if(a.type||a.category||a.city){var c={};a.type&&(c.type=a.type),a.category&&(c.category={id:a.category}),a.city&&(c.city=a.city),s.query.more_like_this.like.push({_index:"market",_type:"record",doc:c})}var u=Date.now()/1e3-31536e3,p=[],m=function(e,n,i,a){if(!a||!a.hits||!a.hits.total)return{total:0,hits:[]};var o=a.hits.hits.reduce((function(t,a,o){if(o>=i)return t;var s=d(a,e,n,{convertPrice:!0,html:!0});return s.id=a._id,0===s.stock?t:(s.time||s.creationTime)<u?(p.push(s),t):t.concat(s)}),[]);if(o.length<i){var r=i-o.length;if(s.from<a.hits.total)return s.from+=i,s.size=r,t._internal.search(s).then((function(t){return m(e,n,r,t)})).then((function(e){return{total:a.hits.total,hits:o.concat(e.hits||[])}}));p.length>0&&(p.length>r&&p.splice(r),o=o.concat(p))}return{total:a.hits.total,hits:o}};return e.all([t.category.all(),l.currentUD().catch((function(e){return console.error("Could not get current UD",e),1})),t._internal.search(s)]).then((function(e){var n=e[0],t=e[1];return e=e[2],m(n,t,o,e)})).then((function(e){return r.extendAll(e.hits,"issuer").then((function(n){return e}))}))},fields:{commons:n.commons},picture:{all:a.get("/market/record/:id?_source=pictures")},comment:o.instance("market"),like:{add:a.like.add("market","record"),remove:a.like.remove("market","record"),toggle:a.like.toggle("market","record"),count:a.like.count("market","record")}},t}()}]),angular.module("cesium.market.wallet.services",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.market&&e.registerEagerLoadingService("mkWallet")}]).factory("mkWallet",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","$translate","UIUtils","csSettings","csWallet","csWot","BMA","Device","SocialUtils","CryptoUtils","esWallet","esProfile","esSubscription",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g,h,b,f){var T,v,O;function R(e){e.profile=void 0,e.name=void 0,T=void 0,v=void 0}function N(e,t){if(t=t||n.defer(),!e||!e.pubkey||!e.keypair)return t.resolve(),t.promise;if(e.name)return t.resolve(e),t.promise;var a=Date.now();return console.debug("[market] [wallet] Checking user profile..."),b.get(e.pubkey).then((function(i){return i?(e.name=i.name,e.avatar=i.avatar,e.profile=i.source,void(e.profile.description=i.description)):T?function(e){if(T){var t=Date.now();return console.debug("[market] [wallet] Saving user profile..."),e.profile=e.profile||{},angular.merge(e.profile,T),h.box.getKeypair().then((function(t){return n.all([r("MARKET.PROFILE.DEFAULT_TITLE",{pubkey:e.pubkey}),E.pack(angular.copy(e.profile.socials||[]),t)])})).then((function(n){var t=n[0],i=n[1];e.name=e.profile.title||t,e.profile.title=e.name,e.profile.issuer=e.pubkey;var a=angular.copy(e.profile);return a.socials=i,b.add(a)})).then((function(){T=void 0,console.info("[market] [wallet] Saving user profile in {0}ms".format(Date.now()-t))})).catch((function(e){throw T=void 0,console.error("[market] [wallet] Error while saving new profile",e),e}))}}(e):(l.alert.error("MARKET.ERROR.INVALID_LOGIN_CREDENTIALS"),t.reject("RETRY"),t.promise)})).then((function(){return function(e){if(v)return i.network.peering.self().then((function(e){if(e&&e.pubkey){var n=angular.merge({type:"email",recipient:e.pubkey,content:{locale:c.data.locale.id,frequency:"daily"}},v);if("email"!==n.type||n.content.email)return f.record.add(n,u);console.warn("Missing email attribute (subscription content). Cannot subscribe!")}})).then((function(){e.subscriptions=e.subscriptions||{count:0},e.subscriptions.count++,v=void 0})).catch((function(e){throw v=void 0,console.error("[market] [wallet] Error while saving new subscription",e),e}))}(e)})).then((function(){console.info("[market] [wallet] Checked user profile in {0}ms".format(Date.now()-a)),t.resolve(e)})).catch((function(e){t.reject(e)})),t.promise}function I(e,t){return(t=t||n.defer()).resolve(),t.promise}function S(){var n=i.alive;if(!n&&O&&O.length>0){if(console.debug("[ES] [user] Disable"),_.forEach(O,(function(e){e()})),O=[],u.isLogin())return R(u.data)}else if(n&&(!O||0===O.length)&&(console.debug("[ES] [user] Enable"),function(){O=[u.api.data.on.loginCheck(e,N,this),u.api.data.on.finishLoad(e,I,this),u.api.data.on.init(e,R,this),u.api.data.on.reset(e,R,this)]}(),u.isLogin()))return N(u.data)}return m.ready().then((function(){return i.api.node.on.start(e,S,this),i.api.node.on.stop(e,S,this),S()})),this.setDefaultProfile=function(e){T=angular.copy(e)},this.setDefaultSubscription=function(e){v=angular.copy(e)},this}]),angular.module("cesium.market.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("mkSettings")}]).factory("mkSettings",["$rootScope","$q","$timeout","$ionicHistory","Api","esHttp","csConfig","csSettings","esSettings","csCurrency",function(e,n,t,i,a,o,s,r,l,c){var u,d=angular.merge({plugins:{market:{enable:!0,geoDistance:"100km",cesiumApi:{enable:!0,baseUrl:"https://g1.duniter.fr/api"}},converse:{jid:"anonymous.duniter.org",bosh_service_url:"https://chat.duniter.org/http-bind/",auto_join_rooms:["gchange@muc.duniter.org"]}}},{plugins:{market:s.plugins&&s.plugins.market||{}}},{plugins:{converse:s.plugins&&s.plugins.converse||{}}}),p=this,m=n.defer();function E(e,t){return t=t||n.defer(),e.plugins=e.plugins||{},e.plugins.market={},angular.merge(e,d),t.resolve(e),t.promise}function g(e){var t,i,a;i="0.5.0",a=(t=e.version)&&t.split("."),t=a&&3==a.length?{major:parseInt(a[0]),minor:parseInt(a[1]),build:parseInt(a[2])}:{},i=(a=i&&i.split("."))&&3==a.length?{major:parseInt(a[0]),minor:parseInt(a[1]),build:parseInt(a[2])}:{},(t.major!=i.major?t.major<i.major?-1:1:t.minor!=i.minor?t.minor<i.minor?-1:1:t.build!=i.build?t.build<i.build?-1:1:0)<=0&&e.plugins&&e.plugins.market&&(console.info("[market] [settings] Detected version previous <= 0.5.0 - restoring default settings..."),delete e.login,e.plugins.market=angular.copy(d.plugins.market)),e.plugins.es.document=e.plugins.es.document||{},e.plugins.es.document.index="user,page,group,market",e.plugins.es.document.type="profile,record,comment",function(e,t){if(t=t||n.defer(),p.enable){if(p.raw.currencies=e.plugins.market.currencies,p.raw.currencies||!e.plugins.market.defaultCurrency)return c.get().then((function(e){p.raw.currencies=[e.name],console.debug("[market] [settings] Currencies: ",p.raw.currencies),t&&t.resolve(p.raw.currencies)})).catch((function(e){if(!t)throw e;t.reject(e)}));p.raw.currencies=[e.plugins.market.defaultCurrency],console.debug("[market] [settings] Currencies: ",p.raw.currencies),t&&t.resolve(p.raw.currencies)}else p.raw.currencies=[],t&&t.resolve(p.raw.currencies);t.promise}(e)}return l.setPluginSaveSpecs("market",{includes:["geoDistance"],excludes:["enable","homeMessage","defaultTags","defaultAdminPubkeys","record"],cesiumApi:{}}),p.raw={currencies:void 0},p.isEnable=function(e){return(e=e||r.data).plugins&&e.plugins.es&&e.plugins.es.enable&&e.plugins.market&&e.plugins.market.enable},p.currencies=function(){return m?m.promise.then((function(){return p.raw.currencies})):n.when(p.raw.currencies)},p.ready=function(){return m?m.promise:n.when()},l.api.state.on.changed(e,(function(n){(n=n&&p.isEnable())!==p.enable&&(p.enable=n,n?(console.debug("[market] [settings] Enable"),function(){u=[r.api.data.on.reset(e,E,this),r.api.data.on.changed(e,g,this)]}()):(console.debug("[market] [settings] Disable"),_.forEach(u,(function(e){e()})),u=[]),g(r.data),m&&(m.resolve(),m=null))})),p}]),angular.module("cesium.market.converse.services",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.market&&e.registerEagerLoadingService("mkConverse")}]).factory("mkConverse",["$rootScope","$q","$timeout","$translate","esHttp","UIUtils","csConfig","csWallet","Device","csSettings",function(e,n,t,i,a,o,s,r,l,c){var u,d=!1;function p(e){e.xmpp=null}function m(e,a){var r;if(e.name){if(!d)if(d=!0,s.plugins&&s.plugins.converse&&s.plugins.converse.enable)if(o.screen.isSmall())console.debug("[market] [converse] Disabled on small screen"),d=!0;else{var l=e.name?(r=e.name)?String(r).replace(/[^a-zA-Z0-9]+/gm,""):"":e.pubkey.substring(0,8),u=(new Date).getTime();console.debug("[market] [converse] Starting Chatroom with username {"+l+"}..."),converse.plugins.add("gchange-plugin",{initialize:function(){var e=this._converse;n.all([e.api.waitUntil("chatBoxesFetched"),e.api.waitUntil("roomsPanelRendered")]).then((function(){console.debug("[market] [converse] Chatroom started in "+((new Date).getTime()-u)+"ms")}))}});var p=angular.merge({allow_muc_invitations:!1,auto_login:!0,allow_logout:!0,authentication:"anonymous",jid:"anonymous.duniter.org",auto_away:300,auto_join_on_invite:!0,auto_reconnect:!0,minimized:!0,auto_join_rooms:["gchange@muc.duniter.org"],blacklisted_plugins:["converse-mam","converse-otr","converse-register","converse-vcard"],whitelisted_plugins:["gchange-plugin"],bosh_service_url:"https://chat.duniter.org/http-bind/",allow_registration:!1,show_send_button:!1,muc_show_join_leave:!1,notification_icon:"img/logo.png",i18n:i.use()},c.data.plugins&&c.data.plugins.converse||{});p.auto_join_rooms=_.map(p.auto_join_rooms||[],(function(e){return"string"==typeof e?{jid:e,nick:l}:(e.nick=l,e.minimized=!0,e)})),converse.initialize(p).catch(console.error)}else console.debug("[market] [converse] Disabled by config (property 'plugins.converse.enable')"),d=!0}else t((function(){return m(e)}),1e3);return a?a.resolve()&&a.promise:n.when()}function E(){var n=a.alive;if(!n&&u&&u.length>0){if(console.debug("[market] [converse] Disable"),_.forEach(u,(function(e){e()})),u=[],r.isLogin())return p(r.data)}else if(n&&(!u||0===u.length)&&(console.debug("[market] [converse] Enable"),function(){u=[r.api.data.on.login(e,m,this),r.api.data.on.init(e,p,this),r.api.data.on.reset(e,p,this)]}(),r.isLogin()))return m(r.data)}return l.ready().then((function(){return a.api.node.on.start(e,E,this),a.api.node.on.stop(e,E,this),E()})),this.setDefaultProfile=function(e){angular.copy(e)},this}]),le.$inject=["$scope","esSettings","PluginService"],ce.$inject=["$scope","$rootScope","$state","$controller","$focus","$timeout","$translate","ModalUtils","UIUtils","csConfig","esSettings","mkModals"],angular.module("cesium.market.app.controllers",["ngResource","cesium.es.services","cesium.market.modal.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&(e.extendState("app",{points:{"menu-main":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"}}}),e.extendState("app.home",{points:{buttons:{templateUrl:"plugins/market/templates/home/home_extend.html",controller:"MarketHomeExtendCtrl"}}}))}]).controller("MarketMenuExtendCtrl",le).controller("MarketHomeExtendCtrl",ce),angular.module("cesium.market.join.controllers",["cesium.services","cesium.market.services"]).controller("MkJoinModalCtrl",["$scope","$timeout","$state","UIUtils","CryptoUtils","csSettings","csWallet","csCurrency","mkWallet","mkModals",function(e,n,t,i,a,o,s,r,l,c){e.emailPattern="^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,6}$",e.formData={pseudo:"",description:void 0,email:void 0},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.showUsername=!1,e.showPassword=!1,e.smallscreen=i.screen.isSmall(),e.enter=function(){r.get().then((function(n){e.currency=n}))},e.$on("modal.shown",e.enter),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes(),e.isLastSlide=!1},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes(),e.isLastSlide=e.slides.slider.activeIndex===e.slides.slider.slides.length-1},e.showAccountPubkey=function(){e.formData.pubkey||(e.formData.computing=!0,a.scryptKeypair(e.formData.username,e.formData.password).then((function(n){e.formData.pubkey=a.util.encode_base58(n.signPk),e.formData.computing=!1})).catch((function(n){e.formData.computing=!1,console.error(">>>>>>>",n),i.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")})))},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.doNext=function(n){if(!n)switch(e.slides.slider.activeIndex){case 0:n="saltForm";break;case 1:n="passwordForm";break;case 2:n="profileForm"}if(n){if(e[n].$submitted=!0,!e[n].$valid)return;"passwordForm"===n||"pseudoForm"===n?(e.slideNext(),e.showAccountPubkey()):e.slideNext()}},e.doNewAccount=function(n){return n?(i.loading.show(),l.setDefaultProfile({title:e.formData.title,description:e.formData.description}),e.formData.email&&l.setDefaultSubscription({type:"email",content:{email:e.formData.email}}),o.data.wallet=o.data.wallet||{},o.data.wallet.alertIfUnusedWallet=!1,s.login(e.formData.username,e.formData.password).catch(i.onError("ERROR.CRYPTO_UNKNOWN_ERROR")).then(e.closeModal).then((function(){return t.go("app.view_wallet")}))):i.alert.confirm("MARKET.JOIN.CONFIRMATION_WALLET_ACCOUNT").then((function(n){n&&e.doNewAccount(!0)}))},e.showHelpModal=function(n){return n||(n=1==e.slides.slider.activeIndex?"join-salt":2==e.slides.slider.activeIndex?"join-password":void 0),c.showHelp({anchor:n})}}]),de.$inject=["$scope","$controller","$q","csConfig","csWallet","mkWallet"],ue.$inject=["$scope","$controller"],angular.module("cesium.market.login.controllers",["cesium.services"]).controller("MarketEventLoginModalCtrl",de).controller("MarketLoginModalCtrl",ue),pe.$inject=["$scope","$state","$filter","$q","$location","$translate","$controller","$timeout","UIUtils","esHttp","ModalUtils","csConfig","csSettings","mkRecord","BMA","mkSettings","esProfile"],me.$inject=["$scope","$rootScope","$controller","$focus","$timeout","$ionicPopover","mkRecord","csSettings"],Ee.$inject=["$scope","csConfig","$q","$ionicScrollDelegate","$ionicSlideBoxDelegate","$ionicModal","$interval","mkRecord"],angular.module("cesium.market.search.controllers",["cesium.market.record.services","cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){e.state("app.market_lookup",{url:"/market?q&category&location&reload&type&hash&lat&lon&last&old",views:{menuContent:{templateUrl:"plugins/market/templates/search/lookup.html",controller:"MkLookupCtrl"}},data:{large:"app.market_lookup_lg",silentLocationChange:!0}}).state("app.market_lookup_lg",{url:"/market/lg?q&category&location&reload&type&hash&closed&lat&lon&last&old",views:{menuContent:{templateUrl:"plugins/market/templates/search/lookup_lg.html",controller:"MkLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.market_gallery",{cache:!0,url:"/gallery/market",views:{menuContent:{templateUrl:"plugins/market/templates/gallery/view_gallery.html",controller:"MkViewGalleryCtrl"}}})}]).controller("MkLookupAbstractCtrl",pe).controller("MkLookupCtrl",me).controller("MkViewGalleryCtrl",Ee),ge.$inject=["$scope","$rootScope","$anchorScroll","$ionicPopover","$state","$ionicHistory","$q","$controller","$timeout","$filter","$translate","UIUtils","Modals","csConfig","csCurrency","csWallet","esModals","esProfile","esHttp","mkRecord"],he.$inject=["$scope","$rootScope","$q","$state","$ionicPopover","$timeout","mkRecord","$ionicHistory","$focus","$controller","UIUtils","ModalUtils","csConfig","esHttp","csSettings","csCurrency","mkSettings"],angular.module("cesium.market.record.controllers",["cesium.market.record.services","cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){e.state("app.market_view_record",{url:"/market/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/market/templates/record/view_record.html",controller:"MkRecordViewCtrl"}}}).state("app.market_view_record_anchor",{url:"/market/view/:id/:title/:anchor?refresh",views:{menuContent:{templateUrl:"plugins/market/templates/record/view_record.html",controller:"MkRecordViewCtrl"}}}).state("app.market_add_record",{cache:!1,url:"/market/add/:type",views:{menuContent:{templateUrl:"plugins/market/templates/record/edit_record.html",controller:"MkRecordEditCtrl"}}}).state("app.market_edit_record",{cache:!1,url:"/market/edit/:id/:title",views:{menuContent:{templateUrl:"plugins/market/templates/record/edit_record.html",controller:"MkRecordEditCtrl"}}})}]).controller("MkRecordViewCtrl",ge).controller("MkRecordEditCtrl",he),be.$inject=["$scope","$controller","UIUtils"],angular.module("cesium.market.wallet.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendState("app.view_wallet",{points:{general:{templateUrl:"plugins/market/templates/wallet/view_wallet_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.market_wallet_records",{url:"/records/wallet",views:{menuContent:{templateUrl:"plugins/market/templates/wallet/view_wallet_records.html",controller:"MkWalletRecordsCtrl"}}})}]).controller("MkWalletRecordsCtrl",be),fe.$inject=["$scope","UIUtils","csConfig","mkRecord"],_e.$inject=["$scope","$controller","$state"],angular.module("cesium.market.category.controllers",["cesium.market.record.services","cesium.services"]).config(["$stateProvider",function(e){e.state("app.market_categories",{url:"/market/categories",views:{menuContent:{templateUrl:"plugins/market/templates/category/view_categories.html",controller:"MkViewCategoriesCtrl"}},data:{large:"app.market_categories_lg"}}).state("app.market_categories_lg",{url:"/market/categories/lg",views:{menuContent:{templateUrl:"plugins/market/templates/category/view_categories_lg.html",controller:"MkViewCategoriesCtrl"}}})}]).controller("MkListCategoriesCtrl",fe).controller("MkViewCategoriesCtrl",_e),Te.$inject=["$scope","$controller","UIUtils"],angular.module("cesium.market.wot.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendStates(["app.wot_identity","app.wot_identity_uid"],{points:{general:{templateUrl:"plugins/market/templates/wot/view_identity_extend.html",controller:"ESExtensionCtrl"},"after-general":{templateUrl:"plugins/market/templates/wot/view_identity_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.market_identity_records",{url:"/market/records/:pubkey",views:{menuContent:{templateUrl:"plugins/market/templates/wot/view_identity_records.html",controller:"MkIdentityRecordsCtrl"}}})}]).controller("MkIdentityRecordsCtrl",Te),ve.$inject=["$scope","$controller","$timeout","$state","$filter"],angular.module("cesium.market.document.controllers",["cesium.es.services"]).controller("MkLastDocumentsCtrl",ve),angular.module("cesium.graph.plugin",["cesium.graph.services","cesium.graph.common.controllers","cesium.graph.docstats.controllers","cesium.graph.synchro.controllers","cesium.graph.network.controllers"]),angular.module("cesium.graph.services",["cesium.graph.color.services","cesium.graph.data.services"]),angular.module("cesium.graph.data.services",["cesium.es.http.services"]).factory("gpData",["$rootScope","$q","$timeout","esHttp","BMA","csCache",function(e,n,t,i,a,o){o.get("gpData-currency-",o.constants.SHORT);var s={node:{},wot:{},blockchain:{},docstat:{},synchro:{execution:{}},raw:{block:{search:i.post("/:currency/block/_search")},blockstat:{search:i.post("/:currency/blockstat/_search")},movement:{search:i.post("/:currency/movement/_search")},user:{event:i.post("/user/event/_search?pretty")},docstat:{search:i.post("/document/stats/_search")},synchro:{search:i.post("/:currency/synchro/_search")}},regex:{}};function r(e){return(e=e||{}).maxRangeSize=e.maxRangeSize||30,e.defaultTotalRangeCount=e.defaultTotalRangeCount||2*e.maxRangeSize,e.rangeDuration=e.rangeDuration||"day",e.endTime=e.endTime||moment().utc().add(1,e.rangeDuration).unix(),e.startTime=e.startTime||moment.unix(e.endTime).utc().subtract(e.defaultTotalRangeCount,e.rangeDuration).unix(),e.firstBlockTime&&e.startTime<e.firstBlockTime&&(e.startTime=e.firstBlockTime),e}return s.docstat.get=function(e){e=r(e);for(var t=[],i=moment.unix(e.startTime).utc().startOf(e.rangeDuration),a=moment.unix(e.endTime).utc().startOf(e.rangeDuration),o=[],l=function(e){var n=e.aggregations;return(n.range&&n.range.buckets||[]).reduce((function(e,n){var t={from:n.from,to:n.to};return _.forEach(n.index&&n.index.buckets||[],(function(e){var n=e.key;_.forEach(e.type&&e.type.buckets||[],(function(e){var i=n+"_"+e.key;t[i]=e.max.value,u[i]||(u[i]=!0)}))})),e.concat(t)}),[])};i.isBefore(a);)if(o.push({from:i.unix(),to:i.add(1,e.rangeDuration).unix()}),o.length===e.maxRangeSize||!i.isBefore(a)){var c={size:0,aggs:{range:{range:{field:"time",ranges:o},aggs:{index:{terms:{field:"index",size:0},aggs:{type:{terms:{field:"type",size:0},aggs:{max:{max:{field:"count"}}}}}}}}}};o=[];var u={},d={request_cache:!angular.isDefined(e.cache)||e.cache};10===t.length?(console.error("Too many parallel jobs!"),i=moment.unix(e.endTime).utc()):t.push(s.raw.docstat.search(c,d).then(l))}return n.all(t).then((function(e){return e=e.reduce((function(e,n){return n&&n.length?e.concat(n):e}),[]),e=_.sortBy(e,"from"),_.keys(u).reduce((function(n,t){return n[t]=_.pluck(e,t),n}),{times:_.pluck(e,"from")})}))},s.synchro.execution.get=function(e){e=r(e);for(var t=[],i=moment.unix(e.startTime).utc().startOf(e.rangeDuration),a=moment.unix(e.endTime).utc().startOf(e.rangeDuration),o=[],l=function(e){var n=e.aggregations;return(n.range&&n.range.buckets||[]).reduce((function(e,n){var t={from:n.from,to:n.to,inserts:n.result.inserts.value,updates:n.result.inserts.value,deletes:n.result.deletes.value,duration:n.duration.value};return _.forEach(n.api&&n.api.buckets||[],(function(e){t[e.key]=e.peer_count&&e.peer_count.value||0,u[e.key]||(u[e.key]=!0)})),e.concat(t)}),[])};i.isBefore(a);)if(o.push({from:i.unix(),to:i.add(1,e.rangeDuration).unix()}),o.length===e.maxRangeSize||!i.isBefore(a)){var c={size:0,aggs:{range:{range:{field:"time",ranges:o},aggs:{api:{terms:{field:"api",size:0},aggs:{peer_count:{cardinality:{field:"peer"}}}},duration:{sum:{field:"executionTime"}},result:{nested:{path:"result"},aggs:{inserts:{sum:{field:"result.inserts"}},updates:{sum:{field:"result.updates"}},deletes:{sum:{field:"result.deletes"}}}}}}}};o=[];var u={};10===t.length?(console.error("Too many parallel jobs!"),i=moment.unix(e.endTime).utc()):t.push(s.raw.synchro.search(c,{currency:e.currency}).then(l))}return n.all(t).then((function(e){e=e.reduce((function(e,n){return n&&n.length?e.concat(n):e}),[]),e=_.sortBy(e,"from");var n={times:_.pluck(e,"from"),inserts:_.pluck(e,"inserts"),updates:_.pluck(e,"updates"),deletes:_.pluck(e,"deletes"),duration:_.pluck(e,"duration")};return _.keys(u).forEach((function(t){n[t]=_.pluck(e,t)})),n}))},s}]),angular.module("cesium.graph.color.services",[]).factory("gpColor",(function(){var e={css2Rgb:{white:[255,255,255],assertive:[239,71,58],calm:[17,193,243],positive:[56,126,245],balanced:[51,205,95],energized:[255,201,0],royal:[136,106,234],gray:[150,150,150],stable:[248,248,248]}},n={scale:{}};return n.scale.custom=function(e,n,t,i){function a(e){switch(e){case 0:return 0;case 1:return-1;case 2:return 0;case 3:return 1}}n=n>0&&n||.55;for(var o=Math.round(e/2.5),s=t&&3==t.length?angular.copy(t):[255,0,0],r=i&&3==i.length?angular.copy(i):[0,2,3],l=t?[Math.round(255/o),Math.round(255/o),Math.round(255/o)]:[Math.round((s[0]-50)/o),Math.round((255-s[1])/o),Math.round((255-s[2])/o)],c=[a(r[0]),a(r[1]),a(r[2])],u=[0,0,0],d=[],p=0;p<e;p++){for(var m=0;m<3;m++)s[m]+=c[m]*l[m],u[m]++,((s[m]<=0||s[m]>=255)&&0!==c[m]||0===c[m]&&u[m]==o)&&(s[m]<=0?s[m]=0:s[m]>=255&&(s[m]=255),r[m]=(r[m]+1)%4,c[m]=a(r[m]),u[m]=0);d.push("rgba("+s[0]+","+s[1]+","+s[2]+","+n+")")}return d},n.scale.default=function(){return n.scale.custom(25)},n.scale.fix=function(e,t){return Array.apply(null,Array(e||25)).map(String.prototype.valueOf,t||n.rgba.calm(.5))},n.rgba=_.mapObject(e.css2Rgb,(function(e){var n="rgba("+e.join(",")+",";return function(t){return!t||t<0?"rgb("+e.join(",")+")":n+t+")"}})),n.rgba.translucent=function(){return"rgb(0,0,0,0)"},n.constants=e,n})),Oe.$inject=["$scope","$filter","$ionicPopover","$ionicHistory","$state","csSettings","csCurrency","UIUtils"],angular.module("cesium.graph.common.controllers",["cesium.services"]).controller("GpCurrencyAbstractCtrl",Oe),Re.$inject=["$scope","$state","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.docstats.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){e.state("app.doc_stats_lg",{url:"/data/stats?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/docstats/view_stats.html",controller:"GpDocStatsCtrl"}}}),t.plugins&&t.plugins.es}]).controller("GpDocStatsCtrl",Re),Ne.$inject=["$scope","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.synchro.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){e.state("app.doc_synchro_lg",{url:"/data/synchro?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/synchro/view_stats.html",controller:"GpSynchroCtrl"}}}),t.plugins&&t.plugins.es}]).controller("GpSynchroCtrl",Ne),Ie.$inject=["$scope","PluginService","esSettings"],Se.$inject=["$scope","$timeout","PluginService","esSettings","csCurrency","gpData"],angular.module("cesium.graph.network.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendState("app.es_network",{points:{buttons:{templateUrl:"plugins/graph/templates/network/view_es_network_extend.html",controller:"GpNetworkViewExtendCtrl"}}}).extendState("app.view_es_peer",{points:{general:{templateUrl:"plugins/graph/templates/network/view_es_peer_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("GpNetworkViewExtendCtrl",Ie).controller("GpPeerViewExtendCtrl",Se),angular.module("cesium.map.plugin",["ui-leaflet","cesium.map.services","cesium.map.user.controllers"]).config((function(){L.AwesomeMarkers.Icon.prototype.options.prefix="ion"})),angular.module("cesium.map.services",["cesium.map.utils.services"]),angular.module("cesium.map.utils.services",["cesium.services","ui-leaflet"]).factory("MapUtils",["$timeout","$q","$translate","leafletData","csConfig","csSettings","esGeo","UIUtils","leafletHelpers",function(e,n,t,i,a,o,s,r,l){var c=a.plugins&&a.plugins.es&&a.plugins.es.googleApiKey;function u(e,n){return l.isSameCenterOnMap(e,n)}return constants={locations:{FRANCE:{lat:46.5588603,lng:4.229736328124999,zoom:6}},LOCALIZE_ZOOM:14},constants.DEFAULT_CENTER=o.data&&o.data.plugins&&o.data.plugins.map&&o.data.plugins.map.center||constants.locations.FRANCE,{map:function(e){var n;return(e=angular.merge({center:angular.copy(constants.DEFAULT_CENTER),defaults:{scrollWheelZoom:!0},layers:{baselayers:{osm:{name:"OpenStreetMap",type:"xyz",url:"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",layerOptions:{subdomains:["a","b","c"],attribution:'© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',continuousWorld:!0}},cycle:{name:"Google map",type:"xyz",url:"http://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key="+c,layerOptions:{subdomains:["mt0","mt1","mt2","mt3"],attribution:'© <a href="http://google.com/copyright">Google</a>',continuousWorld:!0}}}},controls:{custom:[]}},e||{})).layers.overlays&&(n=_.keys(e.layers.overlays).reduce((function(n,t){return n.concat(e.layers.overlays[t].name)}),[]),t(n).then((function(n){_.keys(e.layers.overlays||{}).forEach((function(t){e.layers.overlays[t].name=n[e.layers.overlays[t].name]}))}))),e},center:{get:function(e){var n;if(e&&(e.lat&&((n={}).lat=parseFloat(e.lat)),(e.lng||e.lon)&&((n=n||{}).lng=parseFloat(e.lng||e.lon)),e.zoom&&((n=n||{}).zoom=parseFloat(e.zoom)),n))return l.isValidCenter(n)||(n=angular.merge({},constants.DEFAULT_CENTER,n)),n},isSame:u,isDefault:function(e){var n=constants.DEFAULT_CENTER;return!(!e.lat||!e.lng||n.lat.toFixed(4)!==e.lat.toFixed(4)||n.lng.toFixed(4)!==e.lng.toFixed(4)||n.zoom!==e.zoom)}},updateCenter:function(t,i){return u(i,t)?n.when():e((function(){t.invalidateSize(),t._resetView(i,i.zoom,!0)}),300)},control:{search:function(e){(e=e||{}).initial=!!angular.isDefined(e.initial)&&e.initial,e.marker=!!angular.isDefined(e.marker)&&e.marker,e.propertyName=angular.isDefined(e.propertyName)?e.propertyName:"title",e.position=angular.isDefined(e.position)?e.position:"topleft",e.zoom=angular.isDefined(e.zoom)?e.zoom:constants.LOCALIZE_ZOOM,e.markerLocation=!angular.isDefined(e.markerLocation)||e.markerLocation;var n=t(["MAP.COMMON.SEARCH_DOTS","COMMON.SEARCH_NO_RESULT"]);return{addTo:function(t){n.then((function(n){L.control.search(angular.merge(e,{textPlaceholder:n["MAP.COMMON.SEARCH_DOTS"],textErr:n["COMMON.SEARCH_NO_RESULT"]})).addTo(t)}))}}},localizeMe:function(){return L.easyButton("icon ion-android-locate",(function(e,n){return s.point.current().then((function(e){n.invalidateSize(),n._resetView({lat:e.lat,lng:e.lon},constants.LOCALIZE_ZOOM,!0)})).catch(r.onError("MAP.ERROR.LOCALIZE_ME_FAILED"))}))}},constants:constants}}]),angular.module("cesium.map.user.controllers",["cesium.services","cesium.map.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendState("app.user_edit_profile",{points:{"after-position":{templateUrl:"plugins/map/templates/user/edit_profile_extend.html",controller:"MapEditProfileViewCtrl"}}})}]).controller("MapEditProfileViewCtrl",["$scope","$timeout","$q","MapUtils","$translate",function(e,n,t,i,a){var o=[];e.mapId="map-user-profile-"+e.$id,e.map=i.map({markers:{},center:{zoom:13},defaults:{tileLayerOptions:{attribution:'© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'}}}),e.loading=!0,e.enter=function(t,i){return e.formData&&e.formData.title?(e.loading=!0,e.load()):n(e.enter,500)},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.load=function(){return e.formData.geoPoint&&e.formData.geoPoint.lat&&e.formData.geoPoint.lon?e.map.markers.geoPoint?(e.map.markers.geoPoint.lat=e.formData.geoPoint.lat,void(e.map.markers.geoPoint.lng=e.formData.geoPoint.lon)):a("MAP.PROFILE.MARKER_HELP").then((function(n){e.map.markers.geoPoint={message:n,lat:parseFloat(e.formData.geoPoint.lat),lng:parseFloat(e.formData.geoPoint.lon),draggable:!0,focus:!0},angular.extend(e.map.center,{lat:e.map.markers.geoPoint.lat,lng:e.map.markers.geoPoint.lng});var t=e.$watch("map.markers.geoPoint",(function(){e.loading||e.map.markers.geoPoint&&e.map.markers.geoPoint.lat&&e.map.markers.geoPoint.lng&&(e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=e.map.markers.geoPoint.lat,e.formData.geoPoint.lon=e.map.markers.geoPoint.lng)}),!0);o.push(t),e.ionItemClass||(e.ionItemClass="done in"),e.loading=!1})):(_.forEach(o,(function(e){e()})),o=[],delete e.map.markers.geoPoint,e.loading=!1,t.when())},e.$watch("formData.geoPoint",(function(){e.loading||e.load()}),!0)}]),angular.module("gchange",["ionic","ionic-material","ngMessages","pascalprecht.translate","ngApi","angular-cache","angular.screenmatch","angular.bind.notifier","ImageCropper","ngFileSaver","ngIdle","FBAngular","cesium.plugins","cesium.filters","cesium.config","cesium.platform","cesium.controllers","cesium.templates","cesium.translations","cesium.components","cesium.directives"]).config(["$urlRouterProvider",function(e){e.deferIntercept()}]).run(["$rootScope","$translate","$state","$window","ionicReady","$urlRouter","Device","UIUtils","$ionicConfig","PluginService","csPlatform",function(e,n,t,i,a,o,s,r,l,c,u){u.disableChangeState(),e.$on("$stateChangeStart",(function(n,i,a,o){if(!n.defaultPrevented&&i.data&&!e.tour&&!n.currentScope.tour)return i.data.large&&!r.screen.isSmall()?(n.preventDefault(),void t.go(i.data.large,a)):void 0})),e.$on("$locationChangeSuccess",(function(e,n,i){t.current.data&&!0===t.current.data.silentLocationChange&&i&&i.split("?")[0]===n.split("?")[0]&&e.preventDefault()})),o.listen(),c.start(),a().then((function(){ionic.Platform.isIOS()&&window.StatusBar&&StatusBar.styleLightContent()}))}]),window.ionic.Platform.ready((function(){angular.bootstrap(document,["gchange"])})),angular.module("cesium.components",[]).component("csAvatar",{bindings:{avatar:"<",icon:"@"},template:'<i ng-if="!$ctrl.avatar" class="item-image icon {{$ctrl.icon}}"></i><i ng-if="$ctrl.avatar" class="item-image avatar" style="background-image: url({{::$ctrl.avatar.src}})"></i>'}).component("csBadgeCertification",{bindings:{requirements:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_certification_count.html"}).component("csBadgeGivenCertification",{bindings:{identity:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_given_certification_count.html"}).component("csSortIcon",{bindings:{asc:"=",sort:"=",toggle:"<"},template:'<i class="ion-chevron-up" ng-class="{gray: !$ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative;left : 5px; top:-5px; font-size: 9px;"></i><i class="ion-chevron-down" ng-class="{gray : $ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative; left: -2.6px; top: 3px; font-size: 9px;"></i>'}).component("csRemovableSelectionItem",{transclude:!0,controller:function(){this.$onInit=function(){alert("$onInit called: ",this)},this.remove=function(){alert("remove called: ",this)}},template:'<div > <ng-transclude></ng-transclude> <i class="icon ion-close" ng-click="$ctrl.remove();"></i></div>'}),angular.module("cesium.directives",[]).directive("compareTo",(function(){return{require:"?ngModel",link:function(e,n,t,i){i&&t.compareTo&&(i.$validators.compareTo=function(n){return n==e.$eval(t.compareTo)},e.$watch(t.compareTo,(function(){i.$validate()})))}}})).directive("differentTo",(function(){return{require:"?ngModel",link:function(e,n,t,i){i&&t.differentTo&&(i.$validators.differentTo=function(n){return n!=e.$eval(t.differentTo)},e.$watch(t.differentTo,(function(){i.$validate()})))}}})).directive("numberFloat",(function(){var e=new RegExp("^[0-9]+([.,][0-9]+)?$");return{require:"?ngModel",link:function(n,t,i,a){a&&(a.$validators.numberFloat=function(n){return a.$isEmpty(n)||e.test(n)})}}})).directive("numberInt",(function(){var e=new RegExp("^[0-9]+$");return{require:"ngModel",link:function(n,t,i,a){a&&(a.$validators.numberInt=function(n){return a.$isEmpty(n)||e.test(n)})}}})).directive("email",(function(){var e=new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");return{require:"ngModel",link:function(n,t,i,a){a&&(a.$validators.email=function(n){return a.$isEmpty(n)||e.test(n)})}}})).directive("requiredIf",(function(){return{require:"?ngModel",link:function(e,n,t,i){i&&t.requiredIf&&(i.$validators.required=function(n){return!e.$eval(t.requiredIf)||!i.$isEmpty(n)},e.$watch(t.requiredIf,(function(){i.$validate()})))}}})).directive("geoPoint",(function(){return{require:"?ngModel",link:function(e,n,t,i){i&&(i.$validators.geoPoint=function(e){return i.$isEmpty(e)||angular.isDefined(e.lat)&&angular.isDefined(e.lon)||angular.isUndefined(e.lat)&&angular.isUndefined(e.lon)})}}})).directive("copyOnClick",["$window","$document","Device","UIUtils",function(e,n,t,i){return{restrict:"A",link:function(e,n,a){var o=function(n){var o=a.copyOnClick;if(o&&t.clipboard.enable)t.clipboard.copy(o).then((function(){i.toast.show("INFO.COPY_TO_CLIPBOARD_DONE")})).catch(i.onError("ERROR.COPY_CLIPBOARD"));else if(o){var s=o&&o.indexOf("\n")>=0?o.split("\n").length:1;i.popover.show(n,{scope:e,templateUrl:"templates/common/popover_copy.html",bindings:{value:a.copyOnClick,rows:s},autoselect:".popover-copy "+(s<=1?"input":"textarea")})}};n.bind("click",o),n.bind("hold",o)}}}]).directive("selectOnClick",["$window",function(e){return{restrict:"A",link:function(n,t,i){t.bind("click",(function(){e.getSelection&&!e.getSelection().toString()&&this.value&&this.setSelectionRange(0,this.value.length)}))}}}]).directive("activeLink",["$location",function(e){return{restrict:"A",link:function(n,t,i,a){var o,s=i.activeLink;i.activeLinkPathPrefix?(o=i.activeLinkPathPrefix.substring(1),n.location=e,n.$watch("location.path()",(function(e){e&&0===e.indexOf(o)?t.addClass(s):t.removeClass(s)}))):i.href&&(o=i.href.substring(1),n.location=e,n.$watch("location.path()",(function(e){e&&e==o?t.addClass(s):t.removeClass(s)})))}}}]).directive("input",["$timeout",function(e){return{restrict:"E",scope:{returnClose:"=",onReturn:"&",onFocus:"&",onBlur:"&"},link:function(n,t,i){t.bind("focus",(function(t){n.onFocus&&e((function(){n.onFocus()}))})),t.bind("blur",(function(t){n.onBlur&&e((function(){n.onBlur()}))})),t.bind("keydown",(function(i){13==i.which&&(n.returnClose&&t[0].blur(),n.onReturn&&e((function(){n.onReturn()})))}))}}}]).directive("trustAsHtml",["$sce","$compile","$parse",function(e,n,t){return{restrict:"A",compile:function(i,a){var o=t(a.trustAsHtml),s=t(a.trustAsHtml,(function(e){return(e||"").toString()}));return n.$$addBindingClass(i),function(t,i,a){n.$$addBindingInfo(i,a.trustAsHtml),t.$watch(s,(function(){i.html(e.getTrustedHtml(e.trustAsHtml(o(t)))||""),n(i.contents())(t)}))}}}}]).directive("modalClose",["$ionicHistory","$timeout",function(e,n){return{restrict:"AC",link:function(t,i){i.bind("click",(function(){t.closeModal&&(e.nextViewOptions({historyRoot:!0,disableAnimate:!0,expire:300}),n((function(){e.nextViewOptions({historyRoot:!1,disableAnimate:!1})}),300),t.closeModal())}))}}}]).directive("csExtensionPoint",["$state","$compile","$controller","$templateCache","PluginService",function(e,n,t,i,a){return{restrict:"E",compile:function(e,n){if(angular.isDefined(n.name)){var t=a.extensions.points.getActivesByName(n.name);t.length>0&&(e.html(""),_.forEach(t,(function(n){e.append(function(e){var n=e.templateUrl?i.get(e.templateUrl):e.template;return n?(e.controller&&(n='<ng-controller ng-controller="'+e.controller+'">'+n+"</div>"),n):(console.error("[plugin] Could not found template for extension :"+(e.templateUrl?e.templateUrl:e.template)),"")}(n))})))}return{pre:function(e,n,t){a.extensions.points.current.set(t.name)},post:function(){a.extensions.points.current.set()}}},scope:{content:"="}}}]).directive("onReadFile",["$parse",function(e){return{restrict:"A",scope:!1,link:function(n,t,i){var a=e(i.onReadFile);t.on("change",(function(e){var t=new FileReader,i={name:this.files[0].name,size:this.files[0].size,type:this.files[0].type};t.onload=function(e){n.$applyAsync((function(){a(n,{file:{fileContent:e.target.result,fileData:i}})}))},t.readAsText((e.srcElement||e.target).files[0])}))}}}]).directive("dropzone",["$parse",function(e){return{restrict:"A",scope:!1,link:function(n,t,i){var a=e(i.dropzone);t.bind("dragover",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("dragenter",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("dragleave",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("drop",(function(e){e.stopPropagation(),e.preventDefault();var t={name:e.dataTransfer.files[0].name,size:e.dataTransfer.files[0].size,type:e.dataTransfer.files[0].type},i=new FileReader;i.onload=function(e){n.$apply((function(){a(n,{file:{fileContent:e.target.result,fileData:t}})}))},i.readAsText(e.dataTransfer.files[0])}))}}}]),angular.module("cesium.filters",["cesium.config","cesium.platform","pascalprecht.translate","cesium.translations"]).service("filterTranslations",["$rootScope","csPlatform","csSettings","$translate",function(e,n,t,i){var a,o=!1,s=this;function r(){return console.debug("[filter] Loading translations for locale [{0}]".format(i.use())),i(["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.UD"]).then((function(e){s.DATE_PATTERN=e["COMMON.DATE_PATTERN"],"COMMON.DATE_PATTERN"===s.DATE_PATTERN&&(s.DATE_PATTERN="YYYY-MM-DD HH:mm"),s.DATE_SHORT_PATTERN=e["COMMON.DATE_SHORT_PATTERN"],"COMMON.DATE_SHORT_PATTERN"===s.DATE_SHORT_PATTERN&&(s.DATE_SHORT_PATTERN="YYYY-MM-DD"),s.DATE_MONTH_YEAR_PATTERN=e["COMMON.DATE_MONTH_YEAR_PATTERN"],"COMMON.DATE_MONTH_YEAR_PATTERN"===s.DATE_MONTH_YEAR_PATTERN&&(s.DATE_MONTH_YEAR_PATTERN="MMM YY"),s.UD=e["COMMON.UD"],"COMMON.UD"===s.UD&&(s.UD="UD")}))}return s.ready=function(){return o?$q.when(data):a||s.start()},s.start=function(){return a=n.ready().then(r).then((function(){o=!0,t.api.locale.on.changed(e,r,this)}))},s.start(),s}]).filter("formatInteger",(function(){return function(e){return e?e<1e7?numeral(e).format("0,0"):numeral(e).format("0,0.000 a"):"0"}})).filter("formatAmount",["csConfig","csSettings","csCurrency","$filter",function(e,n,t,i){var a=1/Math.pow(10,e.decimalCount||2),o="0,0.0"+Array(e.decimalCount||2).join("0"),s=i("currencySymbol");return function(e,i){if(void 0!==e)return(i&&angular.isDefined(i.useRelative)?i.useRelative:n.data.useRelative)?function(e,n){var i=n&&n.currentUD?n.currentUD:t.data.currentUD;if(i){var r=e/i;return r=Math.abs(r)<a&&0!==e?"~ 0":numeral(r).format(o),n&&n.currency?r+" "+s(n.currency,!0):r}console.warn("formatAmount: currentUD not defined")}(e,i):function(e,n){var t=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return n&&n.currency?t+" "+s(n.currency,!1):t}(e,i)}}]).filter("formatAmountNoHtml",["csConfig","csSettings","csCurrency","$filter",function(e,n,t,i){var a=1/Math.pow(10,e.decimalCount||2),o="0,0.0"+Array(e.decimalCount||2).join("0"),s=i("currencySymbolNoHtml");return function(e,i){if(void 0!==e)return(i&&angular.isDefined(i.useRelative)?i.useRelative:n.data.useRelative)?function(e,n){var i=n&&n.currentUD?n.currentUD:t.data.currentUD;if(i){var r=e/i;return r=Math.abs(r)<a&&0!==e?"~ 0":numeral(r).format(o),n&&n.currency?r+" "+s(n.currency,!0):r}console.warn("formatAmount: currentUD not defined")}(e,i):function(e,n){var t=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return n&&n.currency?t+" "+s(n.currency,!1):t}(e,i)}}]).filter("currencySymbol",["filterTranslations","$filter","csSettings",function(e,n,t){return function(i,a){return i?(angular.isDefined(a)?a:t.data.useRelative)?e.UD+"<sub>"+n("abbreviate")(i)+"</sub>":n("abbreviate")(i):""}}]).filter("currencySymbolNoHtml",["filterTranslations","$filter","csSettings",function(e,n,t){return function(i,a){return i?(angular.isDefined(a)?a:t.data.useRelative)?e.UD+" "+n("abbreviate")(i):n("abbreviate")(i):""}}]).filter("formatDecimal",["csConfig","csCurrency",function(e,n){var t=1/Math.pow(10,e.decimalCount||2),i="0,0.0"+Array(e.decimalCount||2).join("0");return function(e){return void 0===e?"0":e===1/0||e===-1/0?(console.warn("formatDecimal: division by zero ? (is currentUD defined ?) = "+n.data.currentUD),"error"):Math.abs(e)<t?"~ 0":numeral(e).format(i)}}]).filter("formatNumeral",(function(){return function(e,n){return void 0===e?"0":Math.abs(e)<1e-4?"~ 0":numeral(e).format(n)}})).filter("formatDate",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("formatDateShort",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatDateMonth",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_MONTH_YEAR_PATTERN||"MMM YY"):""}}]).filter("formatDateForFile",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_FILE_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatTime",(function(){return function(e){return e?moment.unix(parseInt(e)).local().format("HH:mm"):""}})).filter("formatFromNow",(function(){return function(e){return e?moment.unix(parseInt(e)).fromNow():""}})).filter("formatDurationTo",(function(){return function(e){return e?moment.unix(moment().utc().unix()+parseInt(e)).fromNow():""}})).filter("formatDuration",(function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0):""}})).filter("formatDurationMs",(function(){return function(e){return e?e<1e3?e+"ms":e/1e3+"s":""}})).filter("formatPeriod",(function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0).split(" ").slice(-1)[0]:null}})).filter("formatFromNowShort",(function(){return function(e){return e?moment.unix(parseInt(e)).fromNow(!0):""}})).filter("capitalize",(function(){return function(e){return e?(e=e.toLowerCase()).substring(0,1).toUpperCase()+e.substring(1):""}})).filter("abbreviate",(function(){var e={};return function(n){var t=n||"";if(e[t])return e[t];if(t.length>3){for(var i="",a=["-","_"," "],o=0;o<t.length;o++){var s=t[o];0===o?i="g"===s||"G"===s?"Ğ":s:o>0&&-1!=a.indexOf(t[o-1])&&(i+=s)}t=i.toUpperCase()}else"G"===(t=t.toUpperCase()).charAt(0)&&(t="Ğ"+(t.length>1?t.substr(1):""));return e[n]=t,t}})).filter("upper",(function(){return function(e){return e?e.toUpperCase():""}})).filter("formatPubkey",(function(){return function(e){return e?e.substr(0,8):""}})).filter("formatHash",(function(){return function(e){return e?e.substr(0,4)+e.substr(e.length-4):""}})).filter("formatCategory",(function(){return function(e){return e&&e.length>28?e.substr(0,25)+"...":e}})).filter("formatSlug",(function(){return function(e){return e?encodeURIComponent(e.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\w ]+/g,"").replace(/ +/g,"-")):""}})).filter("formatEncodeURI",(function(){return function(e){return e?encodeURIComponent(e):""}})).filter("truncText",(function(){return function(e,n){return n=n||500,!e||e.length<=n?e:e.substr(0,n)+"..."}})).filter("truncUrl",(function(){return function(e,n){n=n||25;var t=e&&(e.startsWith("http://")?7:e.startsWith("https://")?8:0)||0;return t=e.startsWith("www.",t)?t+4:t,!e||e.length-t<=n?e.substr(t):e.substr(t,n)+"..."}})).filter("trustAsHtml",["$sce",function(e){return function(n){return e.trustAsHtml(n)}}]),angular.module("cesium.platform",["cesium.config","cesium.services"]).config(["$translateProvider","csConfig",function(e,n){e.uniformLanguageTag("bcp47").determinePreferredLanguage().useSanitizeValueStrategy(null).fallbackLanguage([n.fallbackLanguage?n.fallbackLanguage:"en"]).useLoaderCache(!0)}]).config(["$httpProvider","csConfig",function(e,n){e.defaults.timeout=n.timeout?n.timeout:3e5,e.defaults.useXDomain=!0,delete e.defaults.headers.common["X-Requested-With"]}]).config(["$compileProvider","csConfig",function(e,n){e.debugInfoEnabled(!!n.debug)}]).config(["$animateProvider",function(e){e.classNameFilter(/\banimate-/)}]).config(["CacheFactoryProvider","csConfig",function(e,n){angular.extend(e.defaults,{maxAge:n.cacheTimeMs||3e5})}]).config(["screenmatchConfigProvider",function(e){e.config.rules="bootstrap"}]).config(["$ionicConfigProvider",function(e){var n=ionic.Platform.isIOS();e.scrolling.jsScrolling(n),e.views.maxCache(5)}]).config(["IdleProvider","csConfig",function(e,n){e.idle(n.logoutIdle||600),e.timeout(n.logoutTimeout||15)}]).factory("$exceptionHandler",["$log",function(e){return function(n,t){t?e.error(n,t):e.error(n)}}]).factory("csPlatform",["ionicReady","$rootScope","$q","$state","$translate","$timeout","UIUtils","BMA","Device","csHttp","csConfig","csCache","csSettings","csCurrency","csWallet",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E){var g,h,b,f,T=0,v=!1;function O(){if(!f){var e=n.$on("$stateChangeStart",(function(e,n,t,a){e.defaultPrevented||"app.home"===n.name||"app.settings"===n.name||(e.preventDefault(),h?h.then((function(){i.go(n.name,t)})):s.loading.hide())}));f=e}}function R(){f&&f(),f=null}function N(e){if(e)return!0;g=g||p.data.node;var n=p.data.fallbackNodes&&T<p.data.fallbackNodes.length&&p.data.fallbackNodes[T++];if(!n)throw"ERROR.CHECK_NETWORK_CONNECTION";var t=n.host+(n.port||80==n.port||443==n.port?"":":"+n.port);return r.node.same(n.host,n.port)?(console.debug("[platform] Skipping fallback node [{0}]: same as actual node".format(t)),N()):c.get(n.host,n.port,"/node/summary",443==n.port||r.node.forceUseSsl)().catch((function(e){console.error("[platform] Could not reach fallback node [{0}]: skipping".format(t))})).then((function(e){if(!e)return N();var i={old:r.server,new:t};return i.old===i.new&&(r.port!=n.port?i.new+=":"+n.port:0!=r.useSsl||!n.useSsl&&443!=n.port||(i.new+=" (SSL)")),a("CONFIRM.USE_FALLBACK_NODE",i).then((function(e){return s.alert.confirm(e)})).then((function(e){if(e)return p.data.node=n,p.data.node.temporary=!0,c.cache.clear(),r.copy(n).then(N)}))}))}function I(){return console.debug("[platform] restarting csPlatform"),A().then((function(){return o(S,200)}))}function S(){return O(),h=e().then(t.all([l.ready(),p.ready()])).then((function(){return r.ready().then(N)})).then(m.ready).then(E.ready).then((function(){R(),function(){b=[r.api.node.on.restart(n,I,this)]}(),h=null,v=!0})).catch((function(e){throw h=null,v=!1,i.current.name!==n.errorState&&i.go(n.errorState,{error:"peer"}),e}))}function A(){return v?(_.forEach(b,(function(e){e()})),b=[],E.stop(),m.stop(),r.stop(),o((function(){R(),v=!1,h=null}),500)):t.when()}return{disableChangeState:O,isStarted:function(){return v},ready:function(){return v?t.when():h||S()},restart:I,start:S,stop:A,version:{latest:function(){var e=p.data.latestReleaseUrl&&c.uri.parse(p.data.latestReleaseUrl);return e?c.getWithCache(e.host,"https:"===e.protocol?443:e.port,"/"+e.pathname,void 0,d.constants.LONG)().then((function(e){if(e&&e.name&&e.tag_name&&e.html_url)return{version:e.name,url:e.html_url,isNewer:c.version.compare(u.version,e.name)<0}})).catch((function(e){console.error("[platform] Failed to get Cesium latest version",e)})):t.when()}}}}]).run(["$rootScope","$state","$window","$urlRouter","ionicReady","$ionicPlatform","$ionicHistory","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet","csSettings","csConfig","csCurrency",function(e,n,t,i,a,o,s,r,l,c,u,d,p,m,E,g){e.config=E,e.settings=m.data,e.currency=g.data,e.walletData=p.data,e.device=r,e.errorState="app.home",e.smallscreen=l.screen.isSmall();var h=t.location.href.indexOf("#");e.rootPath=-1!==h?t.location.href.substr(0,h):t.location.href,console.debug("[app] Root path is ["+e.rootPath+"]"),!0!==E.httpsMode&&"true"!=E.httpsMode&&"force"!==E.httpsMode||"https:"===t.location.protocol||e.$on("$stateChangeStart",(function(i,a,o,s){var r="https"+e.rootPath.substr(4)+n.href(a,o);E.httpsModeDebug?console.debug("[app] [httpsMode] --- Should redirect to: "+r):t.location.href=r})),a().then((function(){return r.keyboard.enable&&(r.keyboard.hideKeyboardAccessoryBar(!0),ionic.Platform.isIOS()&&r.keyboard.disableScroll(!0)),"a"!==ionic.Platform.grade.toLowerCase()&&(console.info("[app] Disabling UI effects, because plateform's grade is ["+ionic.Platform.grade+"]"),l.setEffects(!1)),window.StatusBar&&console.debug("[app] Status bar plugin enable"),d.version.latest().then((function(n){n&&n.isNewer?(console.info("[app] New release detected [{0}]".format(n.version)),e.newRelease=n):console.info("[app] Current version [{0}] is the latest release".format(E.version))})),o.registerBackButtonAction((function(e){return s.backView()?s.goBack():(e.preventDefault(),l.alert.confirm("CONFIRM.EXIT_APP").then((function(e){e&&ionic.Platform.exitApp()})))}),100),d.ready()}))}]),"function"!=typeof String.prototype.startsWith&&(console.debug("Adding String.prototype.startsWith() -> was missing on this platform"),String.prototype.startsWith=function(e,n){return 0===this.indexOf(e,n)}),"function"!=typeof String.prototype.trim){console.debug("Adding String.prototype.trim() -> was missing on this platform");var Ae=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;String.prototype.trim=function(){return this.replace(Ae,"")}}Math&&"function"!=typeof Math.trunc&&(console.debug("Adding Math.trunc() -> was missing on this platform"),Math.trunc=function(e){return(e-.5).toFixed()}),"function"!=typeof String.prototype.format&&(console.debug("Adding String.prototype.format() -> was missing on this platform"),String.prototype.format=function(){var e=arguments;return this.replace(/{(\d+)}/g,(function(n,t){return void 0!==e[t]?e[t]:n}))}); |