astroport/www/gchange/dist_js/gchange-c924a4aa3a.js

11 lines
1.1 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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>&nbsp;{{$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>&nbsp;<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 &lt;= 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 &lt;= 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>&nbsp;</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}}&amp;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}}&amp;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}}&amp;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}}&nbsp;</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">&nbsp;</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 &nbsp;&nbsp;\n\n \x3c!--<button id="helptip-wallet-options"\n class="button button-stable icon-right ink"\n ng-click="showActionsPopover($event)">\n &nbsp; <i class="icon ion-android-more-vertical"></i>&nbsp;\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">&nbsp;</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">&nbsp;\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}}&nbsp;\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)">&nbsp;&nbsp;</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 &nbsp;\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 &nbsp;\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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, 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 &gt;&gt;</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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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>&nbsp;{{'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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, 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 &gt;&gt;</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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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>&nbsp;{{'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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, 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 &gt;&gt;</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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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>&nbsp;{{'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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",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 &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, 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 &gt;&gt;</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 (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) 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>&nbsp;{{'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>&nbsp;&nbsp;<b><i class="icon ion-person"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&nbsp;&nbsp;<b><i class="icon ion-person"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profiloj Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Avizoj</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Privataj mesaĝoj</b>.<li>&nbsp;&nbsp;<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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||uid||params[1]}}</span>.",USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ŝatas vian profilon',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sekvas viajn agojn',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> notis vin ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> atentigis pri via profilo'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> komentis vian paĝon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> komentis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Perfiles Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notificaciónes</b>;<li>&nbsp;&nbsp;<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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||uid||params[1]}}</span>.',REGISTRY:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profils Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Messages privés</b>.<li>&nbsp;&nbsp;<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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> aime votre profil',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> suit votre activité',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> vous a noté ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> a signalé un profil à supprimer : <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a signalé votre profil'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> a commenté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profile Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifcaitions"></i> Notifications</b>;<li>&nbsp;&nbsp;<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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||uid||params[1]}}</span>.',REGISTRY:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> komentis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> aldonis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis la anoncon: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> fermis la anoncon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> atentigis pri anonco moderiginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> atentigis pri via anonco: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ŝatis vian anoncon: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||uid||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> a commenté votre annonce : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> a commenté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> a ajouté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié l\'annonce : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a clôturé l\'annonce : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{name||params[1]}}</span> a signalé votre annonce : <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a aimé votre annonce : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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>&thinsp;{{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 &nbsp;<b class="ion ion-trash-a"></b>&nbsp;\n </a>\n <a class="gray hidden-device" ng-if="!social.recipient" ng-click="editSocialNetwork($index)">\n &nbsp;<b class="ion ion-edit"></b>&nbsp;\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>&nbsp;\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 &nbsp;<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">&nbsp;|&nbsp;</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">&nbsp;|&nbsp;</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>&nbsp;\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">&nbsp;|&nbsp;</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 &nbsp;\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">&nbsp;</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}}&nbsp;{{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">&nbsp;</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">&nbsp;\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>&thinsp;<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 &nbsp;\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>&nbsp;</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">&nbsp;\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">&nbsp;|&nbsp;</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">&nbsp;\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">&nbsp;</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">&nbsp;</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">&nbsp;</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>&nbsp;{{destUid}}</span>&nbsp;\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}}&nbsp;&nbsp;\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 &nbsp; <i class="icon ion-android-more-vertical"></i>&nbsp;\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 &nbsp;\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>&thinsp;{{::notification.name||notification.uid}}</span>\n <span class="gray" ng-if="::!notification.name && !notification.uid"><i class="ion-key"></i>&thinsp;{{::notification.issuer|formatPubkey}}</span>\n </h3>\n <h4>\n <i class="icon ion-archive balanced"></i>&thinsp;<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">&nbsp;</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">&nbsp;</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>&nbsp;\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 &lt;= 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">&nbsp;\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">&nbsp;\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>&thinsp;<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">&nbsp;</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">&nbsp;</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">&nbsp;</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}}&nbsp;{{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>&nbsp;\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">&nbsp;</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 &nbsp;<i class="icon ion-location"></i>\n {{search.location}}\n <i class="icon ion-close" ng-click="removeLocation2()">&nbsp;&nbsp;</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 &nbsp;<i class="icon ion-location"></i>\n <span ng-bind-html="search.location"></span>\n <i class="icon ion-close" ng-click="removeLocation()">&nbsp;&nbsp;</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 &nbsp;<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()">&nbsp;&nbsp;</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 &nbsp;<i class="icon ion-flag"></i>\n <span>{{search.category.name|truncText:40}}</span>\n <i class="icon ion-close" ng-click="removeCategory()">&nbsp;&nbsp;</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 &nbsp;\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 &nbsp;\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n\n &nbsp;\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}}&nbsp;<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>&nbsp;</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">&nbsp;\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">&nbsp;|&nbsp;</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">&nbsp;\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">&nbsp;</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">&nbsp;</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">&nbsp;\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">&nbsp;\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 + \'&#10;\' : \'\'}}{{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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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}}&nbsp;{{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>&nbsp;\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 &nbsp;<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>&nbsp;\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">&nbsp;</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">&nbsp;</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">&nbsp;|&nbsp;</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}}&nbsp;<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}}&nbsp;<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 &nbsp;<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()">&nbsp;&nbsp;</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 &nbsp;<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()">&nbsp;&nbsp;</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 &nbsp;\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 &nbsp;\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 &nbsp;\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 &nbsp;\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,"&lt;").replace(/>/g,"&gt;"):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-zAZ0-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 ])([AZ09-]+)(?:$|[\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:'&copy; <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:'&copy; <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}))});