astroport/www/LOVELand/cesium/dist_js/cesium.js

18 lines
1.7 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){var t=this;Object.keys(e).forEach((function(n){t[n]=e[n]})),t.endpoints=t.endpoints||[]}function t(e,t){"use strict";var n=this;t&&t.length?_.forEach(t,(function(t){n[t]=e[t]})):["currency","issuer","medianTime","number","version","powMin","dividend","membersCount","hash","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions","unitbase"].forEach((function(t){n[t]=e[t]})),n.identitiesCount=n.identities?n.identities.length:0,n.joinersCount=n.joiners?n.joiners.length:0,n.activesCount=n.actives?n.actives.length:0,n.leaversCount=n.leavers?n.leavers.length:0,n.revokedCount=n.revoked?n.revoked.length:0,n.excludedCount=n.excluded?n.excluded.length:0,n.certificationsCount=n.certifications?n.certifications.length:0,n.transactionsCount=n.transactions?n.transactions.length:0,n.empty=n.isEmpty(),n.id=[n.number,n.hash].join("-")}function n(e){var t=e.split(":");if(t.length<3||!t[0].startsWith("WS2P"))throw Error("Invalid format: "+e);if("HEAD"==t[1]){if(t.length<4)throw Error("Invalid format: "+e);if(4==t.length)this.pubkey=t[2],this.buid=t[3];else if(t[2]>=1){var n=t[0];if(n.length>4){var i=this.regexp.WS2P_PREFIX.exec(n);if(!i)throw Error("Invalid format: "+e);var a=i[1];if(a){this.private={useTor:a.startsWith("T")};var o=a.substring(1);"A"==o?this.private.mode="all":"M"==o?this.private.mode="mixed":"S"==o&&(this.private.mode="strict")}var r=i[2];r&&(this.public={useTor:r.startsWith("T"),mode:"all"})}this.pubkey=t[3],this.buid=t[4],this.ws2pid=t[5],this.software=t[6],this.version=t[7],this.powPrefix=t[8]}}}function a(e,t){e.extensionPoint=t.extensions.points.current.get()}function o(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b,g,f,_,h){e.walletData=b.data,e.search={},e.login=b.isLogin(),e.auth=b.isAuth(),e.motion=m.motion.default,e.fullscreen=m.screen.fullscreen.isEnabled(),e.showHome=function(){return r.nextViewOptions({historyRoot:!0}),n.go("app.home").then(m.loading.hide)},e.createHelptipScope=function(n){if(n||!t.tour&&t.settings.helptip.enable&&!m.screen.isSmall()){var i=e.$new();return s("HelpTipCtrl",{$scope:i}),i}},e.startHelpTour=function(n,i){if(n&&n.defaultPrevented)return!1;if(t.tour=!0,!i)return r.clearHistory(),r.clearCache().then((function(){e.startHelpTour(null,!0)}));var a=e.createHelptipScope(!0);return a.startHelpTour().then((function(){a.$destroy(),delete t.tour})).catch((function(e){delete t.tour}))},e.disableHelpTour=function(e){e&&(e.preventDefault(),e.stopPropagation()),d.data.helptip&&d.data.helptip.enable&&(t.settings.helptip.enable=!1,d.store())},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||{}).wallet||b).loadData(e).then((function(e){if(!e)throw"CANCELLED";return e}))},e.loadWallet=function(t){if(console.warn("[app-controller] DEPRECATED - Please use csWallet.loginOrLoad() instead of $scope.loadWallet()",new Error),!c.isStarted())return c.ready().then((function(){return e.loadWallet(t)}));var n=(t=t||{}).wallet||b;return t.auth&&!n.isAuth()?n.auth(t).then((function(e){if(e)return e;throw"CANCELLED"})):n.isLogin()?n.isDataLoaded(t)?a.when(n.data):e.loadWalletData(t):n.login(t).then((function(e){if(e)return e;throw"CANCELLED"}))},e.loginAndGo=function(t,i){e.closeProfilePopover();var a=(i=i||{}).wallet||b;if(delete i.wallet,t=t||"app.view_wallet",a.isLogin())return n.go(t,i);if(_.httpsMode&&l.location&&"https:"!==l.location.protocol){var o=l.location.href,r=o.indexOf("#"),s=-1!=r?o.substr(0,r):o;if(o=(s="https"+s.substr(4))+n.href(t),!_.httpsModeDebug)return void(l.location.href=o);console.debug("[httpsMode] --- Should redirect to: "+o)}return a.login(i).then((function(){return n.go(t,i)})).then(m.loading.hide)},e.logout=function(t){var n=(t=t||{}).wallet||b;return!t.force&&e.profilePopover?e.profilePopover.hide().then((function(){return t.force=!0,e.logout(t)})):t.askConfirm?m.alert.confirm("CONFIRM.LOGOUT").then((function(n){if(n)return t.askConfirm=!1,e.logout(t)})):(m.loading.show(),n.logout().then((function(){if(i.isOpenLeft()&&i.toggleLeft(),n.isDefault())return r.clearHistory(),r.clearCache().then((function(){return e.showHome()}));m.loading.hide(10)})).catch(m.onError("ERROR.LOGOUT")))},e.doAuth=function(e){return(e&&e.wallet||b).auth().then(m.loading.hide)},e.isUserPubkey=function(e){return b.isUserPubkey(e)},b.api.data.on.login(e,(function(t,n){return e.login=!0,n?n.resolve():a.when()})),b.api.data.on.logout(e,(function(){e.login=!1})),b.api.data.on.auth(e,(function(t,n){return e.auth=!0,n?n.resolve():a.when()})),b.api.data.on.unauth(e,(function(){e.auth=!1})),e.showTransferModal=function(e){return f.showTransfer(e)},e.showAboutModal=function(){return f.showAbout()},e.showJoinModal=function(){return e.closeProfilePopover(),f.showJoin()},e.showSettings=function(){return e.closeProfilePopover(),n.go("app.settings")},e.showHelpModal=function(e){return f.showHelp(e)},e.showProfilePopover=function(t){return m.popover.show(t,{templateUrl:"templates/common/popover_profile.html",scope:e,autoremove:!0,afterShow:function(t){e.profilePopover=t,o((function(){m.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(t){return m.popover.show(t,{templateUrl:"templates/network/popover_peer_info.html",autoremove:!0,scope:e.$new(!0)})},e.openLink=function(e,t,i){if(e.stopPropagation(),e.preventDefault(),t&&t.startsWith("@")){var a=t.substr(1);if(E.regexp.USER_ID.test(a))return n.go("app.wot_identity_uid",{uid:a}),!1}return(i=i||{}).onError=function(){return m.popover.copy(e,t)},h.uri.open(t,i),!1},e.showFab=function(e,t){m.motion.toggleOn({selector:"#"+e+".button-fab"},t)},e.hideFab=function(e,t){m.motion.toggleOff({selector:"#"+e+".button-fab"},t)},e.doMotion=function(t){return e.motion.show(t)},e.askFullscreen=function(){if(!e.fullscreen&&m.screen.isSmall()&&g.isWeb())return m.alert.confirm("CONFIRM.FULLSCREEN",void 0,{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then((function(t){t&&e.toggleFullscreen()}))},e.toggleFullscreen=function(){e.fullscreen=!m.screen.fullscreen.isEnabled(),m.screen.fullscreen.toggleAll()},e.askFullscreen()}function r(e,t,n,i,a,o,r,s,l,c,d,u){e.loading=!0,e.locales=angular.copy(u.locales),e.smallscreen=r.screen.isSmall(),e.showInstallHelp=!1,e.enter=function(n,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=d.data.node,e.loading=!1,i.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),t.go("app.home",{error:void 0},{reload:!1,inherit:!0,notify:!1})):c.ready().then((function(){e.loading=!1,e.loadFeeds()})).catch((function(t){e.node=d.data.node,e.loading=!1,e.error=t}))},e.$on("$ionicView.enter",e.enter),e.reload=function(){e.loading=!0,delete e.error,n(e.enter,200)},e.loadFeeds=function(){var t=u.getFeedUrl();if(t&&"string"==typeof t){var n=s.feed&&s.feed.maxContentLength||650,i=Date.now();console.debug("[home] Loading feeds from {0}...".format(t)),o.get(t,{responseType:"json",cache:l.get(null,l.constants.LONG)}).success((function(t){console.debug("[home] Feeds loaded in {0}ms".format(Date.now()-i)),t&&t.items&&t.items.length&&(t.items=t.items.reduce((function(e,i){if(!i||!i.title&&!i.content_text&&!i.content_html)return e;if(i.date_published&&(i.time=moment.utc(i.date_published).unix()),i.content_html?i.content=i.content_html:i.content=(i.content_text||"").replace(/\n/g,"<br/>"),-1!==n&&i.content&&i.content.length>n){var a=Math.max(i.content.lastIndexOf(" ",n),i.content.lastIndexOf("<",n));i.content=i.content.substr(0,a)+" (...)",i.truncated=!0}return i.author=i.author||t.author,e.concat(i)}),[]),e.feed=t)})).error((function(t,n){console.error("[home] Failed to load feeds."),e.feed=null}))}},e.doQuickFix=function(e){"settings"===e&&(i.nextViewOptions({historyRoot:!0}),t.go("app.settings"))},e.changeLanguage=function(t){a.use(t),e.hideLocalesPopover(),u.data.locale=_.findWhere(e.locales,{id:t}),u.store(),e.loadFeeds()},e.showLocalesPopover=function(t){r.popover.show(t,{templateUrl:"templates/common/popover_locales.html",scope:e,autoremove:!0,afterShow:function(t){e.localesPopover=t}})},e.hideLocalesPopover=function(){e.localesPopover&&(e.localesPopover.hide(),e.localesPopover=null)}}function s(e,t,n,i,a){angular.extend(this,n("HomeCtrl",{$scope:e})),e.showJoinModal=function(){return e.loading?t(e.showJoinModal,500):a.isLogin()||e.error?void 0:t(i.showJoin,300)},e.$on("$ionicView.enter",e.showJoinModal)}function l(e,t,n,i,a,o){e.formData={},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.loading=!0,e.load=function(){if(e.loading)return o.get().then((function(t){t&&(e.currency=t,e.formData.currency=t.name,e.loading=!1)})).catch(i.onError("ERROR.GET_CURRENCY_FAILED"))},e.$on("modal.shown",e.load),e.$on("$ionicSlides.sliderInitialized",(function(e,t){t.slider.lockSwipes()})),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes()},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes()},e.selectAccountTypeAndClose=function(t){if(a.demo)return i.alert.demo();e.formData.accountType=t,e.closeModal(e.formData)},e.doQuickFix=function(n){"settings"==n&&(e.closeModal(),t.go("app.settings"))},e.showHelpModal=function(e){n.showHelp({anchor:e})}}function c(e,t,n,i,a,o,r,s,l,c,d,u,p){var m;e.formData={pseudo:p.uid||"",pubkey:p.pubkey||void 0},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500,pager:!1,showPager:!1}},e.slideBehavior={},e.loading=!0,e.isLicenseRead=o.isIOS(),e.showUsername=!1,e.showPassword=!1,e.formData.computing=!1,e.smallscreen=r.screen.isSmall(),e.userIdPattern=u.constants.regexp.USER_ID,e.accountAvailable=!!p.pubkey,e.currency=p.currency,e.accountType=p.accountType||"member",e.load=function(){if(e.loading){if(!(m=p.walletId&&d.children.get(p.walletId)||p.pubkey&&d.children.getByPubkey(p.pubkey)||(!p.pubkey||d.isUserPubkey(p.pubkey))&&d))throw new Error("Cannot found the corresponding wallet, from parameters.pubkey or parameters.walletId");console.debug("[join] Starting join modal on wallet {0}".format(m.id)),"member"===e.accountType&&(e.licenseFileUrl=l.getLicenseUrl(),e.licenseFileUrl&&(".txt"!=e.licenseFileUrl.substring(e.licenseFileUrl.length-3)&&(e.licenseFileUrl=e.licenseFileUrl+".html"),e.isLicenseRead||a((function(){e.isLicenseRead||(e.isLicenseRead=!0)}),5e3))),e.slideBehavior=e.computeSlideBehavior(),e.loading=!1}},e.$on("modal.shown",e.load),e.$on("$ionicSlides.sliderInitialized",(function(e,t){t.slider.lockSwipes()})),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes()},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes()},e.showAccountPubkey=function(){if(p.pubkey&&p.pseudo===e.formData.pseudo)return e.formData.pubkey=p.pubkey,void(e.formData.computing=!1);e.formData.computing=!0,s.scryptKeypair(e.formData.username,e.formData.password).then((function(t){return e.formData.pubkey=s.util.encode_base58(t.signPk),e.checkAccountAvailable()})).then((function(){return a((function(){e.formData.computing=!1}),400)})).catch((function(t){e.formData.pubkey=void 0,e.formData.computing=!1,r.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(t)}))},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.getCurrentFormName=function(){var t=e.slides.slider.activeIndex;if("member"===e.accountType){if(t+=e.licenseFileUrl?0:1,0===(t+=p.pubkey&&t>=2?2:0))return"licenseForm";if(1===t)return"pseudoForm";if(2===t)return"saltForm";if(3===t)return"passwordForm";if(4===t)return"confirmForm"}else{if(0===t)return"saltForm";if(1===t)return"passwordForm";if(2===t)return"confirmForm"}},e.computeSlideBehavior=function(){var t=e.getCurrentFormName();return"licenseForm"===t?{hasPreviousButton:!1,hasNextButton:!1,hasAcceptButton:!0}:"pseudoForm"===t?{helpAnchor:"join-pseudo",hasPreviousButton:e.licenseFileUrl&&!0,hasNextButton:!0,focus:"pseudo"}:"saltForm"===t?{helpAnchor:"join-salt",hasPreviousButton:"member"===e.accountType,hasNextButton:!0,focus:"salt"}:"passwordForm"===t?{helpAnchor:"join-password",hasPreviousButton:!0,hasNextButton:!0,focus:"password"}:"confirmForm"===t?{hasPreviousButton:!0,hasNextButton:!1,hasSendButton:!0,helpAnchor:"join-pubkey"}:{hasPreviousButton:!1,hasNextButton:!0}},e.doNext=function(){var t=e.getCurrentFormName();if(t&&e[t]){if(e[t].$submitted=!0,!e[t].$valid)return;if("pseudoForm"===t&&e.uiAlreadyUsed)return;"passwordForm"===t&&e.showAccountPubkey()}e.slideNext(),e.slideBehavior=e.computeSlideBehavior()},e.doPrev=function(){e.slidePrev(),e.slideBehavior=e.computeSlideBehavior()},e.doNewAccount=function(n){if(!n){var o="member"===e.accountType?"ACCOUNT.NEW.CONFIRMATION_MEMBER_ACCOUNT":"ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT";return r.alert.confirm(o,void 0,{cssClass:"warning",okText:"member"==e.accountType?"COMMON.BTN_SEND":"COMMON.BTN_CONTINUE",okType:"button-assertive"}).then((function(t){t&&e.doNewAccount(!0)}))}var s=function(e){return function(t){throw parameter.uid?m.unauth().then((function(){r.onError(e)(t)})):m.logout().then((function(){r.onError(e)(t)})),new Error("CANCELLED")}};return r.loading.show(),m.login({auth:!0,isNew:!0,method:"SCRYPT_DEFAULT",expectedPubkey:e.formData.pubkey,showMethods:!1}).then((function(){if("member"===e.accountType){e.closeModal(),l.data.wallet=l.data.wallet||{},l.data.wallet.alertIfUnusedWallet=!1;var n=angular.isUndefined(p.uid)||angular.isUndefined(p.blockUid)||p.uid.toUpperCase()!==e.formData.pseudo.toUpperCase();return n||m.setSelf(p.uid,p.blockUid),(n?m.self(e.formData.pseudo,!1).catch(s("ERROR.SEND_IDENTITY_FAILED")):i.when()).then((function(){return m.membership.inside().catch((function(e){e&&e.ucode!=u.errorCodes.MEMBERSHIP_ALREADY_SEND||s("ERROR.SEND_MEMBERSHIP_IN_FAILED")(e)}))})).then((function(){return e.closeModal(),m.isDefault()?t.go("app.view_wallet"):t.go("app.view_wallet_by_id",{id:m.id})})).then((function(){return a((function(){return m.isDataLoaded({requirements:!0})&&r.loading.hide(),e.downloadRevocationRegistration()}),2e3)}))}e.closeModal(),m.isDefault()?t.go("app.view_wallet"):t.go("app.view_wallet_by_id",{id:m.id})})).catch((function(e){r.loading.hide(),"CANCELLED"!==e&&(e&&e.ucode!=u.errorCodes.MEMBERSHIP_ALREADY_SEND?console.error("[wallet] Node: already membership",e):r.alert.error("ERROR.UNKNOWN_ERROR"))}))},e.downloadRevocationRegistration=function(){return r.alert.confirm("DOWNLOAD.POPUP_REVOKE_MESSAGE","DOWNLOAD.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_DOWNLOAD",okType:"button-assertive",cancelText:"COMMON.BTN_LATER"}).then((function(e){if(e)return m.downloadRevocation()}))},e.showHelpModal=function(e){c.showHelp({anchor:e})},e.startListenLicenseBottom=function(){var t=angular.element(document.querySelector(".modal #iframe-license"));if(!(t=t&&t.length?t[0]:void 0)||!t.contentWindow)return console.debug("[join] Waiting license frame to be load..."),a(e.startListenLicenseBottom,1e3);e.licenseBottomInterval=n((function(){var n=t.contentWindow.document.body.scrollTop;t.contentWindow.document.body.scrollHeight-t.contentWindow.document.body.clientHeight===n&&(e.isLicenseRead=!0,e.stopListenLicenseBottom())}),1e3)},e.stopListenLicenseBottom=function(){e.licenseBottomInterval&&(n.cancel(e.licenseBottomInterval),delete e.licenseBottomInterval)},e.$on("modal.hidden",e.stopListenLicenseBottom),e.checkUid=function(){if(!e.formData.pseudo||e.formData.pseudo.length<3)return e.formData.computing=!1,void delete e.uiAlreadyUsed;var t=e.formData.pseudo.toUpperCase();if(e.formData.computing=!0,p.uid&&t===p.uid.toUpperCase())return e.formData.computing=!1,void(e.uiAlreadyUsed=!1);u.wot.lookup({search:t}).then((function(n){e.uiAlreadyUsed=(n.results||[]).some((function(e){return(e.uids||[]).some((function(e){return e.uid.toUpperCase()===t}))})),e.formData.computing=!1})).catch((function(t){console.error(t),e.formData.computing=!1,e.uiAlreadyUsed=!1}))},e.$watch("formData.pseudo",e.checkUid,!0),e.checkAccountAvailable=function(){if(!p.pubkey)return delete e.accountAvailable,u.tx.sources({pubkey:e.formData.pubkey}).then((function(t){e.accountAvailable=!t||!t.sources.length})).catch((function(t){console.error(t),e.accountAvailable=!1}));e.accountAvailable=!0},e.identifierRecovery=function(){e.slides.slider.unlockSwipes();for(var t=0;t<2;t++)e.slides.slider.slidePrev();e.slides.slider.lockSwipes(),e.slideBehavior=e.computeSlideBehavior()}}function d(e,t,n,i){angular.extend(this,n("HomeCtrl",{$scope:e})),e.showLoginModal=function(){return e.loading?t(e.showLoginModal,500):i.isLogin()||e.error?void 0:t(i.login,300)},e.$on("$ionicView.enter",e.showLoginModal)}function u(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){E=E||{},u.demo&&(E.method="PUBKEY"),e.computing=!1,e.pubkey=null,e.formData={},e.showPubkey=!1,e.showComputePubkeyButton=!1,e.autoComputePubkey=!1,e.pubkeyPattern="^(:?{0}|{1})$".format(c.constants.regexp.PUBKEY,c.constants.regexp.PUBKEY_WITH_CHECKSUM),e.isAuth=E.auth,e.okText=E.okText,e.title=E.title||(e.isAuth?"AUTH.TITLE":"LOGIN.TITLE"),e.showMethods=!angular.isDefined(E.showMethods)||E.showMethods,e.showNewAccountLink=!angular.isDefined(E.showNewAccountLink)||E.showNewAccountLink,e.expectedPubkey=E.expectedPubkey,e.expectedUid=E.uid,e.scryptParamsValues=_.keys(o.constants.SCRYPT_PARAMS).reduce((function(e,t){return e.concat({id:t,label:"LOGIN.SCRYPT."+t,params:o.constants.SCRYPT_PARAMS[t]})}),[{id:"USER",label:"LOGIN.SCRYPT.USER",params:{}}]),e.init=function(){s().then((function(){e.autoComputePubkey="a"===ionic.Platform.grade.toLowerCase()&&!l.screen.isSmall()})),e.formData.rememberMe=p.data.rememberMe,e.formData.keepAuthIdle=p.data.keepAuthIdle,e.formData.keepAuth=e.formData.keepAuthIdle==p.constants.KEEP_AUTH_IDLE_SESSION;var t=E.method||p.data.login&&p.data.login.method||"SCRYPT_DEFAULT",n=p.data.login&&p.data.login.params;(e.isAuth&&"PUBKEY"===t||"SCAN"===t||"default"===t)&&(t="SCRYPT_DEFAULT"),e.changeMethod(t,n)},e.enter=function(){l.loading.hide(),l.ink({selector:".modal-login .ink"})},e.$on("modal.shown",e.enter),e.leave=function(){e.formData={},e.computing=!1,e.pubkey=null,e.methods=[]},e.$on("modal.hide",e.leave),e.doLogin=function(n){var i=e.formData.method;if(e.form.$valid||"SCAN"===i){var a,s=e.formData.keepAuthIdle;if("SCRYPT_DEFAULT"===i||"SCRYPT_ADVANCED"===i){if(!e.formData.username||!e.formData.password)return;var d=e.formData.scrypt&&e.formData.scrypt.params;l.loading.show(),a=o.scryptKeypair(e.formData.username,e.formData.password,d).then((function(t){if(!t)return l.loading.hide(10);var n=o.util.encode_base58(t.signPk);return E.expectedPubkey&&E.expectedPubkey!=n?(e.pubkey=n,e.showPubkey=!0,e.pubkeyError=!0,l.loading.hide(10)):(e.pubkeyError=!1,{pubkey:n,keypair:t,params:e.formData.scrypt&&"SCRYPT_DEFAULT"!=e.formData.scrypt.id?d:void 0})})).catch(l.onError("ERROR.CRYPTO_UNKNOWN_ERROR"))}else if("FILE"===i){if(!e.formData.file||!e.formData.file.valid||!e.formData.file.pubkey)return;s=e.formData.keepAuth&&p.constants.KEEP_AUTH_IDLE_SESSION||s,a=l.loading.show().then((function(){return e.readKeyFile(e.formData.file,{withSecret:e.isAuth||e.formData.keepAuth})})).then((function(t){if(!t)return l.loading.hide(10);var n=o.util.encode_base58(t.signPk);return E.expectedPubkey&&E.expectedPubkey!=n?(e.formData.file.valid=!1,l.loading.hide(10)):(e.pubkeyError=!1,{pubkey:n,keypair:t})})).catch(l.onError("ERROR.AUTH_FILE_ERROR"))}else if("PUBKEY"===i){var u=e.formData.pubkey&&e.formData.pubkey.trim(),m=e.formData.uid&&e.formData.uid.trim()||void 0;if(!u)return;var b=c.regexp.PUBKEY.exec(u);if(b)a=l.loading.show().then((function(){return{pubkey:u,uid:m}}));else{if(!(b=c.regexp.PUBKEY_WITH_CHECKSUM.exec(u)))return e.showWotLookupModal(u);u=b[1],b[2]!=r.util.pkChecksum(u)?e.form.pubkey.$error={checksum:!0}:a=l.loading.show().then((function(){return{pubkey:u,uid:m}}))}}else if("SCAN"===i){if(!e.formData.pubkey||e.isAuth&&!e.formData.keypair)return;a=l.loading.show().then((function(){return{pubkey:e.formData.pubkey,keypair:e.formData.keypair}}))}if(a)return a.then((function(n){if(n){var a=!angular.equals(p.data.rememberMe,e.formData.rememberMe),o=!angular.equals(p.data.keepAuthIdle,s),r=!angular.equals(p.data.login&&p.data.login.method,i),c=!angular.equals(p.data.login&&p.data.login.params,n.params);return(a||o||r||c)&&(p.data.rememberMe=e.formData.rememberMe,p.data.keepAuthIdle=s,p.data.useLocalStorage=!!p.data.rememberMe||p.data.useLocalStorage,p.data.login=p.data.login||{},p.data.login.method=i,p.data.login.params=n.params,t(p.store,500)),E.success&&E.success(e.formData),E.silent&&l.loading.hide(),e.closeModal(n)}}));console.warn("[login] unknown method: ",i)}},e.onScryptFormChanged=function(){e.computing||(e.pubkey=null,e.pubkeyError=!1,e.showPubkey=!!e.formData.username&&!!e.formData.password,e.autoComputePubkey&&e.showPubkey?(e.computePubkey(),e.showComputePubkeyButton=!1):e.showComputePubkeyButton=!e.autoComputePubkey&&e.showPubkey)},e.$watch("formData.username + formData.password",e.onScryptFormChanged,!0),e.computePubkey=function(){return e.showComputePubkeyButton=!1,e.computing=!0,e.pubkey=null,t((function(){var t=e.formData.username,n=e.formData.password,i=e.formData.scrypt&&e.formData.scrypt.params;return o.scryptSignPk(t,n,i).then((function(i){if(t!==e.formData.username||n!==e.formData.password)return e.computePubkey();e.pubkey=o.util.encode_base58(i),e.expectedPubkey&&e.expectedPubkey!=e.pubkey&&(e.pubkeyError=!0),e.computing=!1})).catch((function(t){l.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(t),e.computing=!1,e.autoComputePubkey=!1,e.onScryptFormChanged()}))}),100)},e.showJoinModal=function(){e.closeModal(),t((function(){d.showJoin()}),300)},e.showAccountSecurityModal=function(){e.closeModal(),t((function(){d.showAccountSecurity()}),300)},e.showHelpModal=function(e){return d.showHelp(e)},e.doScan=function(){if(!e.computing)return e.computing=!0,e.formData.pubkey=null,e.formData.keypair=null,m.barcode.scan().then((function(t){if(t)return e.isAuth?n.when(t):c.uri.parse(t).then((function(e){if(!e||!e.pubkey)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return e})).catch((function(e){return console.debug("[login] Error while parsing as URI: "+(e&&e.message||e)),t}))})).then((function(e){if(e)return e&&e.pubkey?e:r.keyfile.parseData(e,{silent:!0}).then((function(e){if(!e||!e.signPk||!e.signSk)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return{pubkey:o.base58.encode(e.signPk),keypair:e}})).catch(l.onError("ERROR.SCAN_UNKNOWN_FORMAT"))})).then((function(t){t&&t.pubkey&&(e.pubkeyError=e.expectedPubkey&&e.expectedPubkey!=t.pubkey,e.formData.pubkey=t.pubkey,e.formData.keypair=t.keypair)})).then((function(){e.computing=!1,l.loading.hide(10)})).catch((function(t){e.computing=!1,l.onError("ERROR.SCAN_FAILED")(t)}))},e.changeMethod=function(t,n){if(e.hideMethodsPopover(),"PUBKEY"!==t&&u.demo)return l.alert.demo();if(t&&t!==e.formData.method)if(console.debug("[login] method is: "+t),e.formData.method=t,e.formData.uid=null,e.form&&delete e.form.$submitted,"SCRYPT_DEFAULT"===t||"SCRYPT_ADVANCED"===t){var i;e.pubkey=null,n?(i=_.find(e.scryptParamsValues,(function(e){return e.params&&angular.equals(e.params,n)})))||((i=_.findWhere(e.scryptParamsValues,{id:"USER"})||{}).params=n):i=_.findWhere(e.scryptParamsValues,{id:"DEFAULT"}),e.changeScrypt(i),e.autoComputePubkey=e.autoComputePubkey&&"SCRYPT_DEFAULT"===t}else{if("SCAN"===t)return e.doScan();e.formData.username=null,e.formData.password=null,e.formData.pubkey=null,e.pubkey=null,e.computing=!1}},e.changeScrypt=function(t){e.formData.scrypt=angular.copy(t||{}),e.onScryptFormChanged()},e.readKeyFile=function(n,i){return(i=i||{}).password=i.password||e.formData.file.password||function(){return e.formData.file.password=void 0,d.showPassword({title:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE",subTitle:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP",error:i.error,scope:e}).then((function(n){return e.formData.file.password=n,t((function(){return n}),150)}))},r.keyfile.read(e.formData.file,i).catch((function(t){if(e.formData.file.password=void 0,"CANCELLED"===t&&l.loading.hide(10),t&&t.ucode==r.errorCodes.BAD_PASSWORD)return e.readKeyFile(e.formData.file,{withSecret:i.withSecret,error:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"});throw t}))},e.onFileChanged=function(n){n&&n.fileData?(e.formData.file={name:n.fileData.name,size:n.fileData.size,content:n.fileContent},e.validatingFile=!0,t((function(){return console.debug("[login] key file changed: ",e.formData.file),e.validatingFile=!0,e.readKeyFile(e.formData.file,{withSecret:!1,password:e.formData.file.password}).then((function(t){t&&t.signPk?(e.formData.file.pubkey=o.util.encode_base58(t.signPk),e.formData.file.valid=!e.expectedPubkey||e.expectedPubkey===e.formData.file.pubkey,e.validatingFile=!1):(e.formData.file.valid=!1,e.formData.file.pubkey=void 0)})).catch((function(t){t&&"CANCELLED"===t?e.removeKeyFile():(e.validatingFile=!1,e.formData.file.valid=!1,e.formData.file.pubkey=void 0,l.onError("ERROR.AUTH_FILE_ERROR")(t))}))}))):e.validatingFile=!1},e.removeKeyFile=function(){e.formData.file=void 0},e.showWotLookupModal=function(n){return d.showWotLookup({q:n}).then((function(n){if(n&&n.pubkey)return e.formData.pubkey=n.pubkey,e.formData.uid=n.uid||void 0,t(e.doLogin,300)}))},e.showMethodsPopover=function(t){t.defaultPrevented||l.popover.show(t,{templateUrl:"templates/login/popover_methods.html",scope:e,autoremove:!0,afterShow:function(t){e.methodsPopover=t,l.ink({selector:".popover-login-methods .item"})}})},e.hideMethodsPopover=function(){e.methodsPopover&&(e.methodsPopover.hide(),e.methodsPopover=null)},e.init()}function p(e,t,n){var i=angular.copy(n);i.demo=!1,i.readonly=!1,angular.extend(this,t("LoginModalCtrl",{$scope:e,parameters:{auth:!0},csConfig:i})),e.setForm=function(t){e.form=t}}function m(e,t,n,i,a){e.$on("$ionicView.enter",(function(o){e.locale=a.data.locale.id,t.stateParams&&t.stateParams.anchor&&(e.anchor=t.stateParams.anchor,n((function(){i(t.stateParams.anchor)}),100))}))}function E(e,t,n,i,a){e.itemsClass={},e.locale=i.data.locale.id,(a=a||{})&&"string"==typeof a&&(a={anchor:a}),a.anchor&&(t((function(){n(a.anchor)}),100),e.itemsClass={},e.itemsClass[a.anchor]="selected",e.listClass="selection")}function b(e,t,n,i,a,o,r,s,l,c,d,u,p,m){e.tour=!1,e.continue=!0,e.executeStep=function(t,n,i){if((i=angular.isDefined(i)?i:0)>=n.length)return o.when(!0);var a=n[i];if("function"!=typeof a)throw new Error("[helptip] Invalid step at index {0} of '{1}' tour: step must be a function".format(i,t));var r=a();return"boolean"==typeof r&&(r=o.when(r)),r.then((function(a){return angular.isUndefined(a)?(e.continue=!1,i):a&&i!==n.length-1?e.executeStep(t,n,i+1):a?-1:i+1})).catch((function(n){return n&&"transition prevented"===n.message?console.error("ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error".format(t,i)):console.error("ERROR: in help tour [{0}], in step [{1}] : {2}".format(t,i,n)),e.continue=!1,i}))},e.showHelpTip=function(t,n){return(n=n||{}).bindings=n.bindings||{},n.bindings.value=n.bindings.value||"",n.bindings.hasNext=!angular.isDefined(n.bindings.hasNext)||n.bindings.hasNext,n.timeout=n.timeout||(p.enable?900:500),n.autoremove=!0,n.bindings.tour=e.tour,n.backdropClickToClose=!e.tour,s.popover.helptip(t,n)},e.showHelpModal=function(e){Modals.showHelp({anchor:e})},e.startHelpTour=function(){return e.tour=!0,e.continue=!0,console.debug("[help] Starting help tour... {demo: {0}, readonly: {1}, isLogin: {2}}".format(l.demo,l.readonly,m.isLogin())),(!l.readonly&&m.isLogin()?e.startWalletNoLoginTour(0,!0):o.when(!0)).then((function(t){return!!t&&(!(!l.readonly&&m.isLogin())||e.startWalletTour(0,!0).then((function(t){return!!t&&(c.data.helptip.wallet=t,c.store(),e.continue)})))})).then((function(t){return!!t&&(!(!l.readonly&&m.isLogin())||e.startWalletCertTour(0,!0).then((function(t){return!!t&&(c.data.helptip.walletCerts=t,c.store(),e.continue)})))})).then((function(t){return!!t&&(!(!l.readonly&&m.isLogin())||e.startTxTour(0,!0).then((function(t){return!!t&&(c.data.helptip.tx=t,c.store(),e.continue)})))})).then((function(t){return!!t&&(!(!l.readonly&&m.isLogin())||e.startWalletsTour(0,!0).then((function(t){return!!t&&(c.data.helptip.wallets=t,c.store(),e.continue)})))})).then((function(t){return!!t&&(!!l.readonly||e.startHeaderTour(0,!0))})).then((function(t){return!!t&&(!!l.readonly||e.startSettingsTour(0,!0))})).then((function(t){return!!t&&e.startWotLookupTour(0,!0).then((function(t){return!(!t||e.cancelled)&&(c.data.helptip.wotLookup=t,c.store(),e.continue)}))})).then((function(t){return!!t&&e.startWotTour(0,!0).then((function(t){return!(!t||e.cancelled)&&(c.data.helptip.wot=t,c.store(),e.continue)}))})).then((function(t){return!!t&&e.startWotCertTour(0,!0).then((function(t){return!!t&&(c.data.helptip.wotCerts=t,c.store(),e.continue)}))})).then((function(t){return!!t&&e.startCurrencyTour(0,!0).then((function(t){return!(!t||e.cancelled)&&(c.data.helptip.currency=t,c.store(),e.continue)}))})).then((function(t){return!!t&&e.startNetworkTour(0,!0).then((function(t){return!(!t||e.cancelled)&&(c.data.helptip.network=t,c.store(),e.continue)}))})).then((function(t){return!!t&&(!l.readonly||e.startSettingsTour(0,!0))})).then((function(t){return!!t&&e.finishTour()}))},e.startCurrencyTour=function(n,a){var o,u=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-currency",{bindings:{content:"HELP.TIP.MENU_BTN_CURRENCY",icon:{position:s.screen.isSmall()||l.readonly?"left":"bottom-left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.currency":"app.currency_lg").then((function(){return e.showHelpTip("helptip-currency-mass-member",{bindings:{content:"HELP.TIP.CURRENCY_MASS",icon:{position:"center"}}})}))},function(){return!c.data.useRelative||e.showHelpTip("helptip-currency-mass-member-unit",{bindings:{content:"HELP.TIP.CURRENCY_UNIT_RELATIVE",contentParams:o,icon:{position:s.screen.isSmall()?"right":"center"}}})},function(){return 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"),r("helptip-currency-newcomers-anchor"),e.showHelpTip("helptip-currency-newcomers",{bindings:{content:"HELP.TIP.CURRENCY_WOT",icon:{position:"center"},hasNext:a},timeout:1200,retry:2})}];return d.get().then((function(t){return o=t.parameters,e.executeStep("currency",u,n)}))},e.startNetworkTour=function(o,r){var u=function(){t.is("app.currency")&&a((function(){var e=n.document.querySelectorAll("ion-tabs .tabs a");e&&3===e.length&&angular.element(e[2]).triggerHandler("click")}),100)},p=[function(){return!!s.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-network",{bindings:{content:"HELP.TIP.MENU_BTN_NETWORK",icon:{position:s.screen.isSmall()||l.readonly?"left":"bottom-left"}}}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.currency.tab_network":"app.network").then((function(){return u(),e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_BLOCKCHAIN",icon:{position:"center",glyph:"ion-information-circled"}},timeout:1200})}))},function(){return u(),e.showHelpTip("helptip-network-peer-0",{bindings:{content:"HELP.TIP.NETWORK_PEERS",icon:{position:s.screen.isSmall()?void 0:"center"}},timeout:1e3,retry:20})},function(){return u(),e.showHelpTip("helptip-network-peer-0-block",{bindings:{content:"HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER",icon:{position:s.screen.isSmall()?void 0:"center"}}})},function(){u();var t=c.data.locale.id;return e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_PEERS_PARTICIPATE",contentParams:{installDocUrl:l.helptip&&l.helptip.installDocUrl?l.helptip.installDocUrl[t]?l.helptip.installDocUrl[t]:l.helptip.installDocUrl:"http://duniter.org"},icon:{position:"center",glyph:"ion-information-circled"},hasNext:r}})}];return d.parameters().then((function(t){return e.executeStep("network",p,o)}))},e.startWotLookupTour=function(o,r){var c=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-wot",{bindings:{content:"HELP.TIP.MENU_BTN_WOT",icon:{position:s.screen.isSmall()||l.readonly?"left":"bottom-left"}},onError:"continue"})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.wot_lookup.tab_search":"app.wot_lookup_lg").then((function(){return e.showHelpTip("helptip-wot-search-text",{bindings:{content:s.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 t=n.document.getElementById("helptip-wot-search-result-0");return!t||(a((function(){angular.element(t).triggerHandler("click")})),e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS",hasNext:r},timeout:2500}))}];return e.executeStep("wotLookup",c,o)},e.startWotTour=function(t,n){var i,a=[function(){return e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT",contentParams:i,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:n}})}];return d.get().then((function(n){return(i=n.parameters).currentUD=n.currentUD,e.executeStep("wot",a,t)}))},e.startWotCertTour=function(i,r){if(l.readonly)return o.when(!0);var c=[function(){if(t.is("app.wot_identity")){var i=n.document.getElementById("helptip-wot-view-certifications");if(!i)return!0;a((function(){angular.element(i).triggerHandler("click")}))}return e.showHelpTip(s.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFY",icon:{position:s.screen.isSmall()?"bottom-right":"center"}},timeout:s.screen.isSmall()?2e3:1e3,retry:10})},function(){return e.showHelpTip(s.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:r}})}];return e.executeStep("certs",c,i)},e.startWalletNoLoginTour=function(t,n){if(m.isLogin())return o.when(!0);var a=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"},hasNext:n}})},function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-tx",{bindings:{content:"HELP.TIP.MENU_BTN_TX",icon:{position:"left"},hasNext:n}})},function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-wallets",{bindings:{content:"HELP.TIP.MENU_BTN_WALLETS",icon:{position:"left"},hasNext:n}})}];return e.executeStep("wallet-no-login",a,t)},e.startWalletTour=function(n,a){if(!m.isLogin())return o.when(!0);var l=m.data.isMember||m.data.requirements&&m.data.requirements.pendingMembership,c=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:m.data.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet").then((function(){return e.showHelpTip(s.screen.isSmall()?"helptip-wallet-options-xs":"helptip-wallet-options",{bindings:{content:"HELP.TIP.WALLET_OPTIONS",icon:{position:s.screen.isSmall()?"right":"center"}},timeout:s.screen.isSmall()?2e3:1e3,retry:10})}))},function(){return r("helptip-wallet-pubkey"),e.showHelpTip("helptip-wallet-pubkey",{bindings:{content:"HELP.TIP.WALLET_PUBKEY",icon:{position:"center"},hasNext:!l&&a},timeout:s.screen.isSmall()?2e3:500,retry:10})},function(){return l?(r("helptip-wallet-certifications"),e.showHelpTip("helptip-wallet-certifications",{bindings:{content:s.screen.isSmall()?"HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS":"HELP.TIP.WALLET_CERTIFICATIONS",icon:{position:"center"},hasNext:a},timeout:500,onError:"continue"})):a}];return c.length!=u.wallet.stepCount&&console.error("[help] Invalid value of 'csHelpConstants.wallet.stepCount'. Please update to {0}".format(c.length)),d.get().then((function(t){return t.parameters.currentUD=t.currentUD,e.executeStep("wallet",c,n)}))},e.startWalletCertTour=function(i,r){if(!m.isLogin())return o.when(!0);var l=!1,c=[function(){if(t.is("app.view_wallet")){var i=n.document.getElementById("helptip-wallet-certifications");if(!i)return l=!0,!0;a((function(){angular.element(i).triggerHandler("click")}))}return!s.screen.isSmall()||e.showHelpTip("helptip-received-certs",{bindings:{content:"HELP.TIP.WALLET_RECEIVED_CERTS"}})},function(){return!(!l&&s.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(l)return!0;if(t.is("app.view_wallet")){var i=n.document.getElementById("helptip-wallet-given-certifications");if(!i)return l=!0,!0;a((function(){angular.element(i).triggerHandler("click")}),500)}return e.showHelpTip(s.screen.isSmall()?"fab-select-certify":"helptip-certs-select-certify",{bindings:{content:"HELP.TIP.WALLET_CERTIFY",icon:{position:s.screen.isSmall()?"bottom-right":"center"}},timeout:s.screen.isSmall()?2e3:500,retry:10})},function(){return e.tour||l?r:e.showHelpTip("helptip-certs-stock",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:r}})}];return d.parameters().then((function(t){return e.executeStep("certs",c,i)}))},e.startTxTour=function(n,a){if(!m.isLogin())return o.when(!0);var r,s=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-tx",{bindings:{content:"HELP.TIP.MENU_BTN_TX",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet_tx").then((function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:c.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.get().then((function(t){return(r=t.parameters).currentUD=t.currentUD,e.executeStep("tx",s,n)}))},e.startWalletsTour=function(t,n){var a=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-wallets",{bindings:{content:"HELP.TIP.MENU_BTN_WALLETS",icon:{position:"left"},hasNext:n}})}];return e.executeStep("my-wallets",a,t)},e.startHeaderTour=function(r,c){if(s.screen.isSmall()||l.readonly)return o.when(!0);function d(){var e=n.document.querySelectorAll("#helptip-header-bar-btn-profile");return e&&e.length?_.find(e,(function(e){return e.offsetWidth>0})):null}var u=[function(){if(s.screen.isSmall())return!0;var n=d();return!n||e.showHelpTip(n,{bindings:{content:"HELP.TIP.HEADER_BAR_BTN_PROFILE",icon:{position:"right",style:t.is("app.home")?"margin-right: 60px":void 0}}})},function(){if(s.screen.isSmall())return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"},hasNext:c},timeout:1e3});var t=d();return!t||(a((function(){angular.element(t).triggerHandler("click")})),e.showHelpTip("helptip-popover-profile-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"center"},hasNext:c},timeout:1e3}).then((function(t){return e.closeProfilePopover(),t})))}];return e.executeStep("header",u,r)},e.startSettingsTour=function(n,a){var o,r=[function(){return!s.screen.isSmall()&&!l.readonly||(i.toggleLeft(!0),e.showHelpTip(s.screen.isSmall()?"helptip-menu-btn-settings":"menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:s.screen.isSmall()?"left":"bottom-left"}},timeout:1e3}))},function(){return i.isOpen()&&i.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:s.screen.isSmall()?{position:"right",style:"margin-right: 60px"}:{position:"center"},hasNext:a},timeout:1e3})}))}];return d.parameters().then((function(t){return o=t,e.executeStep("settings",r,n)}))},e.finishTour=function(){return i.isOpen()&&i.toggleLeft(!1),m.isLogin()?t.go("app.view_wallet").then((function(){return e.showHelpTip("helptip-wallet-pubkey",{bindings:{content:"HELP.TIP.END_LOGIN",hasNext:!1},timeout:1200})})):o.all([e.showHome(),d.parameters().then((function(e){n=e}))]).then((function(){return e.showHelpTip("helptip-home-logo",{bindings:{content:l.readonly?"HELP.TIP.END_READONLY":"HELP.TIP.END_NOT_LOGIN",contentParams:n,hasNext:!1}})}));var n}}function g(e){e.$on("$ionicView.enter",(function(t,n){e.startHelpTour()}))}function f(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b,g,f){var h;e.loading=!0,e.settings=b.data,e.qrcodeId="qrcode-wallet-"+e.$id,e.toggleQRCode=!1,e.likeData={likes:{},abuses:{}},e.enter=function(t,n){if(e.loading=e.loading||n.stateParams&&n.stateParams.refresh,e.enableSelectWallet=g.children.count()>0,e.loading)return(h=n.stateParams&&n.stateParams.id?g.children.get(n.stateParams.id):g)?(e.isDefaultWallet=h.isDefault(),e.walletId=h.id,e.cleanLocationHref(n),e.load()):(c.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome());c.loading.hide(10),a(e.updateView,300)},e.$on("$ionicView.enter",e.enter),e.load=function(){if(h)return h.login().then((function(t){e.formData=t,e.loading=!1,e.updateView(),e.addListeners(),e.showQRCode(),h.isDefault()&&e.showHelpTip(),c.loading.hide(10)})).catch((function(t){"CANCELLED"!==t?c.onError("ERROR.LOAD_WALLET_DATA_ERROR")(t):e.showHome()}))},e.updateView=function(){e.motion.show({selector:"#wallet .item"}),e.$broadcast("$$rebind::rebind")},e.setRegisterForm=function(t){e.registerForm=t},e.onWalletLogout=function(){e.hideQRCode(),e.removeListeners(),delete e.formData,h=null,e.loading=!0},e.addListeners=function(){e.listeners=[h.api.data.on.logout(e,e.onWalletLogout),e.$watchCollection("formData.events",(function(t,n){!n||e.loading||angular.equals(t,n)||e.updateView()}))]},e.removeListeners=function(){_.forEach(e.listeners,(function(e){e()})),e.listeners=[]},e.showUidPopup=function(){return n((function(t,n){r(["ACCOUNT.NEW.TITLE","ACCOUNT.POPUP_REGISTER.TITLE","ACCOUNT.POPUP_REGISTER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(a){e.formData.newUid=e.formData.uid?""+e.formData.uid:"",i.show({templateUrl:"templates/wallet/popup_register.html",title:a["ACCOUNT.POPUP_REGISTER.TITLE"],subTitle:a["ACCOUNT.POPUP_REGISTER.HELP"],scope:e,buttons:[{text:a["COMMON.BTN_CANCEL"]},{text:a["COMMON.BTN_OK"],type:"button-positive",onTap:function(t){if(e.registerForm.$submitted=!0,e.registerForm.$valid&&e.formData.newUid)return e.formData.newUid;t.preventDefault()}}]}).then((function(i){if(!i)return delete e.formData.uid,c.loading.hide(),void n("CANCELLED");t(i)}))}))}))},e.self=function(){return e.hideActionsPopover(),e.showUidPopup().then((function(t){if(t)return c.loading.show(),h.self(t).then((function(){e.updateView(),c.loading.hide()})).catch((function(t){c.onError("ERROR.SEND_IDENTITY_FAILED")(t).then((function(){e.self()}))}))}))},e.doMembershipIn=function(t){return h.membership.inside().then((function(){e.updateView(),c.loading.hide()})).catch((function(n){if("CANCELLED"===n)throw n;if(n&&n.ucode!=m.errorCodes.MEMBERSHIP_ALREADY_SEND)return console.error("[wallet] Node: already membership",n),void c.loading.hide();if(!t||t<=2)return a((function(){return e.doMembershipIn((t||0)+1)}),1e3);throw n}))},e.membershipIn=function(t){if(e.hideActionsPopover(),h.isMember())return c.alert.info("INFO.NOT_NEED_MEMBERSHIP");var n=angular.isDefined(e.formData.blockUid)&&e.formData.uid||void 0;return u.showJoinMember({uid:n,blockUid:n&&e.formData.blockUid,pubkey:e.formData.pubkey}).catch((function(e){"CANCELLED"!==e&&(h.data.uid?c.onError("ERROR.SEND_MEMBERSHIP_IN_FAILED")(e):c.onError("ERROR.SEND_IDENTITY_FAILED")(e))}))},e.membershipOut=function(t,n){return e.hideActionsPopover(),t?n?(c.loading.show(),h.membership.out().then((function(){c.loading.hide(),c.toast.show("INFO.MEMBERSHIP_OUT_SENT")})).catch(c.onError("ERROR.SEND_MEMBERSHIP_OUT_FAILED"))):c.alert.confirm("CONFIRM.MEMBERSHIP_OUT_2","CONFIRM.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then((function(t){t&&e.membershipOut(!0,!0)})):c.alert.confirm("CONFIRM.MEMBERSHIP_OUT","CONFIRM.POPUP_WARNING_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then((function(t){t&&e.membershipOut(!0)}))},e.doUpdate=function(t){return console.debug("[wallet] Refreshing data..."),(t?h.refreshData():c.loading.show().then(h.refreshData).then(c.loading.hide)).then(e.updateView).catch(c.onError("ERROR.REFRESH_WALLET_DATA"))},e.renewMembership=function(t){return h.isMember()||e.formData.requirements.wasMember?t||e.formData.requirements.needRenew?h.auth({minData:!0}).then((function(){return c.loading.hide(),c.alert.confirm("CONFIRM.RENEW_MEMBERSHIP")})).then((function(t){if(t)return c.loading.show(),e.doMembershipIn()})).catch((function(e){"CANCELLED"!==e&&(c.loading.hide(),c.alert.error(e))})):r("CONFIRM.NOT_NEED_RENEW_MEMBERSHIP",{membershipExpiresIn:e.formData.requirements.membershipExpiresIn}).then((function(e){return c.alert.confirm(e)})).then((function(t){if(t)return e.renewMembership(!0)})):c.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")},e.fixIdentity=function(){if(e.formData.uid)return n.all([h.auth(),r("CONFIRM.FIX_IDENTITY",{uid:e.formData.uid})]).then((function(e){return c.alert.confirm(e[1])})).then((function(t){if(t)return c.loading.show(),e.formData.blockUid=null,e.formData.sigDate=null,h.self(e.formData.uid)})).then(e.doMembershipIn).catch((function(e){"CANCELLED"!==e&&(c.loading.hide(),c.alert.error(e))}))},e.fixMembership=function(){if(e.formData.uid)return h.isMember()?c.alert.info("INFO.NOT_NEED_MEMBERSHIP"):(e.hideActionsPopover(),h.auth({silent:!0}).then((function(){c.alert.confirm("CONFIRM.FIX_MEMBERSHIP")})).then((function(t){if(t)return c.loading.show(),e.formData.blockUid=null,e.formData.sigDate=null,h.self(e.formData.uid,!1)})).then(e.doMembershipIn).catch((function(e){"CANCELLED"!==e&&(c.loading.hide(),c.alert.error(e))})))},e.doQuickFix=function(t){"renew"===t?e.renewMembership():"membership"===t?e.membershipIn(!0):"fixMembership"===t?e.fixMembership(!1):"fixIdentity"===t&&e.fixIdentity()};var T=e.logout;e.logout=function(t){if(e.isDefaultWallet)return T(t)},e.startWalletTour=function(){return e.hideActionsPopover(),f.wallet.tour()},e.showHelpTip=function(){return f.wallet.helptip()},e.showQRCode=function(t){if(h&&e.qrcodeId){var n=angular.element(document.querySelector("#"+e.qrcodeId+" .content"));n?h.loadQrCode().then((function(i){n.html(i),c.motion.toggleOn({selector:"#"+e.qrcodeId},t||1100)})):console.error("[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.".format(e.qrcodeId))}},e.hideQRCode=function(){e.qrcodeId&&angular.element(document.querySelector("#"+e.qrcodeId))&&c.motion.toggleOff({selector:"#"+e.qrcodeId})},e.showCertifications=function(){e.isDefaultWallet?o.go(c.screen.isSmall()?"app.wallet_cert":"app.wallet_cert_lg",{type:"received"}):o.go(c.screen.isSmall()?"app.wallet_cert_by_id":"app.wallet_cert_lg_by_id",{id:e.walletId,type:"received"})},e.showGivenCertifications=function(){e.isDefaultWallet?o.go(c.screen.isSmall()?"app.wallet_cert":"app.wallet_cert_lg",{type:"given"}):o.go(c.screen.isSmall()?"app.wallet_cert_by_id":"app.wallet_cert_lg_by_id",{id:e.walletId,type:"given"})},e.showTxHistory=function(){o.go(e.isDefaultWallet?"app.view_wallet_tx":"app.view_wallet_tx_by_id",{id:e.walletId})},e.showLicenseModal=function(){return d.show("templates/currency/modal_license.html","CurrencyLicenseModalCtrl")},e.showTransferModal=function(){if(e.formData.balance&&e.formData.balance>0||g.children.count())return u.showTransfer({wallet:h.id}).then((function(t){t&&(c.toast.show("INFO.TRANSFER_SENT"),e.$broadcast("$$rebind::balance"),e.motion.show({selector:".item-pending"}))}));c.alert.info("INFO.NOT_ENOUGH_CREDIT")},e.showSecurityModal=function(){return e.hideActionsPopover(),u.showAccountSecurity({wallet:h}).then((function(t){if(t)return"self"===t?e.self():"membershipIn"===t?e.membershipIn():void 0}))},e.showSelectIdentitiesModal=function(){return e.hideActionsPopover(),u.showSelectPubkeyIdentity({identities:[e.formData.requirements].concat(e.formData.requirements.alternatives)}).then((function(t){if(t&&t.uid)return e.loading=!0,h.setSelf(t.uid,t.blockUid).then((function(){e.loading=!1,e.updateView(),c.loading.hide()}))}))},e.showSelectWalletModal=function(){if(g.children.count())return u.showSelectWallet({parameters:{showDefault:!0,showBalance:!1,excludedWalletId:e.walletId}}).then((function(t){if(t&&(!h||t.id!==h.id))return e.removeListeners(),e.loading=!0,h=t,console.debug("[transfer] Using wallet {"+h.id+"}"),e.formData={},e.load()}))},e.showActionsPopover=function(t){c.popover.show(t,{templateUrl:"templates/wallet/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showSharePopover=function(n){e.hideActionsPopover();var i=e.formData.name||e.formData.uid||e.formData.pubkey,a=(E.shareBaseUrl||t.rootPath)+o.href("app.wot_identity",{pubkey:e.formData.pubkey,uid:e.formData.uid});c.screen.isSmall()&&(n=angular.element(document.querySelector("#wallet-share-anchor"))||n),c.popover.share(n,{bindings:{url:a,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:i},postMessage:i}})},e.showSelectWalletPopover=function(t){return p.showSelectWallet(t,{parameters:{excludedWalletId:e.walletId}}).then((function(t){if(t&&t.id!==e.walletId)return t.isDefault()?o.go("app.view_wallet"):o.go("app.view_wallet_by_id",{id:t.id})}))},e.cleanLocationHref=function(e){e&&e.stateParams&&e.stateParams.refresh&&a((function(){var t=angular.copy(e.stateParams);delete t.refresh,delete t.id,l.search(t).replace()}),300)}}function h(e,t,n,i,a,o,r,s,l,c,d,u,p,m){var E;e.loading=!0,e.settings=d.data,e.listeners=[],e.qrcodeId="qrcode-wallet-tx-"+e.$id,e.enter=function(t,n){if(e.loading=e.loading||n.stateParams&&n.stateParams.refresh,e.enableSelectWallet=p.children.count()>0,e.loading)return(E=n.stateParams&&n.stateParams.id?p.children.get(n.stateParams.id):p)?(e.walletId=E.id,e.cleanLocationHref(n),e.load()):(o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome());e.addListeners(),i(e.updateView,300)},e.$on("$ionicView.enter",e.enter),e.leave=function(){e.removeListeners()},e.$on("$ionicView.leave",e.leave),e.load=function(){if(!E)return $q.reject("Missing wallet");var t=E.isDataLoaded({minData:!0}),n={requirements:!t,minData:!t,sources:!0,tx:{enable:!0}};return E.login(n).then((function(t){return e.formData=t,e.loading=!1,e.updateView(),e.addListeners(),e.showFab("fab-transfer"),e.showQRCode(),E.isDefault()&&e.showHelpTip(),o.loading.hide(10)})).catch((function(t){"CANCELLED"!==t?(console.error(t),o.onError("ERROR.LOAD_WALLET_DATA_ERROR")(t)):e.showHome()}))},e.cleanLocationHref=function(e){e&&e.stateParams&&e.stateParams.refresh&&i((function(){var t=angular.copy(e.stateParams);delete t.refresh,delete t.id,a.search(t).replace()}),300)},e.updateView=function(){e.formData&&!e.loading&&(e.$broadcast("$$rebind::balance"),e.$broadcast("$$rebind::rebind"),e.motion.show({selector:".view-wallet-tx .item",ink:!1}))},e.downloadHistoryFile=function(t){(t=t||{}).fromTime=t.fromTime||-1;var n=e.formData.pubkey;m.downloadHistoryFile(n,t)},e.doUpdate=function(t){console.debug("[wallet] TX history reloading...");var n={sources:!0,tx:{enable:!0,fromTime:e.formData&&e.formData.tx&&e.formData.tx.fromTime||void 0},api:!1};return(t?E.refreshData(n):o.loading.show().then((function(){return E.refreshData(n)})).then(o.loading.hide)).then(e.updateView).catch(o.onError("ERROR.REFRESH_WALLET_DATA"))},e.showQRCode=function(t){if(E&&e.qrcodeId){var n=angular.element(document.querySelector("#"+e.qrcodeId+" .content"));n?E.loadQrCode().then((function(i){n.html(i),o.motion.toggleOn({selector:"#"+e.qrcodeId},t||1100)})):console.error("[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.".format(e.qrcodeId))}},e.hideQRCode=function(){e.qrcodeId&&angular.element(document.querySelector("#"+e.qrcodeId))&&o.motion.toggleOff({selector:"#"+e.qrcodeId})},e.addListeners=function(){e.listeners=[E.api.data.on.balanceChanged(e,e.updateView),e.$watch("settings.useRelative",e.updateView,!0),e.$watch("settings.showUDHistory",(function(t,n){e.formData&&!e.loading&&t!==n&&e.doUpdate()}),!0)],e.settings.walletHistoryAutoRefresh&&e.listeners.push(u.api.data.on.newBlock(e,(function(t){e.loading||(console.debug("[wallet] Received new block. Will reload history."),i((function(){e.doUpdate(!0)}),500))})))},e.removeListeners=function(){_.forEach(e.listeners,(function(e){e()})),e.listeners=[]},e.showTransferModal=function(){if(e.formData.balance&&e.formData.balance>0||p.children.count())return r.showTransfer({wallet:E.id}).then((function(t){t&&(o.toast.show("INFO.TRANSFER_SENT"),e.$broadcast("$$rebind::balance"),e.motion.show({selector:".item-pending"}))}));o.alert.info("INFO.NOT_ENOUGH_CREDIT")},e.showHelpTip=function(e,t){},e.showTxErrors=function(t){return E.isDefault()?e.goState("app.view_wallet_tx_errors"):e.goState("app.view_wallet_tx_errors_by_id",{id:E.id})},e.showMoreTx=function(t){return t=t||e.formData.tx.fromTime-d.data.walletHistoryTimeSecond||c.date.now()-2*d.data.walletHistoryTimeSecond,o.loading.show(),E.refreshData({tx:{enable:!0,fromTime:t}}).then((function(){e.updateView(),o.loading.hide()})).catch((function(n){n.ucode==l.errorCodes.HTTP_LIMITATION?i((function(){return e.showMoreTx(t)}),2e3):o.onError("ERROR.REFRESH_WALLET_DATA")(n)}))},e.showSelectWalletModal=function(){if(p.children.count())return r.showSelectWallet({parameters:{showDefault:!0,showBalance:!1,excludedWalletId:e.walletId}}).then((function(t){if(t&&(!E||t.id!==E.id))return e.removeListeners(),e.loading=!0,E=t,console.debug("[transfer] Using wallet {"+E.id+"}"),e.formData={},e.load()}))},e.toUnlockUIArray=function(t,n,i){return n=n||0,!t.children||"AND"!=t.type&&"OR"!=t.type?{style:{"padding-left":n+"px"},operator:i,type:t.type,value:t.value}:t.children.reduce((function(i,a,o){return a.children&&o>0?(i=i.concat({style:{"padding-left":n+"px","padding-top":"10px","padding-bottom":"10px"},operator:t.type})).concat(e.toUnlockUIArray(a,n+10)):i.concat(e.toUnlockUIArray(a,n+10,o&&t.type))}),[])},e.showLockedOutputsPopover=function(t,n){t.lockedOutputs&&(e.popoverData=e.popoverData||{},e.popoverData.lockedOuputs=t.lockedOutputs.reduce((function(t,n){return t.concat({amount:n.amount,unlockFunctions:n.unlockFunctions,unlockConditions:e.toUnlockUIArray(n.unlockTree)})}),[]),o.popover.show(n,{templateUrl:"templates/wallet/tx_locked_outputs_popover.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}}))},e.hideLockedOutputsPopover=function(){e.lockedOutputsPopover&&(e.lockedOutputsPopover.hide(),e.popoverData&&delete e.popoverData.unlockConditions,e.lockedOutputsPopover=null)},e.showSelectWalletPopover=function(t){return s.showSelectWallet(t,{scope:e}).then((function(t){if(t&&t.id!==E.id)return t.isDefault()?e.goState("app.view_wallet_tx"):e.goState("app.view_wallet_tx_by_id",{id:t.id})}))},e.goState=function(t,i){return e.hideLockedOutputsPopover(),n.go(t,i)}}function T(e,t,n,i){var a;e.settings=n.data,e.loading=!0,e.formData={},e.$on("$ionicView.enter",(function(n,o){return(a=o.stateParams&&o.stateParams.id?i.children.get(o.stateParams.id):i)?e.load():(t.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome())})),e.load=function(){if(a)return a.login().then((function(n){e.formData=n,e.loading=!1,e.doMotion(),t.loading.hide()}))},e.doUpdate=function(n){return e.loading=!0,(n?a.refreshData():t.loading.show().then(i.refreshData).then(t.loading.hide)).then((function(){e.doMotion(),e.loading=!1})).catch((function(n){t.onError("ERROR.REFRESH_WALLET_DATA")(n),e.loading=!1}))},e.filterReceivedTx=function(e){return e.amount&&e.amount>0},e.filterSentTx=function(e){return e.amount&&e.amount<0},e.hasReceivedTx=function(){return e.formData.tx&&_(e.formData.tx.errors||[]).find(e.filterReceivedTx)&&!0},e.hasSentTx=function(){return e.formData.tx&&_(e.formData.tx.errors||[]).find(e.filterSentTx)&&!0}}function v(e,t,n,i,a,o){var r=o&&o.wallet||i;e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.smallscreen=t.screen.isSmall(),e.recover={},e.isValidFile=!1,e.login=r.isLogin(),e.hasSelf=r.hasSelf(),e.needSelf=e.login&&r.data.requirements.needSelf,e.canRevoke=e.login&&e.hasSelf&&!r.data.requirements.revoked,e.needMembership=e.login&&r.data.requirements.needMembership,e.option=e.login?"saveID":"recoverID",e.formData={addQuestion:"",level:"4",questions:[]};for(var s=[],l=1;l<20;l++)s.push("ACCOUNT.SECURITY.QUESTION_"+l.toString());a(s).then((function(t){_.each(t,(function(t){e.formData.questions.push({value:t,checked:!1})}))})),e.$on("$ionicSlides.sliderInitialized",(function(e,t){t.slider.lockSwipes()})),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=3===e.slides.slider.activeIndex&&("saveID"==e.option||"recoverID"==e.option)||2===e.slides.slider.activeIndex&&"revocation"==e.option},e.doNext=function(n){if(!n)switch(e.slides.slider.activeIndex){case 1:switch(e.option){case"saveID":n="questionsForm";break;case"recoverID":e.isValidFile?(e.slideNext(),e.hasContent=!1,e.fileData=""):t.alert.error("ERROR.NOT_VALID_SAVE_ID_FILE","ERROR.LOAD_FILE_FAILED")}break;case 2:switch(e.option){case"recoverID":n="recoverForm";break;case"saveID":n="answersForm"}}if(n){if(e[n].$submitted=!0,!e[n].$valid)return;switch(n){case"recoverForm":e.recoverId();break;case"answersForm":e.downloadSaveIDFile();break;default:e.slideNext()}}},e.selectOption=function(i,a){if(!a&&n.demo)return t.alert.demo();e.option=i,e.slideNext()},e.restore=function(){1===e.slides.slider.activeIndex&&"saveID"===e.option?(e.formData={addQuestion:"",level:"4",questions:[]},a(s).then((function(t){_.each(t,(function(t){e.formData.questions.push({value:t,checked:!1})}))}))):2===e.slides.slider.activeIndex&&"saveID"===e.option?_.each(e.formData.questions,(function(e){e.answer=void 0})):1===e.slides.slider.activeIndex&&"recoverID"===e.option?(e.hasContent=!1,e.recover={},e.fileData="",e.isValidFile=!1):2===e.slides.slider.activeIndex&&"recoverID"===e.option?_.each(e.recover.questions,(function(e){e.answer=void 0})):2===e.slides.slider.activeIndex&&"revocation"===e.option&&(e.isValidFile=!1,e.hasContent=!1,e.revocation=void 0)},e.onFileChanged=function(t){if(e.hasContent=angular.isDefined(t)&&""!==t,e.fileData=t.fileData?t.fileData:"",e.isValidFile=""!==e.fileData&&"text/plain"===e.fileData.type,e.isValidFile&&"recoverID"===e.option){e.content=t.fileContent.split("\n");var n=_.indexOf(e.content,"Questions: "),i=-1;_.each(e.content,(function(t,n){/^Issuer:/.test(t)?i=n:/^Crypted-Nonce:/.test(t)?e.recover.cypherNonce=t.split(" ")[1]:/^Crypted-Pubkey:/.test(t)?e.recover.cypherPubkey=t.split(" ")[1]:/^Crypted-Salt:/.test(t)?e.recover.cypherSalt=t.split(" ")[1]:/^Crypted-Pwd:/.test(t)&&(e.recover.cypherPwd=t.split(" ")[1])})),e.recover.questions=[];for(var a=n+1;a<i;a++)e.recover.questions.push({value:e.content[a]})}else e.isValidFile&&"revocation"===e.option&&(e.revocation=t.fileContent)},e.recoverId=function(){if(e.recoverForm.$valid)return e.recover.answer="",_.each(e.recover.questions,(function(t){e.recover.answer+=t.answer})),r.recoverId(e.recover).then((function(n){angular.isDefined(n)?(e.recover=n,e.slideNext()):t.alert.error("ERROR.RECOVER_ID_FAILED")})).catch(t.onError("ERROR.RECOVER_ID_FAILED"))},e.addQuestion=function(){""!==e.formData.addQuestion&&(e.formData.questions.push({value:e.formData.addQuestion,checked:!0}),e.formData.addQuestion="")},e.downloadSaveIDFile=function(){var n;return r.auth({forceAuth:!0,expectedPubkey:e.pubkey,silent:!0,success:function(e){n=e}}).catch((function(e){e&&"CANCELLED"===e||t.alert.error("ERROR.SALT_OR_PASSWORD_NOT_CONFIRMED","ERROR.LOGIN_FAILED")})).then((function(t){if(t){var i={file:_.filter(e.formData.questions,(function(e){return e.checked}))},a={salt:n.username,pwd:n.password,questions:"",answer:""};return _.each(i.file,(function(e){a.questions+=e.value+"\n",a.answer+=e.answer})),r.getCryptedId(a).then((function(t){r.downloadSaveId(t),e.closeModal()}))}}))},e.isRequired=function(){return _.filter(e.formData.questions,(function(e){return e.checked})).length<e.formData.level},e.revokeWithFile=function(){e.isValidFile?e.revokeIdentity():t.alert.error("ERROR.NOT_VALID_REVOCATION_FILE","ERROR.LOAD_FILE_FAILED")},e.downloadRevokeFile=function(){return r.auth({forceAuth:!0}).then((function(){return r.downloadRevocation()})).then((function(){t.loading.hide()})).catch((function(e){e&&"CANCELLED"===e||t.onError("ERROR.DOWNLOAD_REVOCATION_FAILED")(e)}))},e.revokeWalletIdentity=function(){return e.hasSelf?r.auth({forceAuth:!0}).then((function(n){if(t.loading.hide(),n)return e.revokeIdentity()})).catch((function(e){"CANCELLED"!==e&&t.onError("ERROR.REVOCATION_FAILED")(e)})):t.alert.error("ERROR.ONLY_SELF_CAN_EXECUTE_THIS_ACTION")},e.revokeIdentity=function(n){return n?t.loading.show().then((function(){return e.revocation?r.revokeWithFile(e.revocation):r.revoke()})).then((function(){return t.toast.show("INFO.REVOCATION_SENT"),e.closeModal(),t.loading.hide()})).catch((function(n){e.revocation?(e.isValidFile=!1,e.revocationError=n&&n.message||n||"ERROR.REVOCATION_FAILED",t.loading.hide(10)):t.onError("ERROR.REVOCATION_FAILED")(n)})):t.alert.confirm("CONFIRM.REVOKE_IDENTITY","CONFIRM.POPUP_WARNING_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then((function(e){if(e)return t.alert.confirm("CONFIRM.REVOKE_IDENTITY_2","CONFIRM.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"})})).then((function(t){t&&e.revokeIdentity(!0,!0)}))},e.self=function(){return e.closeModal("self")},e.membershipIn=function(){return e.closeModal("membershipIn")},e.downloadKeyFile=function(n){return r.auth({forceAuth:!0}).then((function(){return r.downloadKeyFile(n)})).then((function(){return t.loading.hide(),e.closeModal()})).catch((function(e){e&&"CANCELLED"===e?t.loading.hide():t.onError("ERROR.DOWNLOAD_KEYFILE_FAILED")(e)}))}}function I(e,t,n,i,a,o,r,s){e.loading=!0,e.wallets=null,e.formData={useRelative:o.data.useRelative,showDefault:!0,showBalance:!1,balance:void 0,updatingWalletId:void 0,stopped:!1,minData:!0},e.motion=null,e.setParameters=function(t){t=t||{},e.formData.useRelative=angular.isDefined(t.useRelative)?t.useRelative:e.formData.useRelative,e.formData.showBalance=angular.isDefined(t.showBalance)?t.showBalance:e.formData.showBalance,e.formData.minData=angular.isDefined(t.minData)?t.minData:e.formData.minData,e.formData.excludedWalletId=t.excludedWalletId,e.formData.showDefault=(angular.isDefined(t.showDefault)?t.showDefault:e.formData.showDefault)&&"default"!==e.formData.excludedWalletId},e.load=function(n){n=n||{},e.loading=!1!==n.silent,e.formData.balance=void 0,e.formData.updatingWalletId=void 0,e.formData.stopped=!1;var o=[];o.push(r.name().then((function(t){return e.currency=t,a.ready()}))),e.defaultWallet=e.formData.showDefault?s:void 0,e.wallets||o.push(s.children.all().then((function(t){e.wallets=t,i.loading.hide()})));var l={silent:!0,minData:e.formData.minData,sources:e.formData.showBalance,tx:{enable:!1},api:!0},c=!1,d=0,u=Date.now(),p=0;return(o.length?t.all(o):t.when()).then((function(){var i=e.formData.showDefault?[s].concat(e.wallets):e.wallets;if(i.length)return console.debug("[wallets] Loading {0} wallets...".format(i.length)),i.reduce((function(t,i){return!n.refresh&&i.isDataLoaded(l)?(console.debug("[wallets] Wallet #{0} already loaded. Skipping".format(i.id)),t.then((function(){p+=i.data.balance,e.updateWalletView(i.id)}))):(d++,t.then((function(){if(!e.formData.stopped){var t;if(e.formData.updatingWalletId=i.id,n.refresh&&i.data.loaded){var a=angular.merge({requirements:!i.data.requirements.loaded||i.data.requirements.isMember||i.data.requirements.wasMember||i.data.requirements.pendingMembership},l);t=i.refreshData(a)}else t=i.loadData(l);return t.then((function(t){p+=t.balance,e.updateWalletView(i.id)})).catch((function(e){console.error("[wallets] Error while loading data of wallet #{0}".format(i.id),e),c=!0})),t}})))}),t.when())})).then((function(){if(c)return i.alert.error("ERROR.LOAD_WALLET_LIST_FAILED").then((function(){e.resetData(),e.cancel()}));e.formData.stopped||(d&&console.debug("[wallets] Loaded data of {0} wallet(s) in {1}ms".format(d,Date.now()-u)),e.formData.balance=p,e.formData.updatingWalletId=void 0,e.loading=!1,i.loading.hide(),e.updateView())})).catch((function(t){if(e.resetData(),t&&"CANCELLED"===t)throw e.cancel(),t;return i.onError("ERROR.LOAD_WALLET_LIST_FAILED")(t)}))},e.filterFn=function(e){return function(t){return!e||t.id!==e.excludedWalletId}},e.resetData=function(){console.debug("[wallets] Cleaning wallet list"),e.wallets=null,e.loading=!0,e.entered=!1,e.formData.balance=void 0,e.formData.updatingWalletId=void 0},e.updateView=function(t){if(e.wallets&&e.wallets.length){var n=t&&" #wallet-"+t||"";e.motion?e.motion.show({selector:".list .item.item-wallet"+n,ink:!0}):i.ink({selector:".list .item.item-wallet"+n})}},e.updateWalletView=function(t){e.motion?e.motion.show({selector:".list #wallet-"+t,ink:!0}):i.ink({selector:".list #wallet-"+t})},e.doUpdate=function(i){return e.loading||!e.wallets||!e.wallets.length||e.formData.updatingWalletId?t.when():(e.selectPrevented=!0,n((function(){e.selectPrevented=!1}),1e3),e.load({silent:i,refresh:!0}).then((function(){e.loading=!1,e.selectPrevented=!1,i&&e.$broadcast("$$rebind::rebind"),e.updateView()})))},e.addNewWallet=function(n){return n?o.data.useLocalStorageEncryption&&!s.isAuth()?s.auth({minData:!0}).then((function(){return e.addNewWallet(n)})).catch((function(e){if("CANCELLED"===e)return i.loading.hide();i.onError("ERROR.ADD_SECONDARY_WALLET_FAILED")(e)})):s.api.data.raisePromise.load(n.data).catch(console.error).then((function(){e.addListenersOnWallet(n),s.children.add(n)})):t.reject("Missing 'wallet' argument")},e.showNewWalletModal=function(){var t=s.children.instance();return t.login({showNewAccountLink:!1,title:"ACCOUNT.WALLET_LIST.BTN_NEW",okText:"COMMON.BTN_ADD",minData:!0,sources:!0,api:!1,success:i.loading.show,method:"PUBKEY"}).then((function(n){if(n&&n.pubkey){if(s.isUserPubkey(n.pubkey))throw new Error("ERROR.COULD_NOT_ADD_MAIN_WALLET");if(s.children.hasPubkey(n.pubkey))throw new Error("ERROR.COULD_NOT_ADD_EXISTING_WALLET");return console.debug("[wallet] Adding secondary wallet {{0}}".format(n.pubkey&&n.pubkey.substring(0,8))),e.addNewWallet(t).then((function(){i.loading.hide(),e.updateView()}))}i.loading.hide(100)})).catch(i.onError("ERROR.ADD_SECONDARY_WALLET_FAILED"))},e.addListenersOnWallet=function(e){},e.cancel=function(){console.warn("cancel() must be implement by subclass")},e.select=function(e,t){console.warn("select() must be implement by subclass")}}function O(e,t,n){angular.extend(this,t("WalletListAbstractCtrl",{$scope:e})),e.$on("modal.shown",(function(){e.setParameters(n),e.load()})),e.cancel=function(){e.closeModal()},e.select=function(t,n){t.isDefaultPrevented()||!n||e.selectPrevented||e.closeModal(n)},n&&e.setParameters(n)}function N(e,t,n,i,a,o,r,s,l,c,d,u,p,m){e.settings=p.data,e.listeners=[],angular.extend(this,t("WalletListAbstractCtrl",{$scope:e,parameters:{}})),e.formData.name=void 0,e.motion=c.motion.default,e.entered=!1,e.enter=function(t,n){if(!e.entered)return e.entered=!0,e.setParameters({showDefault:!0,showBalance:!0,minData:!1}),e.load().then((function(){c.loading.hide(),e.wallets&&(e.addListeners(),e.showFab("fab-add-wallet"))}));e.addListeners(),e.formData.stopped&&(e.loading=!1,e.formData.stopped=!1,e.formData.updatingWalletId=void 0,e.updateView())},e.$on("$ionicView.enter",e.enter),e.leave=function(){e.formData.stopped=!0,e.formData.updatingWalletId=void 0,e.loading=!1,e.removeListeners()},e.$on("$ionicView.leave",e.leave),e.cancel=function(){e.showHome()},e.select=function(t,i){t.isDefaultPrevented()||!i||e.selectPrevented||(i.isDefault()?n.go("app.view_wallet"):n.go("app.view_wallet_by_id",{id:i.id}),t.preventDefault())},e.editWallet=function(t,n){return t.preventDefault(),e.showEditPopup(n).then((function(t){if(t)return(p.data.useLocalStorageEncryption?m.auth({minData:!0}):a.when()).then((function(){n.data.localName=t,m.storeData(),c.loading.hide(),e.updateView()})).catch((function(e){if("CANCELLED"===e)return c.loading.hide();c.onError("ERROR.SAVE_WALLET_LIST_FAILED")(e)}))}))},e.downloadAsFile=function(){if(e.wallets)return m.children.downloadFile()},e.selectAndRemoveWallet=function(){return e.hideActionsPopover(),d.showSelectWallet({wallets:e.wallets,showDefault:!1}).then((function(t){if(t&&t.id)return(p.data.useLocalStorageEncryption?m.auth({minData:!0}):a.when()).then((function(){return m.children.remove(t.id)})).then((function(){c.loading.hide(),e.updateView()})).catch(c.onError("ERROR.REMOVE_SECONDARY_WALLET_FAILED"))}))},e.showImportFileModal=function(){return e.hideActionsPopover(),l.show("templates/wallet/list/modal_import_file.html","WalletListImportModalCtrl").then((function(t){if(t&&t.length)return c.loading.show(),(p.data.useLocalStorageEncryption?m.auth({minData:!0}):a.when()).then((function(){return t.reduce((function(t,n){return t.then((function(){return function(t){if(!t||!t.pubkey)return a.reject("Invalid authentication data");console.debug("[wallet] Adding secondary wallet {"+t.pubkey.substring(0,8)+"}");var n=m.children.instance();return n.login({authData:t,minData:!0,sources:!0,api:!1,success:c.loading.show}).then((function(i){return i.localName=t.localName,e.addNewWallet(n)}))}(n)}))}),a.when())})).then((function(){c.loading.hide(),e.updateView()})).catch((function(e){if("CANCELLED"===e)return c.loading.hide();c.onError("ERROR.ADD_SECONDARY_WALLET_FAILED")(e)}))}))},e.setEditForm=function(t){e.editForm=t},e.showEditPopup=function(t){return a((function(n,i){o(["ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE","ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(i){e.formData.name=t.data.localName||t.data.name||t.data.uid||t.data.pubkey&&t.data.pubkey.substring(0,8)||"",s.show({templateUrl:"templates/wallet/list/popup_edit_name.html",title:i["ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE"],subTitle:i["ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP"],scope:e,buttons:[{text:i["COMMON.BTN_CANCEL"]},{text:i["COMMON.BTN_OK"],type:"button-positive",onTap:function(t){if(e.editForm.$submitted=!0,e.editForm.$valid&&e.formData.name)return e.formData.name;t.preventDefault()}}]}).then((function(t){if(!t)return delete e.formData.name,void c.loading.hide();n(t)}))}))}))},e.showActionsPopover=function(t){c.popover.show(t,{templateUrl:"templates/wallet/list/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.onWalletLogout=function(){e.resetData(),e.removeListeners()},e.addListeners=function(){e.removeListeners(),e.listeners=[m.api.data.on.logout(e,e.onWalletLogout)],p.data.walletHistoryAutoRefresh&&e.listeners.push(u.api.data.on.newBlock(e,(function(t){e.loading||(console.debug("[wallet-list] Received new block. Will reload list."),i((function(){e.doUpdate(!0)}),300))}))),_.forEach(e.wallets||[],e.addListenersOnWallet)},e.addListenersOnWallet=function(t){t&&(e.listeners.push(t.api.data.on.unauth(e,e.updateView)),e.listeners.push(t.api.data.on.auth(e,(function(t,n){return i(e.updateView),n?n.resolve():a.when()}))))},e.removeListeners=function(){_.forEach(e.listeners,(function(e){e()})),e.listeners=[]};var E=e.updateView;e.updateView=function(){E(),e.$broadcast("$$rebind::rebind")};var b=e.updateWalletView;e.updateWalletView=function(t){b(t),e.$broadcast("$$rebind::rebind")},e.$watch("settings.useRelative",(function(t,n){e.formData&&!e.loading&&t!==n&&(e.formData.useRelative=p.data.useRelative,e.updateView())}),!0)}function R(e,t,n,i){angular.extend(this,t("WalletListAbstractCtrl",{$scope:e})),e.motion=null,e.$on("popover.shown",(function(){e.loading&&(e.setParameters(i),e.load())})),e.updateView=function(){e.wallets&&e.wallets.length&&(n.ink({selector:".popover-wallets .list .item"}),e.$broadcast("$$rebind::rebind"))},e.select=function(t,n){t.isDefaultPrevented()||!n||e.selectPrevented||e.closePopover(n)}}function A(e,t,n,i){e.hasContent=!1,e.content=null,e.fileData="",e.isValidFile=!1,e.validatingFile=!1,e.onFileChanged=function(a){e.validatingFile=!0,e.hasContent=angular.isDefined(a)&&""!==a,e.fileData=a.fileData?a.fileData:"";var o=""!==e.fileData&&("text/csv"===e.fileData.type||"text/plain"===e.fileData.type||"application/vnd.ms-excel");if(!o)return console.error("[wallet] Import failed. Invalid file type: "+e.fileData.type),e.isValidFile=!1,void(e.validatingFile=!1);console.debug("[wallet] Parsing file to import...");var r=a.fileContent.split("\n");e.content=r.reduce((function(e,t){if(!t||!t.trim().length)return e;var a=t.split("\t",3)||void 0;if(a&&3!=a.length)return console.debug("[wallet] Import: skip invalid row: "+t),o=!1,e;var r={pubkey:a[0],uid:a[1],localName:a[2]};return n.regexp.PUBKEY.test(r.pubkey)?i.isUserPubkey(r.pubkey)?(console.debug("[wallet] Pubkey equals to main wallet. Skip this row: ",t),e):i.children.hasPubkey(r.pubkey)?(console.debug("[wallet] Pubkey already in wallet list. Skip this row",t),e):e.concat(r):(console.debug("[wallet] Invalid pubkey, found in this row: ",t),o=!1,e)}),[]),e.isValidFile=o,t((function(){e.validatingFile=!1}),250)},e.removeFile=function(){e.hasContent=!1,e.content=null,e.fileData="",e.isValidFile=!1,e.validatingFile=!1}}function S(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b){e.search={text:"",loading:!0,type:null,results:[]},e.entered=!1,e.wotSearchTextId="wotSearchText",e.enableFilter=!0,e.enableWallets=!1,e.allowMultiple=!1,e.selection=[],e.showResultLabel=!0,e.parameters={},e.enter=function(t,n){if(e.entered)e.updateLocationHref(),e.search.results&&e.search.results.length&&e.motion.show({selector:".lookupForm .list .item",ink:!0});else{var o=angular.merge({},e.parameters,n&&n.stateParams);o&&o.q?(e.search.text=o.q,i((function(){e.doSearch()}),100)):o&&o.hash?(e.search.text="#"+o.hash,i((function(){e.doSearch()}),100)):i((function(){d.data.initPhase&&!o.type?e.doGetPending(0,void 0,!0):"newcomers"==o.type||!c.initPhase&&!o.type?e.doGetNewcomers(0,void 0,!0):"pending"==o.type?e.doGetPending(0,void 0,!0):"wallets"==o.type&&e.doGetWallets(0,void 0,!0)}),100),a(e.wotSearchTextId),e.entered=!0,i(l.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 n=e.search.text.trim();n.match(/^#[\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/)?t.hash=n.substr(1):t.q=n}else"last"!=e.search.type&&(t.type=e.search.type);o.search(t).replace()},e.doSearchText=function(){e.doSearch(),e.updateLocationHref()},e.doSearch=function(){var t=e.search.text.trim();return l.screen.isSmall()&&t.length<3||!t.length?(e.search.results=void 0,e.search.type="none",e.search.total=void 0,n.when()):(e.search.loading=!0,e.search.type="text",b.search(t).then((function(n){if("text"==e.search.type&&e.search.text.trim()===t){if(!(n&&n.length||!m.regexp.PUBKEY.test(t)&&!m.regexp.PUBKEY_WITH_CHECKSUM.test(t)))return m.uri.parse(t).then((function(t){e.doDisplayResult([t])}));e.doDisplayResult(n);var i=_.countBy(n,(function(e){return e.divider?"divider":"results"}));e.search.total=i&&i.results||0}})).catch(l.onError("ERROR.WOT_LOOKUP_FAILED")))},e.doGetNewcomers=function(t,n,i){return t=t||0,(n=n||10)<10&&(n=10),e.hideActionsPopover(),e.search.loading=0===t,e.search.type="newcomers",t||i||e.updateLocationHref(),b.newcomers(t,n).then((function(i){return"newcomers"===e.search.type&&(e.doDisplayResult(i&&i.hits,t,n,i&&i.total),!0)})).catch((function(n){e.search.loading=!1,e.search.results=t>0?e.search.results:[],e.search.hasMore=!1,e.search.total=void 0,l.onError("ERROR.LOAD_NEWCOMERS_FAILED")(n)}))},e.doGetPending=function(t,n,i){t=t||0,(n=n||10)<10&&(n=10),e.hideActionsPopover(),e.search.loading=0===t,e.search.type="pending";var a=d.data.initPhase?b.all:b.pending;return t||i||e.updateLocationHref(),a(t,n).then((function(i){return"pending"==e.search.type&&(e.doDisplayResult(i&&i.hits,t,n,i&&i.total),e.search.hasMore=!d.data.initPhase&&e.search.hasMore,!0)})).catch((function(n){e.search.loading=!1,e.search.results=t>0?e.search.results:[],e.search.total=void 0,e.search.hasMore=!1,l.onError("ERROR.LOAD_PENDING_FAILED")(n)}))},e.doGetWallets=function(t,n,i){return t=t||0,(n=n||10)<10&&(n=10),e.hideActionsPopover(),e.search.loading=0===t,e.search.type="wallets",t||i||e.updateLocationHref(),E.children.all().then((function(i){if(!i||"wallets"!=e.search.type)return!1;var a=[E].concat(i).reduce((function(e,t,n){var i={id:n,pubkey:t.data.pubkey,uid:t.data.uid,name:t.data.localName||t.data.name,avatar:t.data.avatar};return e.concat(i)}),[]);return e.doDisplayResult(a,t,n,a.length),e.search.hasMore=!1,!0}))},e.showMore=function(){var t=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,("newcomers"==e.search.type?e.doGetNewcomers:e.doGetPending)(t).then((function(t){t&&(e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete"))})).catch((function(t){console.error(t),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.select=function(e){var n=e.state;!n&&e.pubkey&&(n=E.isUserPubkey(e.pubkey)?"app.view_wallet":"app.wot_identity"),n&&(s.nextViewOptions({historyRoot:!1,disableAnimate:!1,expire:300}),t.go(n,e.stateParams||e))},e.next=function(){console.warn("Selected identities (should be override):",e.selection)},e.toggleCheck=function(t,n){var i=e.search.results[t];i.checked?e.addToSelection(i):e.removeSelection(i,n)},e.toggleSelect=function(e){e.selected=!e.selected},e.addToSelection=function(t){var n=angular.copy(t);n.name&&(n.name=n.name.replace("<em>","").replace("</em>","")),e.selection.push(n)},e.removeSelection=function(t,n){var i=_.findWhere(e.selection,{id:t.id});if(i&&e.selection.splice(e.selection.indexOf(i),1),!e.search.loading){var a=_.findWhere(e.search.results,{id:t.id});a&&a.checked&&(a.checked=!1)}},e.scanQrCode=function(){p.barcode.enable&&p.barcode.scan().then((function(t){t&&m.uri.parse(t).then((function(n){n.pubkey?e.search.text=n.pubkey:t.uid?e.search.text=n.uid:e.search.text=t,e.doSearch()}))})).catch(l.onError("ERROR.SCAN_FAILED"))},e.showHelpTip=function(t){if(e.isLogin()&&!((t=angular.isDefined(t)?t:u.data.helptip.wotLookup)<0)){0===t&&(t=1);var n=e.createHelptipScope();if(n)return n.startWotLookupTour(t,!1).then((function(e){n.$destroy(),u.data.helptip.wotLookup=e,u.store()}))}},e.doDisplayResult=function(t,n,i,a){t=t||[],e.allowMultiple&&t.length&&e.selection.length&&_.forEach(e.selection,(function(e){var n=_.findWhere(t,{id:e.id});n&&(n.checked=!0)})),e.search.results=n?e.search.results.concat(t):t||[],e.search.total=angular.isDefined(a)?a:void 0,e.search.loading=!1,e.search.hasMore=e.search.results.length>=n+i,e.smallscreen=l.screen.isSmall(),e.search.results.length&&t.length>0&&e.motion&&e.motion.show({selector:".lookupForm .list .item",ink:!0})},e.showActionsPopover=function(t){l.popover.show(t,{templateUrl:"templates/wot/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function C(e,t,n,i,a){angular.extend(this,t("WotLookupCtrl",{$scope:e})),a=a||{},e.search.loading=!1,e.enableFilter=!!angular.isDefined(a.enableFilter)&&a.enableFilter,e.enableWallets=!!angular.isDefined(a.enableWallets)&&i.isLogin()&&i.children.count()&&a.enableWallets,e.allowMultiple=!!angular.isDefined(a.allowMultiple)&&a.allowMultiple,e.parameters=a,e.showResultLabel=!1,e.wotSearchTextId="wotSearchTextModal",e.allowMultiple&&a.selection&&(e.selection=a.selection);var o=e.enter;e.enter=function(t){e.parameters&&e.parameters.q&&(e.search.text=e.parameters.q,e.parameters.q.trim().length>2&&o(t))},e.$on("modal.shown",e.enter),e.cancel=function(){e.closeModal()},e.select=function(t){e.closeModal({pubkey:t.pubkey,uid:t.uid,name:t.name&&t.name.replace(/<\/?em>/gi,"")})},e.next=function(){e.closeModal(e.selection)},e.updateLocationHref=function(){},e.showHelpTip=function(){},n(e.wotSearchTextId)}function D(e,t,n,i,a,o,r,s,l,c,d,u,p){e.formData={hasSelf:!0},e.disableCertifyButton=!0,e.loading=!0,e.$on("$ionicView.beforeEnter",(function(e,t){t.enableBack=!!r.screen.isSmall()||t.enableBack})),e.load=function(t,n,i){return u.load(t,n,i).then((function(n){if(!n)return r.onError("ERROR.IDENTITY_NOT_FOUND")().then(e.showHome);e.formData=n;var i=p.isLogin();e.revoked=n.requirements&&(n.requirements.revoked||n.requirements.pendingRevocation),e.canCertify=n.hasSelf&&!e.revoked&&(!i||!p.isUserPubkey(t)||p.children.count()>0),e.canSelectAndCertify=n.hasSelf&&(p.isUserPubkey(t)||p.children.hasPubkey(t));var a=i&&_.find((n.received_cert||[]).concat(n.received_cert_pending||[]),(function(e){return e.pubkey===p.data.pubkey&&e.valid&&e.expiresIn>c.data.timeWarningExpire}));e.alreadyCertified=!(!e.canCertify||!i||p.children.count()>0||!a),e.disableCertifyButton=e.alreadyCertified||e.revoked,e.loading=!1})).catch((function(t){e.loading=!1,r.onError("ERROR.LOAD_IDENTITY_FAILED")(t)}))},e.doUpdate=function(t){t||(e.loading=!0,r.loading.show());var n={cache:!1,blockUid:e.formData.blockUid||void 0};return e.load(e.formData.pubkey,e.formData.uid,n).then(r.loading.hide)},e.certify=function(){return(p.children.count()?s.showSelectWallet({displayBalance:!1}):o.when(p)).then((function(t){if(t)return t.auth({minData:!0}).then((function(n){if(r.loading.hide(),d.data.initPhase||n.isMember)if(d.data.initPhase||e.formData.hasSelf)if(e.formData.requirements.expired)r.alert.error("ERROR.IDENTITY_EXPIRED");else{var a=_.find(e.formData.received_cert,(function(e){return e.pubkey===t.data.pubkey&&e.valid&&e.expiresIn>c.data.timeWarningExpire}));a?i("ERROR.IDENTITY_ALREADY_CERTIFY",a).then((function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")})):(a=_.findWhere(e.formData.received_cert_pending,{pubkey:t.data.pubkey,valid:!0}))?i("ERROR.IDENTITY_ALREADY_CERTIFY_PENDING",a).then((function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")})):r.alert.confirm("CONFIRM.CERTIFY_RULES","CONFIRM.POPUP_SECURITY_WARNING_TITLE",{cssClass:"warning",okText:"WOT.BTN_YES_CERTIFY",okType:"button-assertive"}).then((function(n){n&&(r.loading.show(),t.certify(e.formData.uid,e.formData.pubkey,e.formData.blockUid||e.formData.requirements&&e.formData.requirements.meta&&e.formData.requirements.meta.timestamp,e.formData.requirements&&e.formData.requirements.meta&&e.formData.requirements.meta.sig,e.formData.isMember,e.formData.wasMember).then((function(n){r.loading.hide(),n&&(e.prepareNewCert(t,n),e.alreadyCertified=!0,r.toast.show("INFO.CERTIFICATION_DONE"),e.formData.received_cert_pending.unshift(n),e.formData.requirements.pendingCertificationCount++,e.doMotion())})).catch(r.onError("ERROR.SEND_CERTIFICATION_FAILED")))}))}else r.alert.error("ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF");else r.alert.error(n.requirements.needSelf?"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY":"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF")})).catch((function(e){"CANCELLED"!==e&&r.onError("ERROR.LOGIN_FAILED")(e)}))}))},e.selectAndCertify=function(){return(p.children.count()?s.showSelectWallet({displayBalance:!1}):o.when(p)).then((function(t){return t.auth({minData:!0}).then((function(e){if(d.data.initPhase||e.isMember)return r.loading.hide(),s.showWotLookup();r.alert.error(e.requirements.needSelf||e.requirements.needMembership?"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY":"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF")})).then((function(e){if(e&&e.pubkey){if(e.uid){r.loading.show();var t={cache:!1,blockUid:e.blockUid};return u.load(e.pubkey,e.uid,t)}r.alert.error("ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF")}})).then((function(n){if(n)if(r.loading.hide(),n&&n.hasSelf)if(n.requirements.expired)r.alert.error("ERROR.IDENTITY_EXPIRED");else{var a=_.findWhere(n.received_cert,{pubkey:t.data.pubkey,valid:!0});a?i("ERROR.IDENTITY_ALREADY_CERTIFY",a).then((function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")})):(a=_.findWhere(n.received_cert_pending,{pubkey:t.data.pubkey,valid:!0}))?i("ERROR.IDENTITY_ALREADY_CERTIFY_PENDING",a).then((function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")})):i("CONFIRM.CERTIFY_RULES_TITLE_UID",{uid:n.uid}).then((function(e){return r.alert.confirm("CONFIRM.CERTIFY_RULES",e)})).then((function(i){i&&(r.loading.show(),t.certify(n.uid,n.pubkey,n.blockUid||n.requirements&&n.requirements.meta&&n.requirements.meta.timestamp,n.requirements&&n.requirements.meta&&n.requirements.meta.sig,n.isMember,n.wasMember).then((function(t){if(r.loading.hide(),t)return u.extendAll([t],"pubkey").then((function(){r.toast.show("INFO.CERTIFICATION_DONE"),e.formData.given_cert_pending.unshift(t),e.doMotion()}))})).catch(r.onError("ERROR.SEND_CERTIFICATION_FAILED")))}))}else r.alert.error("ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF")})).catch((function(e){"CANCELLED"!==e&&r.onError("ERROR.LOAD_IDENTITY_FAILED")(e)}))}))},e.prepareNewCert=function(e,t){t.uid=e.data.uid,t.pubkey=e.data.pubkey,t.isMember=e.data.isMember,t.avatar=e.data.avatar,t.name=e.data.name},e.removeActionParamInLocationHref=function(e){if(e&&e.stateParams&&e.stateParams.action){var t=angular.copy(e.stateParams);t.action=null,a.nextViewOptions({disableAnimate:!0,disableBack:!1,historyRoot:!1}),n.go(e.stateName,t,{reload:!1,inherit:!0,notify:!1})}},e.doAction=function(t,n){if("certify"==t)return e.certify();"transfer"==t&&e.showTransferModal(n)},e.showCertifications=function(){var t=e.formData.requirements&&e.formData.requirements.alternatives&&e.formData.blockUid||void 0;r.screen.isSmall()?n.go("app.wot_cert",{pubkey:e.formData.pubkey,uid:e.formData.uid,type:"received",block:t}):n.go("app.wot_cert_lg",{pubkey:e.formData.pubkey,uid:e.formData.uid,block:t})},e.showGivenCertifications=function(){var t=e.formData.requirements&&e.formData.requirements.alternatives&&e.formData.blockUid||void 0;r.screen.isSmall()?n.go("app.wot_cert",{pubkey:e.formData.pubkey,uid:e.formData.uid,type:"given",block:t}):n.go("app.wot_cert_lg",{pubkey:e.formData.pubkey,uid:e.formData.uid,block:t})},e.showSharePopover=function(i){var a=e.formData.name||e.formData.uid||e.formData.pubkey,o=(l.shareBaseUrl||t.rootPath)+n.href("app.wot_identity",{pubkey:e.formData.pubkey,uid:e.formData.uid});r.screen.isSmall()&&(i=angular.element(document.querySelector("#wot-share-anchor-"+e.formData.pubkey))||i),r.popover.share(i,{bindings:{url:o,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:a},postMessage:a}})}}function y(e,t,n,i,a,o,r,s){angular.extend(this,n("WotIdentityAbstractCtrl",{$scope:e})),e.motion=o.motion.fadeSlideInRight,e.qrcodeId="qrcode-wot-"+e.$id,e.options=e.options||{},e.options.like={kinds:["LIKE","ABUSE"],index:"user",type:"profile"},e.likeData={likes:{},abuses:{}},e.$on("$ionicView.enter",(function(t,n){var a=function(){e.doMotion(),n.stateParams&&n.stateParams.action&&(i((function(){e.doAction(n.stateParams.action.trim())}),100),e.removeActionParamInLocationHref(n),e.likeData.id=e.formData.pubkey),e.showQRCode()},r={cache:!0,blockUid:n.stateParams&&n.stateParams.block||void 0};if(n.stateParams&&n.stateParams.pubkey&&n.stateParams.pubkey.trim().length>0){if(e.loading)return e.load(n.stateParams.pubkey.trim(),n.stateParams.uid,r).then(a).catch(o.onError("ERROR.LOAD_IDENTITY_FAILED"))}else if(n.stateParams&&n.stateParams.uid&&n.stateParams.uid.trim().length>0){if(e.loading)return e.load(null,n.stateParams.uid,r).then(a)}else e.showHome()})),e.doMotion=function(){e.motion.show({selector:".view-identity .list .item"}),e.showFab("fab-transfer"),(e.canCertify&&!e.alreadyCertified||t.tour)&&e.showFab("fab-certify-"+e.formData.uid),e.$broadcast("$csExtension.motion")},e.doQuickFix=function(t){if("showSelectIdentities"===t)return e.showSelectIdentities()},e.showSelectIdentities=function(){if(e.formData.requirements&&e.formData.requirements.alternatives)return r.showSelectPubkeyIdentity({identities:[e.formData.requirements].concat(e.formData.requirements.alternatives)}).then((function(e){if(e&&e.pubkey)return a.go("app.wot_identity",{pubkey:e.pubkey,uid:e.uid,block:e.meta&&e.meta.timestamp||e.blockUid})}))},e.showQRCode=function(t){if(e.qrcodeId&&e.formData.pubkey){var n=angular.element(document.querySelector("#"+e.qrcodeId+" .content"));n?(console.debug("[wot-controller] Generating QR code for identity..."),i((function(){var i=o.qrcode.svg(e.formData.pubkey);n.html(i),o.motion.toggleOn({selector:"#"+e.qrcodeId},t||1100)}))):console.error("[wot-controller] Cannot found div #{0} for the QRCode. Skipping.".format(e.qrcodeId))}},e.hideQRCode=function(){e.qrcodeId&&angular.element(document.querySelector("#"+e.qrcodeId))&&o.motion.toggleOff({selector:"#"+e.qrcodeId})}}function P(e,t,n,i,a,o,r,s){e.formData={},e.loading=!0,e.motion=s.motion.fadeSlideInRight,e.$on("$ionicView.enter",(function(t,n){e.loading?(e.pubkey=n.stateParams.pubkey,e.uid=n.stateParams.uid,e.load()):e.updateView()})),e.load=function(t){return n.all([o.extend({pubkey:e.pubkey}),r.load(e.pubkey,t)]).then((function(t){e.formData=angular.merge(t[0],t[1]),e.loading=!1,e.updateView()}))},e.doUpdate=function(t){return console.debug("[wot] TX history reloading..."),e.formData={},(t?e.load():s.loading.show().then(e.load).then(s.loading.hide)).then(e.updateView).catch(s.onError("ERROR.IDENTITY_TX_FAILED"))},e.updateView=function(){e.$broadcast("$$rebind::balance"),e.$broadcast("$$rebind::rebind"),e.motion.show()},e.downloadHistoryFile=function(t){(t=t||{}).fromTime=t.fromTime||-1,r.downloadHistoryFile(e.pubkey,t)},e.showMoreTx=function(n){return n=n||e.formData.tx.fromTime-a.data.walletHistoryTimeSecond||moment().utc().unix()-2*a.data.walletHistoryTimeSecond,s.loading.show(),r.load(e.pubkey,n).then((function(t){angular.merge(e.formData,t),e.updateView(),s.loading.hide()})).catch((function(a){a.ucode==i.errorCodes.HTTP_LIMITATION?t((function(){return e.showMoreTx(n)}),2e3):s.onError("ERROR.IDENTITY_TX_FAILED")(a)}))}}function k(e,t,n,i,a,o){var r;angular.extend(this,n("WotIdentityAbstractCtrl",{$scope:e})),e.motions={receivedCertifications:angular.copy(o.motion.fadeSlideIn),givenCertifications:angular.copy(o.motion.fadeSlideInRight),avatar:angular.copy(o.motion.fadeIn)},e.motions.receivedCertifications.enable=!0,e.motions.givenCertifications.enable=!0,e.motions.avatar.enable=!0,e.$on("$ionicView.enter",(function(t,n){if(n.stateParams&&n.stateParams.type&&(e.motions.receivedCertifications.enable="given"!=n.stateParams.type,e.motions.givenCertifications.enable="given"==n.stateParams.type,e.motions.avatar.enable=!1),e.loading){var i={cache:!0,blockUid:n.stateParams&&n.stateParams.block||void 0};return n.stateParams&&n.stateParams.pubkey&&n.stateParams.pubkey.trim().length>0?e.load(n.stateParams.pubkey.trim(),n.stateParams.uid,i).then((function(){e.doMotion(),e.showHelpTip()})):(r=n.stateParams&&n.stateParams.id?a.children.get(n.stateParams.id):a)?r.isLogin()?e.load(r.data.pubkey,r.data.uid,i).then((function(){e.doMotion(),e.showHelpTip()})):e.showHome():(o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome())}e.doMotion()})),e.$on("$ionicView.leave",(function(){e.loading=!0})),e.doUpdate=function(){var t={cache:!1,blockUid:e.formData.blockUid||void 0};return e.load(e.formData.pubkey,e.formData.uid,t).then((function(){e.doMotion(),e.showHelpTip()}))},e.doMotion=function(t){e.doMotionReceivedCertifications(0,t),e.motions.avatar.enable&&e.motions.avatar.show({selector:".col-avatar ."+e.motions.avatar.ionListClass}),e.doMotionGivenCertifications(e.motions.receivedCertifications.enable?100:10,t)},e.doMotionReceivedCertifications=function(n,i){e.motions.receivedCertifications.enable?(i||e.motions.receivedCertifications.show({selector:".list.certifications .item",timeout:n}),(e.canCertify&&!e.alreadyCertified||t.tour)&&e.showFab("fab-certify",n)):(e.canCertify||t.tour)&&e.hideFab("fab-certify",0)},e.doMotionGivenCertifications=function(n,i){e.motions.givenCertifications.enable?(i||e.motions.givenCertifications.show({selector:".list.given-certifications .item",timeout:n}),(e.canSelectAndCertify||t.tour)&&e.showFab("fab-select-certify")):(e.canSelectAndCertify||t.tour)&&e.hideFab("fab-select-certify",0)},e.showHelpTip=function(){if(e.isLogin()&&i.data.helptip.enable){var t=e.createHelptipScope();if(t){var n=a.isUserPubkey(e.formData.pubkey),o=n?i.data.helptip.walletCerts:i.data.helptip.wotCerts;if(!(o<0))return(n?t.startWalletCertTour(o,!1):t.startWotCertTour(o,!1)).then((function(e){t.$destroy(),n?i.data.helptip.walletCerts=e:i.data.helptip.wotCerts=e,i.store()}))}}}}function M(e,t,n,i){e.loading=!0,e.load=function(){return i&&i.identities?(e.identities=i.identities,e.pubkey=e.identities[0].pubkey,e.loading=!1,t.when()):(e.pubkey=i&&i.pubkey,pubkey?n.loadRequirements({pubkey:pubkey,uid:uid}).then((function(t){t&&t.requirements&&(e.identities=t.requirements,t.requirements.alternatives?e.identities=[t.requirements].concat(t.requirements.alternatives):e.identities=[t.requirements]),e.loading=!1})):t.reject("Missing parameters: [pubkey] or [identities]"))},e.$on("modal.shown",e.load)}function w(e,t,n,i,a,o,r,s,l,c,d,u,p){e.networkStarted=!1,e.ionItemClass="",e.expertMode=c.data.expertMode&&!s.screen.isSmall(),e.isHttps="https:"===a.location.protocol,e.search={text:"",loading:!0,type:void 0,results:[],endpoint:null,bma:void 0,ssl:void 0,ws2p:void 0,sort:void 0,asc:!0},e.compactMode=!0,e.listeners=[],e.helptipPrefix="helptip-network",e.enableLocationHref=!0,e.removeListeners=function(){e.listeners.length&&(console.debug("[network] Closing listeners"),_.forEach(e.listeners,(function(e){e()})),e.listeners=[])},e.enter=function(t,n){e.networkStarted||(e.networkStarted=!0,e.search.loading=!0,d.get().then((function(t){if(t){var i=r.node.same(t.node);e.node=i?r:r.instance(t.node.host,t.node.port),n&&n.stateParams&&(n.stateParams.type&&-1!=["mirror","member","offline"].indexOf(n.stateParams.type)&&(e.search.type=n.stateParams.type),n.stateParams.expert&&(e.expertMode="true"==n.stateParams.expert)),e.load()}})).catch((function(t){s.onError("ERROR.GET_CURRENCY_FAILED")(t),e.networkStarted=!1})))},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.node!==r&&e.node.close(),e.networkStarted&&(e.removeListeners(),u.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,endpoint:angular.isDefined(e.search.endpoint)?e.search.endpoint:null,bma:e.search.bma,ssl:e.search.ssl,ws2p:e.search.ws2p,online:!(e.search.type&&"offline"===e.search.type)},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&&(u.start(e.node,e.computeOptions()),e.refreshing=!1,e.listeners.push(u.api.data.on.changed(e,(function(t){e.refreshing||(e.refreshing=!0,p.extendAll(t.peers).then((function(){e.networkStarted&&e.updateView(t),e.refreshing=!1})))})))),e.showHelpTip()},e.updateView=function(t){console.debug("[peers] Updating UI"),e.$broadcast("$$rebind::rebind"),e.search.results=t.peers,e.search.memberPeersCount=t.memberPeersCount,e.search.loading=!e.networkStarted||u.isBusy(),e.loading||e.$broadcast("$$rebind::rebind"),e.motion&&e.search.results&&e.search.results.length>0&&e.motion.show({selector:".item-peer"})},e.refresh=function(){e.search.loading=!0,u.loadPeers()},e.sort=function(){e.search.loading=!0,e.refreshing=!0,u.sort(e.computeOptions()),e.updateView(u.data)},e.toggleSearchType=function(t){e.hideActionsPopover(),e.search.type===t||"none"===t?e.search.type=void 0:e.search.type=t,u.close(),e.search.loading=!0,e.load(),e.enableLocationHref&&n.search({type:e.search.type}).replace()},e.toggleSearchEndpoint=function(t){e.hideActionsPopover(),e.search.endpoint===t||null===t?e.search.endpoint=null:e.search.endpoint=t,e.sort()},e.toggleSort=function(t){e.search.sort!==t||e.search.asc?(e.search.asc=e.search.sort!==t||!e.search.asc,e.search.sort=t):(e.search.asc=void 0,e.search.sort=void 0),e.sort()},e.toggleCompactMode=function(){e.compactMode=!e.compactMode,e.$broadcast("$$rebind::rebind")},e.selectPeer=function(n){if(n.compacted&&e.compactMode)e.toggleCompactMode();else if(n.online&&n.hasBma()){var i={server:n.getServer()};n.isSsl()&&(i.ssl=!0),n.isTor()&&(i.tor=!0),t.go("app.view_peer",i)}},e.$on("csView.action.refresh",(function(t,n){"peers"===n&&e.refresh()})),e.$on("csView.action.showActionsPopover",(function(t,n){e.showActionsPopover(n)})),e.showActionsPopover=function(t){s.popover.show(t,{templateUrl:"templates/network/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showEndpointsPopover=function(e,t,n){e.preventDefault(),e.stopPropagation();var i=t.getEndpoints(n);(i=(i||[]).reduce((function(e,i){var a=r.node.parseEndPoint(i)||r.node.parseEndPoint(i,n);return e.concat({label:"NETWORK.VIEW.NODE_ADDRESS",value:t.getServer(a)+(a&&a.path||"")})}),[])).length&&s.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS."+n,items:i}})},e.showWs2pPopover=function(e,t){return e.stopPropagation(),o("NETWORK.VIEW.PRIVATE_ACCESS").then((function(n){s.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:t.bma.private?n:t.getServer()+(t.bma.path||"")},{label:"NETWORK.VIEW.WS2PID",value:t.bma.ws2pid},{label:"NETWORK.VIEW.POW_PREFIX",value:t.powPrefix}]}})}))},e.showHelpTip=function(t,n){if(t=angular.isDefined(t)?t:c.data.helptip.network,n=!!angular.isDefined(n)&&n,!(t<0)){var i=e.createHelptipScope();if(i)return i.tour=n,i.startNetworkTour(t,!1).then((function(e){i.$destroy(),n||(c.data.helptip.network=e,c.store())}))}}}function U(e,t,n){angular.extend(this,t("NetworkLookupCtrl",{$scope:e})),n=n||{},e.enableFilter=!angular.isDefined(n.enableFilter)||n.enableFilter,e.search.type=angular.isDefined(n.type)?n.type:e.search.type,e.search.endpoint=angular.isDefined(n.endpoint)?n.endpoint:e.search.endpoint,e.search.bma=angular.isDefined(n.bma)?n.bma:e.search.bma,e.search.ssl=angular.isDefined(n.ssl)?n.ssl:e.search.ssl,e.search.ws2p=angular.isDefined(n.ws2p)?n.ws2p:e.search.ws2p,e.expertMode=angular.isDefined(n.expertMode)?n.expertMode:e.expertMode,e.ionItemClass=n.ionItemClass||"item-border-large",e.enableLocationHref=!1,e.helptipPrefix="",e.selectPeer=function(t){e.closeModal(t)},e.$on("modal.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function x(e,t){angular.extend(this,t("NetworkLookupCtrl",{$scope:e}));var n=n||{};e.enableFilter=!angular.isDefined(n.enableFilter)||n.enableFilter,e.search.type=angular.isDefined(n.type)?n.type:e.search.type,e.search.endpoint=angular.isDefined(n.endpoint)?n.endpoint:e.search.endpoint,e.expertMode=angular.isDefined(n.expertMode)?n.expertMode:e.expertMode,e.ionItemClass=n.ionItemClass||"item-border-large",e.helptipPrefix="",e.selectPeer=function(t){e.closePopover(t)},e.$on("popover.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function B(e,t,n,i,a,o){e.loading=!0,e.formData={},e.load=function(){return console.debug("[peer-popover] Loading peer info..."),e.loading=!0,e.formData={},t.all([i.blockchain.current().then((function(t){e.formData.number=t.number,e.formData.medianTime=t.medianTime,e.formData.powMin=t.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(t){e.formData.version=t&&t.duniter&&t.duniter.version,e.formData.software=t&&t.duniter&&t.duniter.software})).catch((function(){delete e.formData.version,delete e.formData.software})),o.version.latest().then((function(t){e.formData.latestRelease=t})).catch((function(){delete e.formData.latestRelease}))]).then((function(){if(e.formData.latestRelease&&"duniter"==e.formData.software){var t=a.version.compare(e.formData.version,e.formData.latestRelease.version);e.formData.isPreRelease=t>0,e.formData.hasNewRelease=t<0}else e.formData.isPreRelease=!1,e.formData.hasNewRelease=!1;e.loading=!1,e.$broadcast("$$rebind::rebind")}))},i.api.data.on.newBlock(e,(function(t){e.loading||(console.debug("[peer info] Received new block. Reload content"),e.load())})),n.api.data.on.changed(e,(function(t){e.loading||(console.debug("[peer info] Peer settings changed. Reload content"),e.load())})),e.load()}function H(t,n,i,a,o,r,s){t.node={},t.loading=!0,t.isHttps="https:"===i.location.protocol,t.isReachable=!0,t.$on("$ionicView.beforeEnter",(function(e,t){t.enableBack=!!o.screen.isSmall()||t.enableBack})),t.$on("$ionicView.enter",(function(e,n){var i=!n.stateParams||!n.stateParams.server,a=n.stateParams&&n.stateParams.server||s.server,o=n.stateParams&&"true"==n.stateParams.ssl||!!i&&s.useSsl,r="true"==n.stateParams.tor||!!i&&s.useTor;return t.load(a,o,r).then((function(){return t.$broadcast("$csExtension.enter",e,n)})).then((function(){t.loading=!1})).catch((function(){t.loading=!1}))})),t.load=function(i,a,l){var c={server:i,host:i,useSsl:a,useTor:l},d=i.split(":");return 2===d.length&&(c.host=d[0],c.port=d[1]),angular.merge(t.node,l?s.lightInstance(c.host+".to",443,!0,6e4):s.lightInstance(c.host,c.port,c.useSsl),c),t.isReachable=!t.isHttps||a,t.isReachable?n.all([t.node.network.peering.self().then((function(e){t.node.pubkey=e.pubkey,t.node.currency=e.currency})).catch((function(e){console.error(e&&e.message||e)})),t.node.network.peers().then((function(n){var i=(n&&n.peers||[]).map((function(t){var n=new e(t);return n.online="UP"===t.status,n.buid=n.block,n.blockNumber=n.buid&&n.buid.split("-")[0],n.dns=n.getDns(),n.id=n.keyID(),n.server=n.getServer(),n}));return r.extendAll([t.node].concat(i)).then((function(){t.peers=_.sortBy(i,(function(e){var t=1;return t+=1e4*(e.online?1:0),t+=1e3*(e.hasMainConsensusBlock?1:0),-(t+=100*(e.uid?1:0))})),t.motion.show({selector:".item-peer"})}))})),t.node.blockchain.current().then((function(e){t.current=e}))]).catch((function(e){throw console.error(e&&e.message||e),o.onError(l?"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR":"PEER.VIEW.ERROR.LOADING_NODE_ERROR")(e),e})):s.network.peers().then((function(n){var i=(n&&n.peers||[]).reduce((function(t,n){var i=new e(n);return(i.getEndpoints("BASIC_MERKLED_API")||[]).reduce((function(e,t){var n=s.node.parseEndPoint(t);return n.dns!==c.host&&n.ipv4!==c.host&&n.ipv6!==c.host||n.port!=c.port?e:(i.bma=n,e.concat(i))}),t)}),[]),a=i.length&&i[0];if(a)return t.node.pubkey=a.pubkey,t.node.currency=a.currency,r.extend(t.node);console.warn("Could not get peer from /network/peers")}))},t.selectPeer=function(e){if(e.online&&!e.isWs2p()){var t={server:e.getServer()};e.isSsl()&&(t.ssl=!0),e.isTor()&&(t.tor=!0),a.go("app.view_peer",t)}},t.openRawPeering=function(e){return t.openLink(e,t.node.url+"/network/peering")},t.openRawCurrentBlock=function(e){return t.openLink(e,t.node.url+"/blockchain/current")}}function F(e,t,n,i,a,o,r,s,l,c,d){e.formData={useRelative:!1,currency:"",M:0,MoverN:0,UD:0,cactual:0,c:0,dt:0,sigQty:0,sigStock:0,msWindow:0,msValidity:0,sigWindow:0,sigValidity:0,sigPeriod:0,medianTime:0,difficulty:0,Nprev:0,stepMax:0,sentries:0,xpercent:0,durationFromLastUD:0,blockUid:null,dtReeval:0,udReevalTime0:0,allRules:angular.isDefined(s.data.currency&&s.data.currency.allRules)?s.data.currency.allRules:s.data.expertMode,allWotRules:angular.isDefined(s.data.currency&&s.data.currency.allWotRules)?s.data.currency.allWotRules:s.data.expertMode,licenseUrl:s.getLicenseUrl()},e.loading=!0,e.screen=r.screen,e.enter=function(t,i){e.loading&&(e.formData.useRelative=s.data.useRelative,l.get().then(e.load).then((function(){e.isLogin()&&e.showHelpTip()})).catch(r.onError("ERROR.GET_CURRENCY_FAILED")),c.api.data.on.mainBlockChanged(e,(function(t){e.loading||e.formData.blockUid!==t.buid&&(console.debug("[currency] Updating parameters UI (new main block detected)"),n(e.load,1e3))}))),e.$broadcast("$csExtension.enter",i)},e.$on("$ionicView.enter",e.enter),e.load=function(){var n,i,a={},s=Date.now();return t.all([o.blockchain.parameters().then((function(e){a.currency=e.currency,a.c=e.c,a.dt=e.dt,a.sigQty=e.sigQty,a.sigStock=e.sigStock,a.msWindow=e.msWindow,a.msValidity=e.msValidity,a.sigWindow=e.sigWindow,a.sigValidity=e.sigValidity,a.sigPeriod=e.sigPeriod,a.stepMax=e.stepMax,a.xpercent=e.xpercent,a.avgGenTime=e.avgGenTime,a.dtReeval=e.dtReeval,a.udTime0=e.udTime0,a.udReevalTime0=e.udReevalTime0,a.dtReeval||(a.dtReeval=a.dt)})),l.blockchain.current().then((function(e){n=e.monetaryMass,a.N=e.membersCount,a.medianTime=e.medianTime,a.difficulty=e.powMin,a.blockUid=[e.number,e.hash].join("-")})).catch((function(e){if(e&&e.ucode==o.errorCodes.NO_CURRENT_BLOCK)return n=0,a.N=0,a.medianTime=moment().utc().unix(),a.difficulty=0,void(a.blockUid=null);throw e})),o.blockchain.stats.ud().then((function(e){if(e.result.blocks.length){var t=e.result.blocks[e.result.blocks.length-1];return o.blockchain.block({block:t}).then((function(e){a.currentUD=e.unitbase>0?e.dividend*Math.pow(10,e.unitbase):e.dividend,i=e.medianTime,a.Nprev=e.membersCount}))}return i=0,a.Nprev=0,o.blockchain.parameters().then((function(e){a.currentUD=e.ud0}))}))]).then((function(){var t=n-a.currentUD*a.Nprev,o=a.Nprev?t/a.Nprev:0;return a.cactual=o?100*a.currentUD/o:0,a.M=n,a.MoverN=a.Nprev?(t||n)/a.Nprev:0,a.UD=a.currentUD,a.durationFromLastUD=i?a.medianTime-i:0,a.sentries=Math.ceil(Math.pow(a.N,1/a.stepMax)),angular.extend(e.formData,a),console.debug("[currency] Parameters loaded in "+(Date.now()-s)+"ms"),e.loading=!1,e.$broadcast("$$rebind::rebind"),r.ink(),r.loading.hide()})).catch((function(t){e.loading=!1,r.onError("ERROR.LOAD_PEER_DATA_FAILED")(t)}))},e.refresh=function(){if(!e.loading)return e.loading=!0,r.loading.show(),e.load().then((function(){e.$broadcast("csView.action.refresh","currency")}))},e.refreshPeers=function(){return e.$broadcast("csView.action.refresh","peers"),t.when()},e.showExtendActionsPopover=function(t){e.$broadcast("csView.action.showActionsPopover",t)},e.onAllRulesChange=function(){s.data.currency=s.data.currency||{},s.data.currency.allRules!==e.formData.allRules&&(s.data.currency.allRules=e.formData.allRules,s.store())},e.$watch("formData.allRules",e.onAllRulesChange),e.onAllWotRulesChange=function(){s.data.currency=s.data.currency||{},s.data.currency.allWotRules!==e.formData.allWotRules&&(s.data.currency.allWotRules=e.formData.allWotRules,s.store())},e.$watch("formData.allWotRules",e.onAllWotRulesChange),e.startCurrencyTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(t,n){if(t=angular.isDefined(t)?t:s.data.helptip.currency,n=!!angular.isDefined(n)&&n,!(t<0)){var i=e.createHelptipScope(n);if(i)return i.tour=n,i.startCurrencyTour(t,!1).then((function(e){i.$destroy(),s.data.helptip.currency=e,s.store()}))}},e.showLicenseModal=function(){return d.show("templates/currency/modal_license.html","CurrencyLicenseModalCtrl")},e.showHelpModal=function(e){a.showHelp({anchor:e})},e.showActionsPopover=function(t){r.popover.show(t,{templateUrl:"templates/currency/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function W(e,t,n,i,a){e.loading=!0,e.load=function(){e.loading&&(e.licenseUrl=i.getLicenseUrl(),e.licenseUrl&&".txt"!=e.licenseUrl.substring(e.licenseUrl.length-3)&&(e.licenseUrlHtml=e.licenseUrl+".html",e.licenseUrl=e.licenseUrl+".txt"),e.loading=!1)},e.$on("modal.shown",e.load),e.downloadFile=function(){if(e.licenseUrl)return t.get(e.licenseUrl).success((function(e){var t=new Blob([e],{type:"text/plain; charset=utf-8"});a.saveAs(t,"license.txt")})).error((function(){n.onError("ERROR.GET_LICENSE_FILE_FAILED")()}))}}function V(e,t,n){angular.extend(this,t("TransferModalCtrl",{$scope:e,parameters:{}})),e.enter=function(t,i){return i&&i.stateParams&&e.setParameters(i.stateParams),e.load().then(n.loading.hide)},e.$on("$ionicView.enter",e.enter),e.setForm=function(t){e.form=t},e.closeModal=function(){return e.showHome()}}function G(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){var b;e.convertedBalance=0,e.formData={destPub:null,amount:null,comment:null,useRelative:m.data.useRelative,useComment:!1,all:!1,restPub:null,restAmount:null,walletId:null},e.udAmount=null,e.minAmount=.01,e.commentPattern=s.regexp.COMMENT,e.currency=p.data.name,e.loading=!0,e.commentInputId="transferComment-"+e.$id,e.enableSelectWallet=!0,e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:l.screen.isSmall(),(e.smallscreen||r.enable)&&(e.digitKeyboardSettings=e.digitKeyboardSettings||r.keyboard.digit.settings.bindModel(e,"formData.amount",{decimal:!0,decimalSeparator:".",resizeContent:!1}),e.digitKeyboardVisible=!1),e.setParameters=function(t){t&&(t.pubkey&&(e.formData.destPub=t.pubkey),t.uid?(e.destUid=t.uid,e.destPub=""):(e.destUid="",e.destPub=t.pubkey),t.amount?(e.formData.amount=t.amount,e.formData.useRelative=!1):t.udAmount&&(e.formData.amount=t.udAmount,e.formData.useRelative=!0),t.comment&&(e.formData.useComment=!0,e.formData.comment=t.comment),t.restPub||t.all?(e.restUid="",e.restPub=t.restPub,e.formData.restPub=t.restPub,e.formData.all=!0):e.formData.all=!1,t.wallet&&"default"!==t.wallet?e.formData.walletId=t.wallet:e.formData.walletId=d.id)},e.setParameters(E),e.load=function(){return e.enableSelectWallet=d.children.count()>0,(b=e.enableSelectWallet&&(e.formData.walletId?d.children.get(e.formData.walletId):d)||d).isDefault()||console.debug("[transfer] Using wallet {"+b.id+"}"),b.login({sources:!0,silent:!0}).then((function(t){if(b&&!e.$$destroyed){if(e.walletData=t,e.formData.walletId=b.id,e.onUseRelativeChanged(),e.onAmountChanged(),e.$watch("walletData.balance",e.onAmountChanged,!0),e.$watch("formData.amount",e.onAmountChanged,!0),e.$watch("formData.useRelative",e.onUseRelativeChanged,!0),e.$watch("walletData.balance",e.onUseRelativeChanged,!0),l.ink({selector:".modal-transfer .ink"}),e.destPub&&!e.destUid)return u.extend({pubkey:e.destPub}).then((function(t){e.destUid=t&&(t.name||t.uid),e.destUid&&(e.destPub=""),e.loading=!1}));e.loading=!1}})).catch((function(t){if("CANCELLED"===t)return e.cancel();l.onError("ERROR.LOGIN_FAILED")(t)}))},e.$on("modal.shown",e.load),e.cancel=function(){e.closeModal(),b=null},e.onUseRelativeChanged=function(){e.currency=p.data.name,e.formData.useRelative?(e.convertedBalance=e.walletData.balance/p.data.currentUD,e.minAmount=.01/(p.data.currentUD/100)):(e.convertedBalance=e.walletData.balance/100,e.minAmount=.01),e.form&&!e.loading&&e.form.$setPristine(!0)},e.onAmountChanged=function(){if(!e.sending){var t=e.formData.amount;t&&"string"==typeof t&&(t=parseFloat(t.replace(new RegExp("[.,]"),".")));var n=!0;t&&t<e.minAmount?(n=!1,e.form.amount.$error=e.form.amount.$error||{},e.form.amount.$error.min=!0):e.form.amount&&e.form.amount.$error&&e.form.amount.$error.min&&delete e.form.amount.$error.min,t&&t>e.convertedBalance?(e.form.$valid=!1,e.form.amount.$invalid=!0,e.form.amount.$error=e.form.amount.$error||{},e.form.amount.$error={max:!0}):e.form.amount&&e.form.amount.$error&&e.form.amount.$error.max&&delete e.form.amount.$error.max,e.form.$valid=n,e.form.amount&&(e.form.amount.$invalid=!n),n&&e.formData.all&&t?e.formData.useRelative?(e.formData.restAmount=e.walletData.balance-t*p.data.currentUD,e.formData.restAmount<.01&&(e.formData.restAmount=0)):e.formData.restAmount=e.walletData.balance-100*t:e.formData.restAmount=void 0}},e.doTransfer=function(){if(!e.loading&&(e.form.$submitted=!0,e.form.$valid&&e.formData.destPub&&e.formData.amount)){var n,a=e.formData.amount;if("string"==typeof a&&(a=parseFloat(a.replace(new RegExp("[.,]"),"."))),!e.sending)return e.sending=!0,t.all([b.auth({silent:!0}),p.currentUD().then((function(e){n=e})),e.hideDigitKeyboard(300)]).then(e.askTransferConfirm).then((function(t){if(t)return l.loading.show().then((function(){e.formData.useRelative?a*=n:a=100*a.toFixed(2);var t=e.formData.comment&&e.formData.comment.trim();return t&&!t.length&&(t=null),e.formData.all&&e.formData.restAmount>0?b.transferAll(e.formData.destPub,a,t,e.formData.useRelative,e.formData.restPub):b.transfer(e.formData.destPub,a,t,e.formData.useRelative)})).then((function(){return l.loading.hide(),e.closeModal(!0)})).then((function(t){return i((function(){e.sending=!1,l.toast.show("INFO.TRANSFER_SENT")}),500),t}));e.sending=!1})).catch((function(t){e.sending=!1,"CANCELLED"!==t&&l.onError("ERROR.SEND_TX_FAILED")(t)}))}},e.askTransferConfirm=function(){return n(["COMMON.UD","COMMON.EMPTY_PARENTHESIS"]).then((function(t){var i=e.formData.all&&e.formData.restAmount>0;return n(i?"CONFIRM.TRANSFER_ALL":"CONFIRM.TRANSFER",{from:e.walletData.isMember?e.walletData.uid:a("formatPubkey")(e.walletData.pubkey),to:e.destUid||e.destPub,amount:e.formData.amount,unit:e.formData.useRelative?t["COMMON.UD"]:a("abbreviate")(e.currency),comment:e.formData.comment&&0!==e.formData.comment.trim().length?e.formData.comment:t["COMMON.EMPTY_PARENTHESIS"],restAmount:i&&a("formatAmount")(e.formData.restAmount,{useRelative:e.formData.useRelative}),restTo:i&&(e.restUid||e.restPub)})})).then(l.alert.confirm)},e.addComment=function(){e.formData.useComment=!0,e.commentInputId&&i((function(){o(e.commentInputId)}),200)},e.showWotLookupModal=function(t){return t=t||"destPub",e.hideDigitKeyboard(0),c.showWotLookup({enableWallets:!0}).then((function(n){n&&("destPub"===t?(e.destUid=n.uid,e.destPub=n.uid?"":n.pubkey,e.formData.destPub=n.pubkey):"restPub"===t&&(e.restUid=n.uid,e.restPub=n.uid?"":n.pubkey,e.formData.restPub=n.pubkey))}))},e.showSelectWalletModal=function(){if(e.enableSelectWallet)return c.showSelectWallet({useRelative:e.formData.useRelative,showDefault:!0,showBalance:!0}).then((function(t){!t||b&&b.id===t.id||(b=t,e.walletData=b.data,console.debug("[transfer] Using wallet {"+b.id+"}"),e.onAmountChanged())}))},e.showUnitPopover=function(t){l.popover.show(t,{templateUrl:"templates/wallet/popover_unit.html",scope:e}).then((function(t){e.formData.useRelative=t}))},e.showDigitKeyboard=function(){if(e.digitKeyboardSettings&&!e.digitKeyboardVisible)return r.enable?(r.keyboard.close(),i((function(){e.digitKeyboardVisible=!0}),200)):(e.digitKeyboardVisible=!0,t.when())},e.hideDigitKeyboard=function(n){return e.digitKeyboardVisible?(e.digitKeyboardVisible=!1,i((function(){}),n||200)):t.when()}}function Y(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b){e.formData=angular.copy(E.data),e.popupData={},e.loading=!0,e.nodePopup={},e.bma=d,e.keepAuthIdleLabels={10:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.SECONDS",labelParams:{value:10}},30:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.SECONDS",labelParams:{value:30}},60:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.MINUTE",labelParams:{value:1}},600:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.MINUTES",labelParams:{value:10}},3600:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.HOUR",labelParams:{value:1}},9999:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.ALWAYS"}},e.keepAuthIdles=_.keys(e.keepAuthIdleLabels),e.blockValidityWindowLabels={0:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.NONE"},6:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.N",labelParams:{count:6,time:void 0}},12:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.N",labelParams:{count:12,time:void 0}},24:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.N",labelParams:{count:24,time:void 0}}},e.blockValidityWindows=_.keys(e.blockValidityWindowLabels),e.$on("$ionicView.enter",(function(){t.all([E.ready(),m.parameters().catch((function(e){})).then((function(t){var n=t&&t.avgGenTime;(!n||n<0)&&(console.warn("[settings] Could not not currency parameters. Using default G1 'avgGenTime' (300s)"),n=300),_.each(e.blockValidityWindows,(function(t){t>0&&(e.blockValidityWindowLabels[t].labelParams.time=n*t)}))}))]).then(e.load)})),e.setPopupForm=function(t){e.popupForm=t},e.load=function(){return e.loading=!0,e.locales=angular.copy(E.locales),angular.merge(e.formData,E.data),e.formData.locale=E.data.locale&&E.data.locale.id&&_.findWhere(e.locales,{id:E.data.locale.id})||_.findWhere(e.locales,{id:E.defaultSettings.locale.id}),o((function(){e.loading=!1,l.ink({selector:".item"}),e.showHelpTip()}),100)},e.reset=function(){e.actionsPopover&&e.actionsPopover.hide(),e.pendingSaving=!0,E.reset().then(b.restart).then((function(){e.load(),e.pendingSaving=!1}))},e.changeLanguage=function(e){r.use(e)},e.changeNode=function(t){var n=e.formData.node.port&&80!=e.formData.node.port&&443!=e.formData.node.port?e.formData.node.port:void 0;t=t||{host:e.formData.node.host,port:n,useSsl:angular.isDefined(e.formData.node.useSsl)?e.formData.node.useSsl:443==e.formData.node.port},e.showNodePopup(t).then((function(t){(t.host!==e.formData.node.host||t.port!==e.formData.node.port||t.useSsl!==e.formData.node.useSsl||e.formData.node.temporary)&&(l.loading.show(),d.isAlive(t).then((function(n){return n?(l.loading.hide(),angular.merge(e.formData.node,t),delete e.formData.node.temporary,d.stop(),d.copy(t),e.bma=d,b.restart(),i.clearCache()):(l.loading.hide(),l.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeNode(t)})))})))}))},e.showNodeList=function(){var t=!!("true"===p.httpsMode||!0===p.httpsMode||"force"===p.httpsMode||n.location&&"https:"===n.location.protocol);return a._popupStack[0].responseDeferred.promise.close(),c.showNetworkLookup({enableFilter:!0,bma:!0,ssl:!!t||void 0}).then((function(e){if(e){var t=e.getBMA();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(t){e.changeNode(t)}))},e.showNodePopup=function(n){return t((function(t,i){e.popupData.newNode=n.port?[n.host,n.port].join(":"):n.host,e.popupData.useSsl=n.useSsl,e.popupForm&&e.popupForm.$setPristine(),r(["SETTINGS.POPUP_PEER.TITLE","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(n){a.show({templateUrl:"templates/settings/popup_node.html",title:n["SETTINGS.POPUP_PEER.TITLE"],scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"]},{text:n["COMMON.BTN_OK"],type:"button-positive",onTap:function(t){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};t.preventDefault()}}]}).then((function(e){if(e){var n=e.server.split(":");n[1]=n[1]?n[1]:80,t({host:n[0],port:n[1],useSsl:e.useSsl})}else l.loading.hide()}))}))}))},e.save=function(){return e.loading||e.pendingSaving?t.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.save()
}),500)):(e.saving=!0,o((function(){return e.cleanupHelpTip(),E.apply(e.formData),E.store()}),100).then((function(){e.saving=!1})))},e.onDataChanged=function(n,i,a){return e.loading||e.pendingSaving?t.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.onDataChanged(n,i,a)}),500)):void(a!==e||angular.equals(n,i)||e.save())},e.$watch("formData",e.onDataChanged,!0),E.api.data.on.changed(e,(function(t){e.loading||e.saving||e.pendingSaving||!angular.equals(t.useLocalStorageEncryption,e.formData.useLocalStorageEncryption)&&(console.debug("[settings] Settings changed (outside the settings page). Reloading..."),e.load())})),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!==E.data.helptip.enable){var t=e.formData.helptip.enable;e.formData.helptip=angular.merge({},E.defaultSettings.helptip),e.formData.helptip.enable=t}},e.showActionsPopover=function(t){l.popover.show(t,{templateUrl:"templates/settings/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.startSettingsTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(t,n){if((e.isLogin()||n)&&!((t=angular.isDefined(t)?t:E.data.helptip.settings)<0)){0===t&&(t=1);var i=e.createHelptipScope(n);if(i)return i.startSettingsTour(t,!1).then((function(e){i.$destroy(),E.data.helptip.settings=e,E.store()}))}}}function $(e,n,i,a,o,r,s,l,c,d,u){e.search={result:[],total:0,loading:!0,loadingMore:!1,hasMore:!1,type:"last"},e.node={},e.currency=!1,e.entered=!1,e.searchTextId=null,e.ionItemClass="item-border-large",e.defaultSizeLimit=s.screen.isSmall()?50:100,e.helptipPrefix="helptip-network",e.listeners=[],e.enter=function(t,a){if(e.entered)e.addListeners();else{if(a&&a.stateParams&&a.stateParams.q&&(e.search.text=a.stateParams.q,e.search.text&&e.search.text.trim().length&&(e.search.type="text")),a&&a.stateParams&&a.stateParams.server){var o="true"==a.stateParams.ssl,r="true"==a.stateParams.tor,d={server:a.stateParams.server,host:a.stateParams.server,useSsl:o,useTor:r},p=a.stateParams.server.split(":");if(2===p.length&&(d.host=p[0],d.port=p[1]),!l.node.same(d))return e.node=r?l.instance(d.host+".to",443,!0,6e5):l.instance(d.host,d.port,d.useSsl),e.node.blockchain.parameters().then((function(t){e.currency=t.currency,e.enter()}));e.node=l}if(!e.currency)return c.get().then((function(t){e.currency=t?t.name:null,e.node=t.node?t.node:l,e.currency?e.enter():s.alert.error("ERROR.GET_CURRENCY_FAILED")})).catch(s.onError("ERROR.GET_CURRENCY_FAILED"));e.compactMode=!angular.isDefined(e.compactMode)||e.compactMode,e.expertMode=angular.isDefined(e.expertMode)?e.expertMode:!s.screen.isSmall()&&u.data.expertMode,e.doSearch(),e.searchTextId&&n((function(){i(e.searchTextId)}),100),e.addListeners(),e.entered=!0,e.showHelpTip()}},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.removeListeners()},e.$on("$ionicParentView.leave",e.leave),e.$on("$destroy",e.leave),e.doSearchLast=function(){return e.search.type="last",e.doSearch()},e.doSearch=function(n){var i;if(n=angular.isDefined(n)?n:0,e.search.loading=0===n,e.search.hasMore=!1,0===n)i=e.node.blockchain.current(!1).then((function(t){var n=t.number<e.defaultSizeLimit?t.number:e.defaultSizeLimit;return e.node.blockchain.blocksSlice({count:n,from:t.number-n}).then((function(e){return e&&e.splice(0,0,t),e}))})).catch((function(e){if(e&&e.ucode==l.errorCodes.NO_CURRENT_BLOCK)return[];throw e}));else{var a=e.search.results[e.search.results.length-1].number,o=a<e.defaultSizeLimit?a:e.defaultSizeLimit;i=e.node.blockchain.blocksSlice({count:o,from:a-o})}return i.then((function(i){if(!i||!i.length)return e.doDisplayResult([],n,0),void(e.search.loading=!1);i=i.reduce((function(e,n){var i=new t(n);return i.cleanData(),e.concat(i)}),[]),i=_.sortBy(i,(function(e){return-1*e.number}));var a=(0===n?i[0].number:e.search.results[0].number)+1;return e.doPrepareResult(i,n).then((function(){e.doDisplayResult(i,n,a),e.search.loading=!1}))})).catch((function(t){s.onError("BLOCKCHAIN.ERROR.SEARCH_BLOCKS_FAILED")(t),e.search.loading=!1}))};var p=a("formatDateShort");e.doPrepareResult=function(t,n){if(n=angular.isDefined(n)?n:0,"last"==e.search.type){var i;if(n>0&&e.search.results.length){var a=e.search.results[e.search.results.length-1];i=a.empty?a.day:void 0}_.forEach(t,(function(e,t){if(e.empty){var a=p(e.medianTime),o=0!==t||0!==n,r=!i||i==a;e.compacted=o&&r,i=a}else i=void 0}))}return d.extendAll(t,"issuer")},e.doDisplayResult=function(t,n,i){e.search.results=n?e.search.results.concat(t):t||[],e.search.hasMore=i&&e.search.results.length<i,e.search.total=i||e.search.total,e.smallscreen=s.screen.isSmall(),e.$broadcast("$$rebind::rebind"),t&&t.length&&e.motion.show({selector:".list-blocks .item-block"})},e.showMore=function(){var t=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,e.doSearch(t).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(t){console.error(t),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.removeListeners=function(){e.listeners.length&&(console.debug("[block] Closing listeners"),_.forEach(e.listeners,(function(e){e()})),e.listeners=[])},e.addListeners=function(){e.listeners.length||(console.debug("[block] Starting listeners"),e.node===l?e.listeners=[c.api.data.on.newBlock(e,e.onBlock)]:e.listeners=[e.node.websocket.block().onListener((function(n){if(n){var i=new t(n);i.cleanData(),e.onBlock(i)}}))])},e.onBlock=function(t){if(!(e.search.loading||"last"!==e.search.type||e.search.sort&&"desc"!==e.search.sort))if(e.search.results=e.search.results||[],e.search.results.length){var n=_.findWhere(e.search.results,{number:t.number});n?n.hash!==t.hash&&(console.debug("[blockchain] block #{0} updated (by websocket)".format(t.number)),angular.copy(t,n),e.doPrepareResult([t,e.search.results[1]]).then((function(){return e.showBlock(n)}))):(console.debug("[blockchain] new block #{0} received (by websocket)".format(t.number)),e.search.total++,e.search.results.splice(0,0,t),e.doPrepareResult([t,e.search.results[1]]).then((function(){return e.showBlock(t)})))}else console.debug("[blockchain] new block #{0} received (by websocket)".format(t.number)),e.search.total++,e.search.results.push(t),e.doPrepareResult([t]).then((function(){return e.showBlock(t)}))},e.showBlock=function(t){e.$broadcast("$$rebind::rebind"),e.motion.show({selector:"#block-"+t.number})},e.selectBlock=function(t){t.compacted&&e.compactMode?(e.toggleCompactMode(),n((function(){r("block-"+t.number)}),900)):l.node.same(e.node)?o.go("app.view_block_hash",{number:t.number,hash:t.hash}):o.go("app.view_server_block_hash",{server:e.node.server,ssl:e.node.useSsl,number:t.number,hash:t.hash})},e.toggleCompactMode=function(){if(e.compactMode=!e.compactMode,e.doDisplayResult(e.search.results,0,e.search.total),!e.search.hasMore&&e.search.results.length&&"last"==e.search.type){var t=e.search.results[e.search.results.length-1];t&&t.number>0&&n((function(){e.search.hasMore=!0}),500)}},e.toggleSort=function(t){e.search.sort!==t||e.search.asc?(e.search.asc=e.search.sort!==t||!e.search.asc,e.search.sort=t):(e.search.asc=void 0,e.search.sort=void 0),e.doSearch()},e.showHelpTip=function(){}}function K(e,n,i,a,o,r,s){e.loading=!0,e.formData={},e.compactMode=!0,e.$on("$ionicView.beforeEnter",(function(e,t){t.enableBack=!!a.screen.isSmall()||t.enableBack})),e.enter=function(t,n){if(e.loading){if(n&&(e.number=n.stateParams&&angular.isDefined(n.stateParams.number)?n.stateParams.number:"current",e.hash=n.stateParams&&n.stateParams.hash?n.stateParams.hash:void 0,n.stateParams&&n.stateParams.server)){var i="true"==n.stateParams.ssl,s="true"==n.stateParams.tor,l={server:n.stateParams.server,host:n.stateParams.server,useSsl:i,useTor:s},c=n.stateParams.server.split(":");if(2==c.length&&(l.host=c[0],l.port=c[1]),!o.node.same(l))return e.node=s?o.instance(l.host+".to",443,!0,6e5):o.instance(l.host,l.port,l.useSsl),e.node.blockchain.parameters().then((function(t){e.currency=t.currency,e.enter()}));e.node=o}e.currency&&e.node?e.load():r.get().then((function(t){t&&(e.currency=t.name,e.node=t.node,e.load())})).catch(a.onError("ERROR.GET_CURRENCY_FAILED"))}},e.$on("$ionicView.enter",e.enter),e.leave=function(){},e.$on("$ionicParentView.beforeLeave",e.leave),e.load=function(){if(e.number)return("current"==e.number?e.node.blockchain.current():e.node.blockchain.block({block:e.number})).then((function(n){var i=new t(n);if(i.parseData(),!i||!angular.isDefined(i.number)||!i.hash)return e.loading=!1,void a.alert.error("ERROR.GET_BLOCK_FAILED");if(e.hash&&i.hash!=e.hash)return e.loading=!1,void a.alert.error("ERROR.INVALID_BLOCK_HASH");var r=[];i.joiners.length&&(r=r.concat(i.joiners)),i.certifications.length&&(r=i.certifications.reduce((function(e,t){return t.to={pubkey:t.to},t.from={pubkey:t.from},e.concat(t.to,t.from)}),r),i.certifications=_.groupBy(i.certifications,(function(e){return e.to.pubkey}))),i.transactions.length&&(r=i.transactions.reduce((function(e,t){return t.issuers=t.issuers.reduce((function(e,t){return e.concat({pubkey:t})}),[]),_.forEach(t.outputs||[],(function(e){e.unlockCondition&&angular.merge(e,o.tx.parseUnlockCondition(e.unlockCondition))})),e.concat(t.issuers.concat(t.outputs||[]))}),r));var l={pubkey:i.issuer};return r.push(l),s.extendAll(r).then((function(){e.updateView({block:i,issuer:l})}))})).catch((function(t){e.loading=!1,a.onError("ERROR.GET_BLOCK_FAILED")(t)}))},e.updateView=function(t){e.formData=t.block,e.issuer=t.issuer,e.loading=!1},e.toggleCompactMode=function(){e.compactMode=!e.compactMode},e.toUnlockUIArray=function(t,n,i){return n=n||10,!t.children||"AND"!=t.type&&"OR"!=t.type?{style:{"padding-left":n+"px"},operator:i,type:t.type,value:t.value}:t.children.reduce((function(i,a,o){return a.children&&o>0?(i=i.concat({style:{"padding-left":n+"px","padding-top":"10px","padding-bottom":"10px"},operator:t.type})).concat(e.toUnlockUIArray(a,n+10)):i.concat(e.toUnlockUIArray(a,n+10,o&&t.type))}),[])},e.showUnlockConditionPopover=function(t,n){t.unlockTree&&(e.popoverData=e.popoverData||{},e.popoverData.unlockConditions=e.toUnlockUIArray(t.unlockTree),a.popover.show(n,{templateUrl:"templates/blockchain/unlock_condition_popover.html",scope:e,autoremove:!0,afterShow:function(t){e.unlockConditionPopover=t}}))},e.hideUnlockConditionsPopover=function(){e.unlockConditionPopover&&(e.unlockConditionPopover.hide(),e.unlockConditionPopover=null)},e.goState=function(t,n){e.hideUnlockConditionsPopover(),i.go(t,n)},e.openRawBlock=function(t){return e.openLink(t,e.node.url+"/blockchain/block/"+e.formData.number)},e.showHelpTip=function(e){}}function j(e,t){var n,i,a={user:"EVENT.USER.",page:"EVENT.PAGE."},o=this;if(e=e||{},o.id=e.id||""+Date.now(),o.type=e.type&&e.type.toLowerCase(),o.time=e.time,o.hash=e.hash,o.read=!!e.read_signature,o.message=e.code&&(e.reference&&a[e.reference.index]?a[e.reference.index]+e.code:"EVENT."+e.code)||e.message,o.params=e.params,t&&"function"==typeof t&&(o.markAsReadCallback=t),o.markAsRead=function(){o.markAsReadCallback&&o.markAsReadCallback(o)},e.code=e.code||"",e.code.startsWith("MEMBER_"))o.avatarIcon="ion-person",o.icon="ion-information-circled positive",o.state="app.view_wallet",o.medianTime=o.time;else if(e.code.startsWith("TX_"))o.avatarIcon="ion-card",o.icon="TX_SENT"===e.code?"ion-paper-airplane dark":"ion-archive balanced",o.medianTime=o.time,(n=e.params.length>0?e.params[0]:null)&&-1==n.indexOf(",")&&(o.pubkey=n),o.state="app.view_wallet_tx",o.stateParams={refresh:!0};else if(e.code.startsWith("CERT_"))o.avatarIcon="CERT_RECEIVED"===e.code?"ion-ribbon-b":"ion-ribbon-a",o.icon="CERT_RECEIVED"===e.code?"ion-ribbon-b balanced":"ion-ribbon-a gray",o.pubkey=e.params.length>0?e.params[0]:null,o.medianTime=o.time,o.state="app.wallet_cert",o.stateParams={type:"CERT_RECEIVED"===e.code?"received":"given"};else if(e.code.startsWith("MESSAGE_"))o.avatarIcon="ion-email",o.icon="ion-email dark",(n=e.params.length>0?e.params[0]:null)&&-1===n.indexOf(",")&&(o.pubkey=n),o.id=e.reference.id;else if(e.reference&&"user"===e.reference.index&&"profile"===e.reference.type)if(o.pubkey=e.params.length>0?e.params[0]:null,o.state="app.wot_identity",o.stateParams={pubkey:o.pubkey,uid:e.params&&e.params[3]},e.code.startsWith("LIKE_"))o.avatarIcon="ion-person",o.icon="ion-ios-heart positive";else if(e.code.startsWith("STAR_"))o.avatarIcon="ion-person",o.icon="ion-star gray";else if(e.code.startsWith("FOLLOW_"))o.avatarIcon="ion-person",o.icon="ion-ios-people gray";else if(e.code.startsWith("ABUSE_"))o.avatarIcon="ion-person",o.icon="ion-android-warning assertive";else if(e.code.startsWith("MODERATION_")){o.state="app.wot_identity",o.stateParams={pubkey:e.reference.id,uid:e.params&&e.params[3]},o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized";var r=e.params&&e.params[4]||0;"MODERATION_RECEIVED"===e.code&&5==r&&(o.message="EVENT.USER.DELETION_RECEIVED",o.icon="ion-trash-a assertive")}else o.icon="ion-person dark";else e.reference&&"page"===e.reference.index?(o.pubkey=e.params.length>0?e.params[0]:null,o.avatarIcon="ion-social-buffer",e.reference.anchor?(o.icon="ion-ios-chatbubble-outline dark",o.state="app.view_page_anchor",o.stateParams={id:e.reference.id,title:e.params[1],anchor:(i=e.reference.anchor,i?i.substr(0,4)+i.substr(i.length-4):"")}):(o.icon="ion-social-buffer dark",o.state="app.view_page",o.stateParams={id:e.reference.id,title:e.params[1]}),e.code.startsWith("LIKE_")?o.icon="ion-ios-heart positive":e.code.startsWith("FOLLOW_")?o.avatarIcon="ion-person":e.code.startsWith("ABUSE_")?o.icon="ion-alert-circled energized":e.code.startsWith("MODERATION_")&&(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized","MODERATION_RECEIVED"===e.code&&5===e.level&&(o.message="EVENT.PAGE.DELETION_RECEIVED",o.icon="ion-trash-a assertive"))):"INFO"===e.type?(o.avatarIcon="ion-information",o.icon="ion-information-circled positive"):"WARN"===e.type?(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized"):"ERROR"===e.type&&(o.avatarIcon="ion-close",o.icon="ion-close-circled assertive");return o}function z(e,t){var n=this;n.id=e,n.message=null,n.html=null,n.issuer=null,n.time=null,n.creationTime=null,n.reply_to=null,n.replyCount=0,n.parent=null,n.replies=[],n.onRemoveListeners=[],n.copy=function(e){n.message=e.message,n.html=e.html,n.issuer=e.issuer,n.time=e.time,n.creationTime=e.creationTime||n.time,n.id=e.id||n.id,n.reply_to=e.reply_to||n.reply_to,n.uid=e.uid||n.uid,n.name=e.name||n.name,n.avatarStyle=e.avatarStyle||n.avatarStyle,e.parent&&(n.parent=e.parent),e.replies&&n.setReplies(e.replies)},n.copyFromJson=function(e){n.message=e.message,n.issuer=e.issuer,n.time=e.time,n.creationTime=e.creationTime||n.time,n.reply_to=e.reply_to},n.addOnRemoveListener=function(e){e&&"function"==typeof e&&n.onRemoveListeners.push(e)},n.cleanAllListeners=function(){n.onRemoveListeners=[]},n.setReplies=function(e){n.removeAllReplies(),n.addReplies(e)},n.addReplies=function(e){e&&e.length&&(e=e.sort((function(e,t){return e.time-t.time})),_.forEach(e,(function(e){e.parent=n,n.replies.push(e)})),n.replyCount+=e.length)},n.containsReply=function(e){return-1!=n.replies.indexOf(e)},n.addReply=function(e){n.replyCount+=1,n.replies.push(e),n.replies=n.replies.sort((function(e,t){return e.time-t.time})),e.parent=n},n.removeAllReplies=function(){if(n.replyCount){var e=n.replies.splice(0,n.replies.length);n.replyCount=0,_.forEach(e,(function(e){e.remove()}))}},n.removeReply=function(e){var t=_.findIndex(n.replies,{id:e});-1!=t&&(n.replyCount--,delete n.replies.splice(t,1)[0].parent)},n.remove=function(){n.parent&&(n.parent.removeReply(n.id),delete n.parent),n.onRemoveListeners.length&&(_.forEach(n.onRemoveListeners,(function(e){e(n)})),n.issuer=null,n.message=null,n.cleanAllListeners())},t&&"object"==typeof t&&n.copyFromJson(t)}function q(e){if(e=e||{},this.type=e.type&&e.type.toLowerCase(),this.time=e.time,this.id=e.id,"certification"==this.type){if(this.comment=e.comment,this.icon="ion-ribbon-a",this.okText="WOT.BTN_CERTIFY",!e.content||-1==e.content.indexOf("-"))return console.error("[invitation] Empty content for invitation [{0}]".format(this.id)),this.message="INVITATION.ERROR.BAD_INVITATION_FORMAT",void(this.pubkey=e.issuer);var t=e.content.lastIndexOf("-");if(-1==t)return console.error("[invitation] Bad content format for invitation [{0}]: {1}".format(this.id,e.content)),this.message="INVITATION.ERROR.BAD_INVITATION_FORMAT",void(this.pubkey=e.issuer);var n={uid:e.content.substr(0,t),pubkey:e.content.substr(t+1)};this.state="app.wot_identity",this.stateParams={pubkey:n.pubkey,uid:n.uid,action:"certify"},n.pubkey==e.issuer?(this.pubkey=e.issuer,this.uid=n.uid,this.message="INVITATION.ASK_CERTIFICATION"):(this.issuer={pubkey:e.issuer},this.message="INVITATION.SUGGESTION_CERTIFICATION",this.pubkey=n.pubkey,this.uid=n.uid)}}function X(e){var t=this;Object.keys(e).forEach((function(n){t[n]=e[n]})),t.endpoints=t.endpoints||[]}function Q(e,t,n,i){e.selectNewPicture=function(t){if(i.enable)e.openPicturePopup();else{var n=angular.element(document.querySelector(t||"#pictureFile"));n&&n.length>0&&n[0].click()}},e.openPicturePopup=function(){i.camera.getPicture().then((function(t){e.pictures.push({src:"data:image/png;base64,"+t,isnew:!0})})).catch(t.onError("ERROR.TAKE_PICTURE_FAILED"))},e.onFileChanged=function(n){if(n&&n.file){t.loading.show();var i=n.file;return t.image.resizeFile(i).then((function(n){e.pictures.push({src:n,isnew:!0}),t.loading.hide(100)})).catch((function(e){console.error(e),t.loading.hide()}))}},e.removePicture=function(t){e.pictures.splice(t,1)},e.favoritePicture=function(t){if(t>0){var n=e.pictures[t];e.pictures.splice(t,1),e.pictures.splice(0,0,n)}},e.rotatePicture=function(n){var i=e.pictures[n];t.image.rotateSrc(i.src).then((function(e){i.src=e}))}}function J(e,t,n,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,n((function(){t.ink()}),10)},this.doSearch=function(){var t=this.searchText.toLowerCase().trim();t.length>1?(e.loading=!0,e.categories=e.allCategories.reduce((function(e,n){return n.parent&&-1!=n.name.toLowerCase().search(t)?e.concat(n):e}),[]),e.loading=!1):e.categories=e.allCategories},i&&i.categories?e.afterLoad(i.categories):i&&i.load&&i.load().then((function(t){e.afterLoad(t)}))}function Z(e,t,n,i,a,o,r){e.loading=!0,e.defaultCommentSize=5,e.formData={},e.comments={},e.$on("$recordView.enter",(function(t,n){e.loading?e.anchor=n&&n.stateParams.anchor:!e.loading&&e.id&&e.load(e.id,{animate:!1})})),e.$on("$recordView.load",(function(t,n,i){e.id=n||e.id,e.service=i||e.service,console.debug("[ES] [comment] Will use {"+i.index+"} service"),e.id&&e.load(e.id).then((function(){e.scrollToAnchor()}))})),e.load=function(t,n){return(n=n||{}).from=n.from||0,n.size=n.size||e.anchor&&-1,n.size=n.size||e.defaultCommentSize,n.animate=!angular.isDefined(n.animate)||n.animate,n.loadAvatarAllParent=!angular.isDefined(n.loadAvatarAllParent)||n.loadAvatarAllParent,e.loading=!0,e.service.load(t,n).then((function(i){!n.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(t,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 t=document.getElementsByName(e.anchor);if(!t||!t.length)return a(e.scrollToAnchor,500);for(var n=0;n<t.length-1;n++)angular.element(t[n]).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(t){t&&10==t.charCode&&t.ctrlKey&&(e.save(),t.preventDefault())},e.save=function(){e.formData.message&&e.formData.message.length&&e.loadWallet({minData:!0,auth:!0}).then((function(){r.loading.hide();var t=e.formData;return e.formData={},e.focusNewComment(),e.service.save(e.id,e.comments,t)})).then((function(){e.comments.total++})).catch(r.onError("COMMENTS.ERROR.FAILED_SAVE_COMMENT"))},e.share=function(i,a){var o,s=angular.copy(n.params);s.anchor?(s.anchor=t("formatHash")(a.id),o=n.href(n.current.name,s,{absolute:!0})):o=n.href(n.current.name,s,{absolute:!0})+"/"+t("formatHash")(a.id);var l=_.findIndex(e.comments.result,{id:a.id}),c=o+"?u="+(a.uid||t("formatPubkey")(a.issuer));r.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(t){var n=new z;n.copy(t),e.formData=n},e.remove=function(t){t&&(t.remove(),e.comments.total--)},e.reply=function(t){t&&t.id&&(e.formData={parent:t},e.focusNewComment(!0))},e.cancel=function(){e.formData={},e.focusNewComment()},e.focusNewComment=function(e){r.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,t){e.expandedReplies=e.expandedReplies||{},e.expandedReplies[t]=!e.expandedReplies[t]},e.toggleExpandedParent=function(e,t){e.expandedParent=e.expandedParent||{},e.expandedParent[t]=!e.expandedParent[t]}}function ee(e,t,n,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 r=a.get(o);if(!r)return i.alert.error("PROFILE.ERROR.INVALID_SOCIAL_NETWORK_FORMAT"),void t("socialUrl");e.formData.socials.push(r),e.socialData.url="",e.motion.show({selector:"#social-"+n("formatSlug")(r.url),startVelocity:1e4})}}},e.editSocialNetwork=function(n){var i=e.formData.socials[n];e.formData.socials.splice(n,1),e.socialData.url=i.url,t("socialUrl")},e.reorderSocialNetwork=function(t,n,i){t&&n!=i&&(e.formData.socials.splice(n,1),e.formData.socials.splice(i,0,t))},e.filterFn=function(e){return!e.recipient||e.valid}}function te(e){e.openSocial=function(t,n){return e.openLink(t,n.url,{type:n.type})},e.filterFn=function(e){return!e.recipient||e.valid}}function ne(e,t){e.formData={initCrop:!1,imageCropStep:0,imgSrc:void 0,result:void 0,resultBlob:void 0},e.onFileChanged=function(n){if(n&&n.file){var i=new FileReader;i.readAsDataURL(n.file),i.onload=function(n){var i=this.result;e.$applyAsync((function(){e.formData.imgSrc=t.getTrustedHtml(i)}))}}},e.doNext=function(){2===e.formData.imageCropStep?e.doCrop():3===e.formData.imageCropStep&&e.closeModal(e.formData.result)},e.doPrevious=function(){e.formData.imageCropStep-=1},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 ie(e,t,n,i){var a=t.plugins&&t.plugins.es&&t.plugins.es.defaultCountry,o=!1;e.formPosition={loading:!1,enable:void 0},e.searchModalOpened=!1,e.tryToLocalize=function(){if(!e.formPosition.loading&&!o){var t=e.getAddressToSearch();return t?(e.formPosition.loading=!0,n.point.searchByAddress(t).then((function(n){return n&&1==n.length?e.updateGeoPoint(n[0]):e.openSearchLocationModal({text:t,results:n||[],forceFallback:!n||!n.length})})).then((function(){e.formPosition.loading=!1})).catch((function(t){console.error(t),e.formPosition.loading=!1}))):(o=!0,n.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(t){if(t&&t.lat&&t.lon&&(e.dirty=!0,e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=parseFloat(t.lat),e.formData.geoPoint.lon=parseFloat(t.lon),t.address&&t.address.city)){var n=[t.address.city];t.address.postcode&&n.push(t.address.postcode),t.address.country!=a&&n.push(t.address.country),e.formData.city=n.join(", ")}},e.openSearchLocationModal=function(t){if(!e.searchModalOpened){e.searchModalOpened=!0;var n={text:(t=t||{}).text||e.getAddressToSearch(),results:t.results,fallbackText:t.fallbackText||e.formData.city,forceFallback:angular.isDefined(t.forceFallback)?t.forceFallback:void 0};return i.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",n,{focusFirstInput:!0}).then((function(t){e.searchModalOpened=!1,e.updateGeoPoint(t)})).catch((function(){console.error(err),e.searchModalOpened=!1}))}}}function ae(e,t,n,i,a){var o=n.plugins&&n.plugins.es&&n.plugins.es.defaultCountry,r=!1;e.geoDistanceLabels=[5,10,20,50,100,250,500].reduce((function(e,t){return e[t]={labelKey:"LOCATION.DISTANCE_OPTION",labelParams:{value:t}},e}),{}),e.geoDistances=_.keys(e.geoDistanceLabels),e.searchPosition=function(n){if(r)return t.when();r=!0;var a=n?i.point.searchByAddress(n).then((function(t){return t&&1==t.length?(t[0].exact=!0,t[0]):e.openSearchLocationModal({text:n,results:t||[],forceFallback:!t||!t.length}).then((function(e){if(e&&e.address&&e.address.city){var t=[e.address.city];e.address.postcode&&t.push(e.address.postcode),e.address.country!=o&&t.push(e.address.country),e.shortName=t.join(", ")}return e}))})):i.point.current();return a.then((function(e){if(r=!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),r=!1})),a},e.openSearchLocationModal=function(t){var n={text:(t=t||{}).text||e.getAddressToSearch(),results:t.results,fallbackText:t.fallbackText||e.search.location,forceFallback:angular.isDefined(t.forceFallback)?t.forceFallback:void 0};return a.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",n,{focusFirstInput:!0})}}function oe(e,t,n,i,a){var o=i.plugins&&i.plugins.es&&i.plugins.es.defaultCountry,r=!1;e.locations=void 0,e.selectLocationIndex=-1,e.onKeydown=function(t){switch(t.keyCode){case 27:e.hideDropdown();break;case 13:e.locations&&e.locations.length&&e.onEnter();break;case 38:e.onArrowUpOrDown(-1),t.preventDefault();break;case 40:e.onArrowUpOrDown(1),t.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(t){e.locations&&(e.selectLocationIndex+=t,e.selectLocationIndex>=e.locations.length&&(e.selectLocationIndex=0),e.selectLocationIndex<0&&(e.selectLocationIndex=e.locations.length-1),_.forEach(e.locations||[],(function(t,n){t.selected=n==e.selectLocationIndex})))},e.onLocationChanged=function(){r||e.search.loading||(e.search.geoPoint=void 0,e.showDropdown())},e.showDropdown=function(){var t=e.search.location&&e.search.location.trim();if(!t||t.length<3)return e.hideDropdown(!0);var n=e.requestId&&e.requestId+1||1;return e.requestId=n,r=!0,a.point.searchByAddress(t).then((function(t){e.requestId==n&&(r=!1,e.locations=t||[],e.license=t&&t.length&&t[0].license)})).catch((function(t){throw e.hideDropdown(),t}))},e.hideDropdown=function(n){return n?(e.locations=void 0,e.selectLocationIndex=-1,e.license=void 0,void(r=!1)):t((function(){r||(e.locations=void 0,e.license=void 0,r=!1)}),500)},e.selectLocation=function(t,n){if(r=!0,t)if(e.search.geoPoint=e.search.geoPoint||{},e.search.geoPoint.lat=parseFloat(t.lat),e.search.geoPoint.lon=parseFloat(t.lon),n)e.search.geoPoint.exact=!0;else if(t&&t.address&&t.address.city){var i=[t.address.city];t.address.postcode&&i.push(t.address.postcode),t.address.country!=o&&i.push(t.address.country),e.search.location=i.join(", ")}e.hideDropdown(!0)},e.openSearchLocationModal=function(t){var i={text:(t=t||{text:e.search.location}).text||e.search.location};return n.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",i,{focusFirstInput:!0}).then(e.selectLocation)}}function re(e,t,n,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 t.when();e.search.loading=!0;var r=a&&e.search.fallbackText&&e.search.fallbackText.trim();return r=r&&r!=o?r:void 0,(a&&e.search.forceFallback&&e.search.results?t.when(e.search.results):i.point.searchByAddress(o)).then((function(e){return e&&e.length||!r?e:t.all([n("LOCATION.MODAL.ALTERNATIVE_RESULT_DIVIDER",{address:r}),i.point.searchByAddress(r)]).then((function(e){var t=e[0];return(e=e[1])&&e.length?[{name:t}].concat(e):e}))})).then((function(t){e.search.loading=!1,e.search.results=t||[],e.license=t&&t.length&&t[0].license})).catch((function(t){throw e.search.loading=!1,e.search.results=[],e.license=void 0,t}))}}function se(e,t,n){e.extensionPoint=n.extensions.points.current.get(),e.enable=t.isEnable(),t.api.state.on.changed(e,(function(t){e.enable=t,e.$broadcast("$$rebind::state")}))}function le(e,t,n,i,a){angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.showRegistryLookupView=function(){t.go(i.screen.isSmall()?"app.wot_lookup.tab_registry":"app.registry_lookup_lg")},e.showNotificationsPopover=function(t){return i.popover.show(t,{templateUrl:"plugins/es/templates/notification/popover_notification.html",scope:e,autoremove:!1,afterShow:function(e){var t=a.api.data.on.unauth(e.scope,(function(){e.scope.closePopover(),t()}))}})},e.showMessagesPopover=function(t){return a.isAuth()?i.popover.show(t,{templateUrl:"plugins/es/templates/message/popover_message.html",scope:e,autoremove:!1,afterShow:function(e){var t=a.api.data.on.unauth(e.scope,(function(){e.scope.closePopover(),t()}))}}):a.auth({minData:!0}).then((function(){return i.loading.hide(),e.showMessagesPopover(t)}))},e.showInvitationsPopover=function(t){return a.isAuth()?i.popover.show(t,{templateUrl:"plugins/es/templates/invitation/popover_invitation.html",scope:e,autoremove:!1,afterShow:function(e){var t=a.api.data.on.unauth(e.scope,(function(){e.scope.closePopover(),t()}))}}):a.auth().then((function(){return i.loading.hide(),e.showInvitationsPopover(t)}))}}function ce(e,t,n,i,a){e.updateView=function(){e.enable=a.isLogin()&&i.isEnable()},e.showEditUserProfile=function(){e.closeProfilePopover(),n.go("app.edit_profile")},i.api.state.on.changed(e,e.updateView),a.api.data.on.login(e,(function(n,a){return e.enable=i.isEnable(),a&&a.resolve()||t.when()})),a.api.data.on.logout(e,(function(){e.enable=!1})),e.updateView()}function de(e,t,n,i,a,o,r,s,l,c,d,u,p){e.hasWindowNotification=!!("Notification"in window),e.formData={},e.popupData={},e.loading=!0,e.enter=function(t,n){e.load()},e.$on("$ionicView.enter",e.enter),e.load=function(t){e.loading=!0;var n=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},t&&n&&(e.formData.enable=n),e.isFallbackNode=e.formData.enable&&d.node.isFallback(),e.server=e.getServer(d),e.loading=!1},u.api.state.on.changed(e,(function(t){e.load(!0)})),e.setPopupForm=function(t){e.popupForm=t},e.changeEsNode=function(t){t=t||{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(t).then((function(t){if(t.host!==e.formData.host||t.port!=e.formData.port||t.useSsl!=e.formData.useSsl){o.loading.show();var n=d.instance(t.host,t.port,t.useSsl);return n.isAlive().then((function(i){return i?(e.formData.host=n.host,e.formData.port=n.port,e.formData.useSsl=n.useSsl,d.copy(n)):(o.loading.hide(),o.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeEsNode(t)})))})).then((function(){e.server=e.getServer(d),e.isFallbackNode=!1,o.loading.hide()}))}o.loading.hide()}))},e.showNodePopup=function(t){return n((function(n,r){var s=[t.host];t.port&&80!=t.port&&s.push(t.port),e.popupData.newNode=s.join(":"),e.popupData.useSsl=angular.isDefined(t.useSsl)?t.useSsl:443==t.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(t){a.show({templateUrl:"templates/settings/popup_node.html",title:t["ES_SETTINGS.POPUP_PEER.TITLE"],subTitle:t["ES_SETTINGS.POPUP_PEER.HELP"],scope:e,buttons:[{text:t["COMMON.BTN_CANCEL"]},{text:t["COMMON.BTN_OK"],type:"button-positive",onTap:function(t){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};t.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 o.loading.hide()}))}))}))},e.showNodeList=function(){var n=!!("true"===l.httpsMode||!0===l.httpsMode||"force"===l.httpsMode||t.location&&"https:"===t.location.protocol);return a._popupStack[0].responseDeferred.promise.close(),p.showNetworkLookup({enableFilter:!0,endpoint:d.constants.ES_USER_API_ENDPOINT,ssl:!!n||void 0}).then((function(e){if(e){var t=(e.getEsEndpoints()||[]).reduce((function(e,t){var n=d.node.parseEndPoint(t);return n?e.concat(n):e}),[]);if(t.length){var n=t[0];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(t){e.changeEsNode(t)}))},e.onFormChanged=function(){e.loading||(e.hasWindowNotification&&e.formData.notifications.emitHtml5!==("granted"===window.Notification.permission)?window.Notification.requestPermission((function(t){e.formData.notifications.emitHtml5="granted"===t,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(t){if((t=t||e.formData).host)return s.getServer(t.host,t.port)}}function ue(e,t,n,i,a){angular.extend(this,t("ESExtensionCtrl",{$scope:e})),e.showProfileHelp=!1,e.showNewPageModal=function(e){var t=n.params&&n.params.id?i.children.get(n.params.id):i;if(t)return a.showNewPage({wallet:t});UIUtils.alert.error("ERROR.UNKNOWN_WALLET_ID")}}function pe(e,t,n,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,t("ESLikesCtrl",{$scope:e})),angular.extend(this,t("ESExtensionCtrl",{$scope:e})),e.$watch("formData.pubkey",(function(t){t&&e.loadLikes(t)}))}function me(e,t,n){angular.extend(this,t("ESExtensionCtrl",{$scope:e})),e.openRegistryLookup=function(){var t=e.search.text&&e.search.text.trim()||"",i=e.search.location&&e.search.location.trim()||"",a={q:t.length?t:void 0,location:i.length?i:void 0};n.go("app.wot_lookup.tab_registry",a)}}function Ee(e,t,n,i,a,o,r,s,l,c,d,u,p,m){e.options=e.options||{},e.options.like=e.options.like||{kinds:c.constants.KINDS,index:"user",type:"profile",service:p.like},e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:o.screen.isSmall(),angular.extend(this,i("ESLikesCtrl",{$scope:e})),angular.extend(this,i("ESExtensionCtrl",{$scope:e})),e.canCertify=!1,e.showNewMessageModal=function(t){return s.login({minData:!0,method:"default"}).then((function(){return o.loading.hide(),!(!t&&!e.formData.profile)||o.alert.confirm("MESSAGE.CONFIRM.USER_HAS_NO_PROFILE").then((function(e){if(e)return!0}))})).then((function(t){return!!t&&d.showMessageCompose({destPub:e.formData.pubkey,destUid:e.formData.name||e.formData.uid}).then((function(e){e&&o.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.showSuggestCertificationModal=function(){var t;return e.hideCertificationActionsPopover(),s.auth({minData:!0}).then((function(i){if(o.loading.hide(),i)return i.isMember?r.showWotLookup({allowMultiple:!0,enableFilter:!0,title:"WOT.SUGGEST_CERTIFICATIONS_MODAL.TITLE",help:"WOT.SUGGEST_CERTIFICATIONS_MODAL.HELP",okText:"COMMON.BTN_NEXT",okType:"button-positive"}).then((function(a){if(a&&a.length)return t=a,n.all([u.box.getKeypair(i.keypair),o.alert.confirm("WOT.CONFIRM.SUGGEST_CERTIFICATIONS",void 0,{okText:"COMMON.BTN_SEND"})]).then((function(a){if(a){var o=a[0];if(a[1]){var r=moment().utc().unix();return n.all(t.reduce((function(t,n){return t.concat(m.send({issuer:i.pubkey,recipient:e.formData.pubkey,time:r,content:[n.uid,n.pubkey].join("-")},o,"certification"))}),[]))}}})).then((function(){o.toast.show("INVITATION.INFO.INVITATION_SENT")})).catch(o.onError("INVITATION.ERROR.SEND_INVITATION_FAILED"))})):o.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")}))},e.showAskCertificationModal=function(){var t;return e.hideCertificationActionsPopover(),(s.children.count()?r.showSelectWallet({displayBalance:!1}):n.when(s)).then((function(e){if(!e)throw"CANCELLED";return e.auth({minData:!0})})).then((function(e){if(o.loading.hide(),e)return e.isMember?r.showWotLookup({allowMultiple:!0,enableFilter:!1,title:"WOT.ASK_CERTIFICATIONS_MODAL.TITLE",help:"WOT.ASK_CERTIFICATIONS_MODAL.HELP",okText:"COMMON.BTN_NEXT",okType:"button-positive"}).then((function(i){if(i&&i.length)return t=i,n.all([u.box.getKeypair(e.keypair),o.alert.confirm("WOT.CONFIRM.ASK_CERTIFICATIONS",void 0,{okText:"COMMON.BTN_SEND"})]).then((function(i){var a=i&&i[0],r=i&&i[1];if(a&&r){var s=moment().utc().unix();return n.all(t.reduce((function(t,n){return t.concat(m.send({issuer:e.pubkey,recipient:n.pubkey,time:s,content:[e.uid,e.pubkey].join("-")},a,"certification"))}),[])).then((function(){o.toast.show("INVITATION.INFO.INVITATION_SENT")})).catch(o.onError("INVITATION.ERROR.SEND_INVITATION_FAILED"))}}))})):o.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")}))},e.askCertification=function(){return e.hideCertificationActionsPopover(),(s.children.count()?r.showSelectWallet({displayBalance:!1}):n.when(s)).then((function(e){return e.auth({minData:!0})})).then((function(t){if(o.loading.hide(),t)return t.isMember?o.alert.confirm("WOT.CONFIRM.ASK_CERTIFICATION",void 0,{okText:"COMMON.BTN_SEND"}).then((function(n){if(n)return m.send({issuer:t.pubkey,recipient:e.formData.pubkey,content:[t.uid,t.pubkey].join("-")},{type:"certification",keypair:t.keypair}).then((function(){o.toast.show("INVITATION.INFO.INVITATION_SENT")})).catch(o.onError("INVITATION.ERROR.SEND_INVITATION_FAILED"))})):o.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")}))},e.delete=function(t){if(!t){if(e.hideActionsPopover(),!e.formData.pubkey)return;return o.alert.confirm("PROFILE.CONFIRM.DELETE_BY_MODERATOR").then((function(t){if(t)return e.delete(t)}))}return o.loading.show().then((function(){return p.remove(e.formData.pubkey)})).then((function(){return e.doUpdate()})).then((function(){return a((function(){o.toast.show("DOCUMENT.INFO.REMOVED")}),800)})).catch(o.onError("PROFILE.ERROR.DELETE_PROFILE_FAILED"))},e.$watch("formData.pubkey",(function(t){t&&(e.loadLikes(t),e.canDelete=e.formData.profile&&s.isLogin()&&!0===s.data.moderator)})),e.showCertificationActionsPopover=function(t){o.popover.show(t,{templateUrl:"plugins/es/templates/wot/popover_certification_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.certificationActionsPopover=t}})},e.hideCertificationActionsPopover=function(){return e.certificationActionsPopover&&(e.certificationActionsPopover.hide(),e.certificationActionsPopover=null),!0},e.showActionsPopover=function(t){o.popover.show(t,{templateUrl:"plugins/es/templates/wot/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},"buttons-top-fab"===e.extensionPoint&&e.$on("$csExtension.motion",(function(t){e.formData.profile&&e.showFab("fab-compose-"+e.formData.pubkey)}))}function be(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b,g){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(n,i){if(!e.entered||!e.search.results||0===e.search.results.length){if(!e.geoUnit)return r("LOCATION.DISTANCE_UNIT").then((function(t){return e.geoUnit=t,e.enter(n,i)}));var a=function(){e.searchTextId&&t(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(n,i)}));e.search.geoPoint=m.data.profile.geoPoint,e.search.location=m.data.profile.city||(m.data.profile.geoPoint?r.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?b.category.get({id:i.stateParams.category}).then((function(t){e.search.category=t,a()})).catch(c.onError("REGISTRY.ERROR.LOAD_CATEGORY_FAILED")):a()}e.showFab("fab-add-registry-record")},e.$on("$ionicView.enter",(function(t,n){return e.enter(t,n)})),e.leave=function(){var t=!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},t=!0);var o=p.data.plugins.es.geoDistance;o&&o===e.search.geoDistance||(p.data.plugins.es.geoDistance=e.search.geoDistance,t=!0),t&&n((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(t){if(!t)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=t,t.shortName&&!t.exact&&(e.search.location=t.shortName),e.search.loadingPosition=!1}))},e.doGetLastRecords=function(t){return e.hidePopovers(),e.search.text=void 0,e.doSearch(t)},e.doSearchText=function(){e.doSearch()},e.doSearch=function(t){if(e.search.loading=!t,e.search.location&&e.search.location.length>=3&&!e.search.geoPoint)return e.resolveLocationPosition().then((function(){return e.doSearch(t)}));var n=e.search.text&&e.search.text.trim()||"";e.search.lastRecords=!n||!n.length;var i=[],a=[];if(n&&n.length)if(u.regexp.PUBKEY.test(n))a.push({term:{pubkey:n}});else{var o=(n=n.toLowerCase())?g.util.parseTags(n):void 0;i.push({multi_match:{query:n,fields:["title","description","city","address"],type:"phrase_prefix"}}),i.push({match:{title:{query:n,boost:2}}}),i.push({prefix:{title:n}}),i.push({match:{description:n}}),i.push({nested:{path:"category",query:{bool:{filter:{match:{"category.name":n}}}}}}),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 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 s=r.split(",")[0];a.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{match_phrase:{city:s}}]},{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:t};return 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"}),e.updateLocationHref(),e.doRequest(l)},e.doRequest=function(t){(t=t||{}).from=t.from||0,t.size=t.size||10,t.size<10&&(t.size=10),e.search.loading=0===t.from;var n=e.requestId&&e.requestId+1||1;return e.requestId=n,b.record.search(t).then((function(a){if(e.requestId==n){if(!a||!a.hits||!a.hits.length)return e.search.results=t.from>0?e.search.results:[],e.search.total=t.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)})),t.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(n){e.search.loading=!1,e.search.results=t.from>0?e.search.results:[],e.search.total=t.from>0?e.search.total:0,e.search.hasMore=!1,c.onError("REGISTRY.ERROR.LOOKUP_RECORDS_FAILED")(n)}))},e.showMore=function(){var t=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,(e.search.lastRecords?e.doGetLastRecords:e.doSearch)(t).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(t){console.error(t),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(t){t||n((function(){var t=e.search.text&&e.search.text.trim(),n=e.search.location&&e.search.location.trim(),i={location:n&&n.length?n: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};t&&t.match(/^#\w+$/)?i.hash=t.substr(1):t&&t.length&&(i.q=t),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,n(e.hidePopovers,200)},e.showRecordTypeModal=function(t){e.hidePopovers(),n((function(){t.isDefaultPrevented()||d.show("plugins/es/templates/registry/modal_record_type.html").then((function(t){t&&(e.search.type=t,e.doSearch(),e.updateLocationHref())}))}),350)},e.showCategoryModal=function(t){n((function(){t.isDefaultPrevented()||b.category.all().then((function(e){return d.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(t){t&&t.parent&&(e.search.category=t,e.doSearch(),e.updateLocationHref())}))}),350)},e.showNewPageModal=function(){return e.hidePopovers(),E.showNewPage()},e.showActionsPopover=function(t){c.popover.show(t,{templateUrl:"plugins/es/templates/registry/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.filtersPopover=null)},e.showFiltersPopover=function(t){c.popover.show(t,{templateUrl:"plugins/es/templates/registry/lookup_popover_filters.html",scope:e,autoremove:!0,afterShow:function(t){e.filtersPopover=t}})},e.hideFiltersPopover=function(){e.filtersPopover&&(e.filtersPopover.hide(),e.filtersPopover=null)},e.hidePopovers=function(){e.hideActionsPopover(),e.hideFiltersPopover()}}function ge(e,t,n,i,a,o){var r;angular.extend(this,t("ESRegistryLookupCtrl",{$scope:e})),e.searchTextId=void 0,e.enter=function(t,a){return e.entered?a.stateParams&&a.stateParams.refresh?n(e.doSearch,2e3):void 0:(r=a.stateParams&&a.stateParams.id?o.children.get(a.stateParams.id):o)?r.login({minData:!0}).then((function(t){i.loading.hide(),e.search.issuer=t.pubkey,e.search.advanced=!0,n(e.doSearch,100),e.showFab("fab-wallet-add-registry-record")})):(i.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome())},e.doUpdate=function(){if(r&&r.isLogin())return e.search.issuer=o.data.pubkey,e.search.advanced=!0,e.doSearch()},e.showNewPageModal=function(){return e.hidePopovers(),a.showNewPage({wallet:r})}}function fe(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){e.formData={},e.id=null,e.category={},e.pictures=[],e.canEdit=!1,e.showTransfer=!1,e.loading=!0,e.motion=m.motion.fadeSlideIn,e.options=e.options||{},e.options.like={kinds:["LIKE","ABUSE"],index:"page",type:"record"},e.likeData={likes:{},abuses:{}},angular.extend(this,l("ESLikesCtrl",{$scope:e})),e.$on("$ionicView.beforeEnter",(function(e,t){t.enableBack=!!m.screen.isSmall()||t.enableBack})),e.$on("$ionicView.enter",(function(t,i){i.stateParams&&i.stateParams.id?((e.loading||i.stateParams.refresh)&&e.load(i.stateParams.id,i.stateParams.anchor),e.$broadcast("$recordView.enter",i)):n.go("app.wot_lookup.tab_registry")})),e.$on("$ionicView.beforeLeave",(function(t,n){e.$broadcast("$recordView.beforeLeave",n)})),e.load=function(t,o){return t=t||e.id,e.loading=!0,i.all([p.record.load(t).then((function(t){e.id=t.id,e.formData=t.record,e.canEdit=u.isUserPubkey(e.formData.issuer)||u.children.hasPubkey(e.formData.issuer),e.showTransfer=!e.canEdit&&e.formData.pubkey,e.issuer=t.issuer,e.avatar=e.formData.avatar,e.avatarStyle=e.formData.avatar&&{"background-image":'url("'+e.avatar.src+'")'},m.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?(m.toast.show("REGISTRY.ERROR.RECORD_NOT_EXISTS"),n.go("app.wot_lookup.tab_registry")):m.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(a)):(e.secondTry=!0,i((function(){e.load(t)}),100))})),p.record.picture.all({id:t}).then((function(t){e.pictures=t._source.pictures&&t._source.pictures.reduce((function(e,t){return e.concat(E.image.fromAttachment(t.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",t,p.record.comment)}))]).then((function(){e.motion.show({selector:".lazy-load .item",startVelocity:3e3}),o&&a((function(){c(o)}),1e3)}))},e.edit=function(){var t=u.isUserPubkey(e.formData.issuer)?u:u.children.getByPubkey(e.formData.issuer);if(t)return m.loading.show(),n.go("app.registry_edit_record",{id:e.id,wallet:t.id})},e.delete=function(){e.hideActionsPopover();var t,i=u.isUserPubkey(e.formData.issuer)?u:u.children.getByPubkey(e.formData.issuer);i&&s(["REGISTRY.VIEW.REMOVE_CONFIRMATION","REGISTRY.INFO.RECORD_REMOVED"]).then((function(e){return t=e,m.alert.confirm(e["REGISTRY.VIEW.REMOVE_CONFIRMATION"])})).then((function(a){a&&p.record.remove(e.id,{wallet:i}).then((function(){i.data.pages&&i.data.pages.count&&i.data.pages.count--,r.nextViewOptions({historyRoot:!0}),i.isDefault()?n.go("app.wallet_pages",{refresh:!0}):n.go("app.wallet_pages_by_id",{refresh:!0,id:i.id}),m.toast.show(t["REGISTRY.INFO.RECORD_REMOVED"])})).catch(m.onError("REGISTRY.ERROR.REMOVE_RECORD_FAILED"))}))},e.showActionsPopover=function(t){m.popover.show(t,{templateUrl:"plugins/es/templates/registry/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},e.showSharePopover=function(i){e.hideActionsPopover();var a=e.formData.title,o=(d.shareBaseUrl||t.rootPath)+n.href("app.view_page",{title:a,id:e.id});m.screen.isSmall()&&(i=angular.element(document.querySelector("#registry-share-anchor-"+e.id))||i),m.popover.share(i,{bindings:{url:o,titleKey:"REGISTRY.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:a},time:e.formData.time,postMessage:a}})}}function _e(e,t,n,i,a,o,r,s,l,c,d,u,p,m){var E;angular.extend(this,s("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(t){e.form=t},e.$on("$ionicView.enter",(function(t,n){if(e.loading)return(E=n.stateParams&&n.stateParams.wallet&&"default"!=n.stateParams.wallet?u.children.get(n.stateParams.wallet):u)?E.login({minData:!0}).then((function(t){e.walletData=t,n.stateParams&&n.stateParams.id?e.load(n.stateParams.id):n.stateParams&&n.stateParams.type&&e.updateView({record:{type:n.stateParams.type}}),o("registry-record-title")})):(c.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome())})),e.$on("$stateChangeStart",(function(t,i,o,r){if(e.dirty&&!e.saving&&(t.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(t){return e.loading=!1,t?(e.form.$submitted=!0,e.save(!1,!0).then((function(t){return t&&(e.dirty=!1),t}))):(e.dirty=!1,!0)})).then((function(e){e&&(a.nextViewOptions({historyRoot:!0}),n.go(i.name,o))})).catch((function(e){}))})),e.load=function(t){e.loading=!0,m.record.load(t,{raw:!0}).then((function(t){t&&t.record?e.updateView(t):e.updateView({record:{}})})).catch((function(t){c.loading.hide(10),e.loading=!1,c.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(t)}))},e.updateView=function(n){e.formData=n.record||{},e.id=n.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=n.record&&n.record.pictures||[],delete n.record.pictures,e.motion.show({selector:".animate-ripple .item, .card-gallery",startVelocity:3e3}),c.loading.hide(),t((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,s){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)?s?(e.saving=!0,console.debug("[ES] [page] Saving record..."),i.when().then((function(){var t=e.formData;return e.needCategory()||delete t.category,t.time=moment().utc().unix(),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,t.socials&&t.socials.length&&(t.socials=_.uniq(t.socials,!1,(function(e){return e.url}))),t.picturesCount=e.pictures.length,t.picturesCount>0?t.pictures=e.pictures.reduce((function(e,t){return e.concat({file:p.image.toAttachment(t)})}),[]):t.pictures=[],e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(e){return t.avatar=p.image.toAttachment({src:e}),t})):(t.avatar={_content:"",_content_type:""},t)})).then((function(t){return e.id?m.record.update(t,{id:e.id,wallet:E}):m.record.add(t,{wallet:E})})).then((function(t){return console.info("[ES] [page] Record successfully saved."),!e.id&&E.data.pages&&E.data.pages.count&&u.data.pages.count++,e.id=e.id||t,e.saving=!1,e.dirty=!1,o||r("REGISTRY.INFO.RECORD_SAVED").then((function(e){c.toast.show(e)})),a.clearCache(a.currentView().stateId),a.nextViewOptions({historyRoot:!0}),n.go("app.view_page",{id:e.id,refresh:!0})})).catch((function(t){e.saving=!1,c.onError("REGISTRY.ERROR.SAVE_RECORD_FAILED")(t)}))):(console.debug("[ES] [page] Waiting debounce end, before saving..."),t((function(){return e.save(o,!0)}),650)):i.reject()},e.openPicturePopup=function(){l.camera.getPicture().then((function(t){t&&e.pictures.push({src:"data:image/png;base64,"+t})})).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(t){e.avatar.src=t,e.avatarStyle={"background-image":'url("'+t+'")'},e.dirty=!0,e.rotating=!1})).catch((function(t){console.error(t),e.rotating=!1}))},e.fileChanged=function(t){return c.loading.show(),i((function(n,i){var a=t.target.files[0];c.image.resizeFile(a).then((function(t){e.pictures.push({src:t}),c.loading.hide(),n()}))}))},e.removePicture=function(t){e.pictures.splice(t,1)},e.favoritePicture=function(t){if(t>0){var n=e.pictures[t];e.pictures.splice(t,1),e.pictures.splice(0,0,n)}},e.cancel=function(){a.goBack()},e.showAvatarModal=function(){return l.camera.enable?l.camera.getPicture().then((function(t){t&&(e.avatar={src:"data:image/png;base64,"+t},e.avatarStyle={"background-image":'url("'+t+'")'},e.dirty=!0,e.avatarClass={})})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):d.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(t){t&&(e.avatar={src:t},e.avatarStyle={"background-image":'url("'+t+'")'},e.dirty=!0,e.avatarClass={})}))},e.showRecordTypeModal=function(){d.show("plugins/es/templates/registry/modal_record_type.html").then((function(t){t&&(e.formData.type=t,e.avatar||(e.avatarClass["cion-page-"+t]=!0))}))},e.showCategoryModal=function(t){m.category.all().then((function(e){return d.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(t){t&&t.parent&&(e.formData.category=t)}))}}function he(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){var b;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.avatar=null,e.existing=!1,e.socialData={url:null},e.socialReorder=!0,e.enter=function(t,n){return(b=n.stateParams&&n.stateParams.id?d.children.get(n.stateParams.id):d)?(e.walletId=b.id,b.auth({minData:!0}).then(e.load).catch((function(t){if("CANCELLED"==t)return c.loading.hide(10),void e.cancel();c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(t)}))):(c.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome())},e.$on("$ionicView.enter",e.enter),e.$on("$stateChangeStart",(function(t,n,a,o){if(e.dirty&&!e.saving&&(t.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(t){return e.loading=!1,t?(e.form.$submitted=!0,e.save(!1,!0).then((function(t){return t&&(e.dirty=!1),t}))):(e.dirty=!1,!0)})).then((function(e){e&&(s.nextViewOptions({historyRoot:!0}),i.go(n.name,a))})).catch((function(e){}))})),e.load=function(t){return e.loading=!0,p.get(t.pubkey,{raw:!0}).then((function(i){return i?(e.avatar=u.image.fromAttachment(i.source.avatar),e.existing=!0,e.updateView(t,i.source)):(e.avatar=void 0,e.existing=!1,e.updateView(t,{})),c.loading.hide(),n((function(){e.loading=!1}),1e3)})).then((function(){a("profile-name")})).catch(c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED"))},e.setForm=function(t){e.form=t},e.updateView=function(t,n){e.walletData=t,e.formData=n,n.avatar&&(e.avatarStyle={"background-image":'url("'+e.avatar.src+'")'}),e.motion.show()},e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.save=function(i,a){if(e.form.$invalid||!e.walletData||e.saving&&!a)return t.reject();if(!a)return e.saving=!0,n((function(){return e.save(i,!0)}),650);console.debug("[ES] [profile] Saving user profile...");var r=function(t){return function(n){e.saving=!1,c.onError(t)(n)}},s=function(t){t&&(e.walletData.name=t.title,e.avatar?e.walletData.avatar=e.avatar:delete e.walletData.avatar,e.walletData.profile=angular.copy(t),e.walletData.profile.descriptionHtml=u.util.parseAsHtml(t.description))},l=function(){if(!i)return o("PROFILE.INFO.PROFILE_SAVED").then((function(e){c.toast.show(e)}))},d=function(t){return t.socials&&t.socials.length&&(t.socials=_.uniq(t.socials,!1,(function(e){return e.url}))),t.position&&(t.position=null),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:e.walletData.pubkey,wallet:b}).then((function(){return console.info("[ES] Profile successfully updated."),e.saving=!1,e.dirty=!1,s(t),l(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED")):p.add(t,{wallet:b}).then((function(){return console.info("[ES] [profile] Successfully created."),e.existing=!0,e.saving=!1,e.dirty=!1,s(t),l(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED"))};return e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(t){return e.formData.avatar=u.image.toAttachment({src:t}),d(e.formData)})):(delete e.formData.avatar,d(e.formData))},e.saveAndClose=function(){return e.save().then((function(t){t&&e.close()}))},e.submitAndSaveAndClose=function(){e.form.$submitted=!0,e.saveAndClose()},e.cancel=function(){return e.dirty=!1,b.isDefault()?(s.nextViewOptions({historyRoot:!0}),i.go("app.view_wallet")):i.go("app.view_wallet_by_id",{id:b.id})},e.close=function(){return b.isDefault()?(s.nextViewOptions({historyRoot:!0}),i.go("app.view_wallet",{refresh:!0})):i.go("app.view_wallet_by_id",{refresh:!0,id:b.id})},e.showAvatarModal=function(){return E.camera.enable?E.camera.getPicture().then((function(t){t&&(e.avatar={src:"data:image/png;base64,"+t},e.avatarStyle={"background-image":'url("'+t+'")'},e.dirty=!0)})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):m.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(t){t&&(e.avatar={src:t},e.avatarStyle={"background-image":'url("'+t+'")'},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(t){e.avatar.src=t,e.avatarStyle={"background-image":'url("'+t+'")'},e.dirty=!0,e.rotating=!1})).catch((function(t){console.error(t),e.rotating=!1}))},e.removeProfile=function(){return e.hideActionsPopover(),e.existing&&b.auth({minData:!0}).then((function(t){c.loading.hide(),c.alert.confirm("PROFILE.CONFIRM.DELETE",void 0,{okText:"COMMON.BTN_DELETE"}).then((function(i){if(i)return console.debug("[ES] [profile] Deleting user profile..."),p.remove(t.pubkey,{wallet:b}).then((function(){return b.isDefault()&&(t.name=null),t.profile=null,t.avatar=null,console.debug("[ES] [profile] Successfully deleted"),e.dirty=!1,e.close()})).then((function(){return n((function(){c.toast.show("PROFILE.INFO.PROFILE_REMOVED")}),750)})).catch(c.onError("PROFILE.ERROR.REMOVE_PROFILE_FAILED"))}))}))},e.showActionsPopover=function(t){c.popover.show(t,{templateUrl:"plugins/es/templates/user/edit_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function Te(e,t,n,i,a,o,r,s,l,c){var d,u=!1;e.search={loading:!0,results:[],hasMore:!1,loadingMore:!1,limit:40,type:"last",text:null,options:{}},e.fabButtonNewMessageId=void 0,e.enter=function(t,n){if(e.search.loading){if(!(d=n.stateParams&&n.stateParams.id?r.children.get(n.stateParams.id):r))return l.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome();e.isDefaultWallet=d.isDefault(),e.walletId=d.id,d.auth({minData:!0}).then((function(){e.entered||(e.entered=!0,e.type=e.type||n.stateParams&&n.stateParams.type||"inbox",e.load()),e.fabButtonNewMessageId&&e.showFab(e.fabButtonNewMessageId)})).catch((function(t){"CANCELLED"===t&&(i.nextViewOptions({historyRoot:!0}),e.showHome())}))}else e.updateView()},e.$on("$ionicView.enter",e.enter),e.load=function(t,n,i){var a=angular.copy(e.search.options);return a.from=a.from||t||0,a.size=a.size||n||40,a.type=e.type,a.summary=!1,a.filter="text"==e.search.type&&e.search.text&&e.search.text.trim().length>0?e.search.text:void 0,a.wallet=d,e.search.loading=!i,c.load(a).then((function(t){a.from?t&&(e.search.results=e.search.results.concat(t)):e.search.results=t||[],l.loading.hide(),e.search.loading=!1,e.search.hasMore=e.search.results&&e.search.results.length>=e.search.limit,e.updateView()})).catch((function(t){e.search.loading=!1,a.from||(e.search.results=[]),e.search.hasMore=!1,l.onError("MESSAGE.ERROR.LOAD_MESSAGES_FAILED")(t)}))},e.updateView=function(){e.motion&&e.motion.ionListClass&&e.search.results.length&&e.motion.show({selector:".view-messages .list .item"}),e.$broadcast("$$rebind::rebind")},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,!0).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.markAllAsRead=function(){e.hideActionsPopover(),e.search.results&&e.search.results.length&&l.alert.confirm("MESSAGE.CONFIRM.MARK_ALL_AS_READ").then((function(t){t&&c.markAllAsRead().then((function(){_.forEach(e.search.results,(function(e){e.read=!0}))})).catch(l.onError("MESSAGE.ERROR.MARK_ALL_AS_READ_FAILED"))}))},e.delete=function(t){var n=e.search.results[t];n&&l.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(i){i&&c.remove(n.id,e.type,{walletId:e.walletId}).then((function(){e.search.results.splice(t,1),e.updateView(),l.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(l.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))},e.deleteAll=function(){e.hideActionsPopover(),e.search.results&&e.search.results.length&&l.alert.confirm("MESSAGE.CONFIRM.REMOVE_ALL").then((function(t){t&&c.removeAll(e.type,{walletId:e.walletId}).then((function(){e.search.results.splice(0,e.search.results.length),e.updateView(),l.toast.show("MESSAGE.INFO.All_MESSAGE_REMOVED")})).catch(l.onError("MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED"))}))},e.doSearchLast=function(){return e.search.type="last",e.search.loadingMore=!1,e.search.limit=40,e.load()},e.doSearch=function(){if(e.search.text&&!(e.search.text.length<3))return e.search.type="text",e.search.loadingMore=!1,e.search.results=[],e.search.limit=40,console.debug("[message] [{0}] Searching for: {1}".format(e.type,e.search.text)),e.load()},e.refresh=function(t){return u=!0,e.load(void 0,void 0,t).then((function(){u=!1})).catch((function(){u=!1}))},e.select=function(n,i){if(!(i.isDefaultPrevented()||e.search.loading||u))return o((function(){if(!u&&!i.isDefaultPrevented())return i.preventDefault(),"default"===e.walletId?t.go("app.user_view_message",{type:e.type,messageId:n.id}):t.go("app.user_view_message_by_id",{type:e.type,messageId:n.id,id:e.walletId})}),200)},e.showNewMessageModal=function(t){return d.login({minData:!0}).then((function(){return l.loading.hide(),(t=t||{}).wallet=e.walletId,s.showMessageCompose(t).then((function(e){e&&l.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.showReplyModal=function(t){var i=e.search.results[t];i&&n("MESSAGE.REPLY_TITLE_PREFIX").then((function(t){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||i.uid,title:t+i.title,content:n,isReply:!0,wallet:e.walletId})})).then((function(e){e&&l.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))},e.showActionsPopover=function(t){l.popover.show(t,{templateUrl:"plugins/es/templates/message/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.onMessageDelete=function(t){var n=_.findIndex(e.search.results,(function(e){return e.id==t}));n&&e.search.results.splice(n,1),e.updateView()},c.api.data.on.delete(e,e.onMessageDelete),e.onNewOutboxMessage=function(t){if("outbox"===e.type)return e.search.loading=!0,o((function(){return c.get(t,e.type,{summary:!0,wallet:d})}),500).then((function(t){e.search.results.splice(0,0,t),e.search.loading=!1,e.updateView()})).catch((function(){e.loading=!1}))},c.api.data.on.sent(e,e.onNewOutboxMessage),e.onNewInboxMessage=function(t){if("inbox"===e.type&&e.entered&&d.isUserPubkey(t.issuer))return e.search.loading=!0,c.get(t.id,e.type,{summary:!0,wallet:d}).then((function(t){e.search.results.splice(0,0,t),e.search.loading=!1,e.updateView()})).catch((function(){e.search.loading=!1}))},c.api.data.on.new(e,e.onNewInboxMessage),e.onUnauth=function(){e.search.results=void 0,e.search.loading=!1,e.entered=!1},r.api.data.on.unauth(e,e.onUnauth)}function ve(e,t){angular.extend(this,t("ESMessageAbstractListCtrl",{$scope:e})),e.type="inbox",e.fabButtonNewMessageId="fab-add-message-record-inbox"}function Ie(e,t){angular.extend(this,t("ESMessageAbstractListCtrl",{$scope:e})),e.type="outbox",e.fabButtonNewMessageId="fab-add-message-record-outbox"}function Oe(e,t){angular.extend(this,t("ESMessageComposeModalCtrl",{$scope:e,parameters:{}})),e.enter=function(t,n){return n&&n.stateParams&&e.setParameters(n.stateParams),e.load().then(UIUtils.loading.hide)},e.$on("$ionicView.enter",e.enter),e.cancel=function(){e.sending=!1,e.showHome()},e.setForm=function(t){e.form=t},e.closeModal=function(){e.sending=!1,e.showHome()}}function Ne(e,t,n,i,a,o,r){var s;e.formData={title:null,content:null,destPub:null,walletId:null},e.destUid=null,e.destPub=null,e.isReply=!1,e.enableSelectWallet=!0,e.sending=!1,e.setParameters=function(t){t&&((t.pubkey||t.destPub)&&(e.formData.destPub=t.pubkey||t.destPub,t.uid||t.destUid?(e.destUid=t.uid||t.destUid,e.destPub=""):(e.destUid="",e.destPub=e.formData.destPub)),t.title&&(e.formData.title=t.title),t.content&&(e.formData.content=t.content),e.isReply=t.isReply||!1,t.wallet&&(e.formData.walletId=t.wallet))},e.setParameters(r),e.load=function(){return e.enableSelectWallet=i.children.count()>0,(s=e.enableSelectWallet&&(e.formData.walletId?i.children.get(e.formData.walletId):i)||i).isDefault()?console.debug("[message] Using default wallet"):console.debug("[message] Using {"+s.id+"} wallet"),s.login({minData:!0,silent:!0}).then((function(t){e.walletData=t})).catch((function(t){"CANCELLED"===t&&e.cancel()}))},e.$on("modal.shown",e.load),e.doSend=function(t){if(e.form.$submitted=!0,e.form.$valid){if(!(t||e.formData.content&&e.formData.content.trim().length))return n.alert.confirm("MESSAGE.COMPOSE.CONTENT_CONFIRMATION").then((function(t){t&&e.doSend(!0)}));e.sending=!0,n.loading.show();var i={issuer:s.data.pubkey,recipient:e.formData.destPub,title:e.formData.title,content:e.formData.content,time:moment().utc().unix()};o.send(i,{wallet:s}).then((function(t){e.id=t,n.loading.hide(),e.closeModal(t)})).catch((function(t){e.sending=!1,"CANCELLED"!==t?n.onError("MESSAGE.ERROR.SEND_MSG_FAILED")(t):n.loading.hide()}))}},e.cancel=function(){e.closeModal()},e.showWotLookupModal=function(){t.showWotLookup().then((function(t){t&&(t.uid?(e.destUid=t.uid,e.destPub=""):(e.destUid="",e.destPub=t.pubkey),e.destName=t.name||t.uid,e.formData.destPub=t.pubkey)}))},e.showSelectWalletModal=function(){if(e.enableSelectWallet)return t.showSelectWallet({showDefault:!0,showBalance:!1}).then((function(t){!t||s&&s.id===t.id||(s=t,e.walletData=s.data,console.debug("[message] Using {"+s.id+"} wallet"))}))}}function Re(e,t,n,i,a,o,r,s,l,c){var d;e.formData={},e.id=null,e.loading=!0,e.$on("$ionicView.beforeEnter",(function(e,t){t.enableBack=!!r.screen.isSmall()||t.enableBack})),e.enter=function(t,i){if(e.loading){if(!(d=i.stateParams&&i.stateParams.id?c.children.get(i.stateParams.id):c))return r.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome();e.isDefaultWallet=d.isDefault(),e.walletId=d.id;var a=i.stateParams&&i.stateParams.messageId;if(e.type=i.stateParams.type||"inbox",angular.isUndefined(a))return void e.goBack();d.auth({minData:!0}).then((function(){return e.load(a,e.type)})).then((function(t){r.loading.hide(),t&&(e.updateView(t),e.showFab("fab-view-message-reply"),t.read||n((function(){e.id===t.id&&l.markAsRead(t,{type:e.type,wallet:d}).then((function(){console.debug("[message] marked as read")})).catch(r.onError("MESSAGE.ERROR.MARK_AS_READ_FAILED"))}),2e3))}))}},e.$on("$ionicView.enter",e.enter),e.load=function(t,n){return n=n||"inbox",l.get(t,n,{wallet:d}).catch(r.onError("MESSAGE.ERROR.LOAD_MESSAGE_FAILED")).then((function(t){return t.valid?t:r.alert.error(e.isUserPubkey(t.recipient)?"MESSAGE.ERROR.NOT_AUTHENTICATED_MESSAGE":"MESSAGE.ERROR.USER_NOT_RECIPIENT","MESSAGE.ERROR.MESSAGE_NOT_READABLE").then((function(){e.goBack(!0)}))}))},e.updateView=function(t){e.loading=!1,e.id=t.id,e.formData=t,e.canDelete=!0,e.motion.show({selector:".view-message .list .item"})},e.delete=function(){e.actionsPopover&&e.actionsPopover.hide(),r.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(t){if(t)return l.remove(e.id,e.type,{wallet:d}).then((function(){e.goBack(!0),r.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))},e.goBack=function(n){n&&a.clearCache(a.currentView().stateId),a.nextViewOptions({historyRoot:!0}),e.isDefaultWallet?e.type&&t.go("app.user_message.tab_"+e.type,{type:e.type}):e.type&&t.go("app.user_messages_by_id.tab_"+e.type,{type:e.type,id:e.walletId})},e.showActionsPopover=function(t){r.popover.show(t,{templateUrl:"plugins/es/templates/message/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showReplyModal=function(){var t="inbox"===e.type?"issuer":"recipient";i("MESSAGE.REPLY_TITLE_PREFIX").then((function(n){var i=e.formData.content?e.formData.content.replace(/^/g," > "):null;return i=(i=i?i.replace(/\n/g,"\n > "):null)?i+"\n":null,s.showMessageCompose({destPub:e.formData[t],destUid:e.formData.name||e.formData.uid,title:n+e.formData.title,content:i,isReply:!0,walletId:d.id})})).then((function(e){e&&r.toast.show("MESSAGE.INFO.MESSAGE_SENT").then((function(){a.goBack()}))}))}}function Ae(e,t,n,i,a,o,r,s){var l;e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40},e.$on("popover.shown",(function(){e.search.loading&&((l=e.walletId&&i.children.get(e.walletId)||i).isDefault()&&(l.api.data.on.logout(e,e.resetData),o.api.data.on.new(e,e.onNewMessageNotification)),e.load())})),e.load=function(n,i){var a={};return a.from=n||0,a.size=i||40,o.notifications.load(a).then((function(t){e.search.results=n?e.search.results.concat(t):t,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,n||(e.search.results=[]),e.search.hasMore=!1,t.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(t){e.search.loading||e.search.loadingMore||l.isUserPubkey(t.issuer)&&(e.search.results.splice(0,0,t),e.updateView())},e.select=function(t){t.read||(t.read=!0),"default"===e.walletId?n.go("app.user_view_message",{messageId:t.id}):n.go("app.user_view_message_by_id",{messageId:t.id,id:e.walletId}),e.closePopover(t)},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(n){e.closePopover(),s((function(){(n=n||{}).walletId=l.id,r.showMessageCompose(n).then((function(e){e&&t.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}),500)},a.api.node.on.stop(e,e.resetData),a.api.node.on.start(e,e.load)}function Se(e,t,n,i,a,o,r,s){var l;e.preventSelect=!1,e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40,options:{codes:{excludes:s.constants.EXCLUDED_CODES}}},e.listeners=[],e.setWallet=function(e){l=e},e.$on("$ionicView.enter",(function(t,n){if(e.search.loading){if(!(l=n.stateParams&&n.stateParams.id?r.children.get(n.stateParams.id):r))return a.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome();l.login({minData:!0}).then((function(){return e.load(),a.loading.hide(),e.addListeners(),i((function(){e.resetUnreadCount()}),1e3)}))}})),e.refresh=function(t){return e.load(void 0,void 0,t)},e.load=function(t,n,i){if((l=l||r).data.pubkey){e.search.preventSelect=!0;var o=angular.copy(e.search.options);return o.from=o.from||t||0,o.size=o.size||n||40,o.pubkey=l.data.pubkey,e.search.loading=!i,s.load(o).then((function(t){o.from?t&&(e.search.results=e.search.results.concat(t)):e.search.results=t||[],e.search.loading=!1,e.search.preventSelect=!1,e.search.hasMore=e.search.results.length>=e.search.limit,e.updateView()})).catch((function(t){e.search.loading=!1,o.from||(e.search.results=[]),e.search.preventSelect=!1,e.search.hasMore=!1,a.onError("COMMON.NOTIFICATIONS.LOAD_NOTIFICATIONS_FAILED")(t)}))}e.search.loading=!0},e.updateView=function(){e.motion&&e.motion.ionListClass&&e.search.results.length&&e.motion.show({selector:".view-notification .item"})},e.markAllAsRead=function(){if(e.hideActionsPopover(),!l.isAuth())return l.auth().then((function(){return a.loading.hide(),e.markAllAsRead()}));e.search.results.length&&a.loading.show().then((function(){l.data.notifications.unreadCount=0;var t=e.search.results[0];return l.data.notifications.time=t?t.time:0,_.forEach(e.search.results,(function(e){e.markAsRead&&"function"==typeof e.markAsRead&&e.markAsRead()})),a.loading.hide()}))},e.resetUnreadCount=function(){if(e.search.loading||!l.data.notifications)return i(e.resetUnreadCount,2e3);if(l.data.notifications.unreadCount&&e.search.results&&e.search.results.length){l.data.notifications.unreadCount=0;var t=e.search.results[0],n=t.time?t.time:0;!n||l.data.notifications.time&&l.data.notifications.time==n||(l.data.notifications.time=n,l.storeData())}},e.select=function(t,a){e.search.loading||t.preventDefault()||e.search.preventSelect||(a.markAsRead&&"function"==typeof a.markAsRead&&i(a.markAsRead),a.state&&n.go(a.state,a.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(t){if(!e.search.loading&&!e.search.loadingMore){var n=_.findIndex(e.search.results,(function(e){return t.time>e.time}));n<0&&(n=0),e.search.results.splice(n,0,t),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(t){a.popover.show(t,{templateUrl:"plugins/es/templates/notification/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.addListeners=function(){if(!l)throw"Controller wallet not set !";e.listeners=[o.api.node.on.stop(e,e.resetData),o.api.node.on.start(e,e.load),l.api.data.on.logout(e,e.resetData)],l.isDefault()&&e.listeners.push(s.api.data.on.new(e,e.onNewNotification))},e.removeListeners=function(){_.forEach(e.listeners,(function(e){e()})),e.listeners=[]}}function Ce(e,t,n,i,a,o){angular.extend(this,n("NotificationsCtrl",{$scope:e})),e.motion=null,e.setWallet(o),e.$on("popover.shown",(function(){e.search.loading&&(e.addListeners(),e.load())})),e.updateView=function(){e.search.results.length&&t((function(){a.ink({selector:".popover-notification .item.ink"})}),100)},e.$on("popover.hidden",e.resetUnreadCount),e.select=function(t,n){!t.preventDefault()&&n&&(n.markAsRead&&"function"==typeof n.markAsRead&&n.markAsRead(),n.state&&i.go(n.state,n.stateParams),e.closePopover(n))}}function Le(e,t,n,i,a,o){angular.extend(this,t("BlockLookupCtrl",{$scope:e})),e.search.text=null,e.search.type="last",e.search.sort=void 0,e.search.asc=!0,e.searchTextId="blockchainSearchText",e.compactMode=!0,e.enableFilter=!0,e.doSearchText=function(){if(!(e.search.text&&e.search.text.trim().length||e.search.filters&&e.search.filters.length))return e.doSearchLast();e.search.type="text",e.doSearch(),i.search({q:e.search.query}).replace()},e.doSearchLast=function(){e.hideActionsPopover(),e.search.type="last",e.search.sort=void 0,e.doSearch(),i.search({q:void 0}).replace()},e.doSearch=function(t){if(!e.search.error){var n;t=angular.isDefined(t)?t:0;var i={};if(e.search.loading=0===t,i.size=e.defaultSizeLimit,"last"==e.search.type)i.from=0===t?0:t+1,e.search.sort?(i.sort={},i.sort[e.search.sort]=e.search.asc?"asc":"desc"):i.sort={number:"desc"},i.excludeCurrent=0===t,n=o.block.search(e.currency,i);else if("text"==e.search.type){var r=o.block.parseSearchText(e.search.text,e.search.filters);e.search.filters=r.filters;var s=e.search.filters.reduce((function(e,t){return e+" AND "+t.text}),"");r.text.length&&(s+=" AND "+r.text),e.search.query=s.substr(5),e.search.text=r.text,i.from=t,e.search.sort?i.sort=e.search.sort+":"+(e.search.asc?"asc":"desc"):i.sort="number:desc",i.excludeCurrent=!0,n=o.block.searchText(e.currency,e.search.query,i)}var l=Date.now();return n.then((function(t){return e.doPrepareResult(t.hits).then((function(){return t}))})).then((function(n){e.showPubkey="issuer"==e.search.sort,e.search.took=0===t?Date.now()-l:e.search.took;var i=0===t?n.total:e.search.total;e.doDisplayResult(n.hits,t,i),e.search.loading=!1})).catch((function(t){e.search.error=!0,e.search.loading=!1,a.onError("BLOCKCHAIN.ERROR.SEARCH_BLOCKS_FAILED")(t).then((function(){e.search.error=!1}))}))}},e.toggleSort=function(t){e.search.sort!==t||e.search.asc?(e.search.asc=e.search.sort!==t||!e.search.asc,e.search.sort=t):(e.search.asc=void 0,e.search.sort=void 0),e.doSearch()},e.showHelpTip=function(){},e.showActionsPopover=function(t){a.popover.show(t,{templateUrl:"plugins/es/templates/blockchain/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.itemRemove=function(t){e.search.filters.splice(t,1),e.doSearchText()},e.toggleShowQuery=function(){e.showQuery=!e.showQuery}}function De(e,t,n,i,a,o,r,s,l,c,d,u,p){e.networkStarted=!1,e.ionItemClass="",e.expertMode=c.data.expertMode&&!s.screen.isSmall(),e.isHttps="https:"===a.location.protocol,e.search={text:"",loading:!0,online:!0,results:[],endpointFilter:r.constants.ES_USER_API,sort:void 0,asc:!0},e.compactMode=!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(t,n){e.networkStarted||(e.networkStarted=!0,e.search.loading=!0,d.get().then((function(t){t&&(e.node=r.node.same(t.node.host,t.node.port)?r:r.instance(t.node.host,t.node.port),n&&n.stateParams&&("true"===n.stateParams.online&&(e.search.online=!0),n.stateParams.expert&&(e.expertMode="true"==n.stateParams.expert)),e.load())})).catch((function(t){s.onError("ERROR.GET_CURRENCY_FAILED")(t),e.networkStarted=!1})))},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.networkStarted&&(e.removeListeners(),u.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&&(u.start(e.node,e.computeOptions()),e.refreshing=!1,e.listeners.push(u.api.data.on.changed(e,(function(t){e.refreshing||(e.refreshing=!0,p.extendAll(t.peers).then((function(){e.networkStarted&&e.updateView(t),e.refreshing=!1})))}))))},e.updateView=function(t){console.debug("[peers] Updating UI"),e.$broadcast("$$rebind::rebind"),e.search.results=t.peers,e.search.memberPeersCount=t.memberPeersCount,e.search.loading=!e.networkStarted||u.isBusy(),e.loading||e.$broadcast("$$rebind::rebind"),e.motion&&e.search.results&&e.search.results.length>0&&e.motion.show({selector:".item-peer"})},e.refresh=function(){e.search.loading=!0,u.loadPeers()},e.sort=function(){e.search.loading=!0,e.refreshing=!0,u.sort(e.computeOptions()),e.updateView(u.data)},e.toggleOnline=function(t){e.hideActionsPopover(),e.search.online=!1!==t,u.close(),e.search.loading=!0,e.load(),e.enableLocationHref&&n.search(e.search.online?{}:{online:!1}).replace()},e.toggleSearchEndpoint=function(t){e.hideActionsPopover(),e.search.endpointFilter===t||null===t?e.search.endpointFilter=null:e.search.endpointFilter=t,e.sort()},e.toggleSort=function(t){e.search.sort!==t||e.search.asc?(e.search.asc=e.search.sort!==t||!e.search.asc,e.search.sort=t):(e.search.asc=void 0,e.search.sort=void 0),e.sort()},e.selectPeer=function(n){if(n.compacted&&e.compactMode)e.toggleCompactMode();else if(n.online){var i={server:n.getServer()};n.isSsl()&&(i.ssl=!0),n.isTor()&&(i.tor=!0),t.go("app.view_es_peer",i)}},e.$on("csView.action.refresh",(function(t,n){"peers"===n&&e.refresh()})),e.$on("csView.action.showActionsPopover",(function(t,n){e.showActionsPopover(n)})),e.showActionsPopover=function(t){s.popover.show(t,{templateUrl:"plugins/es/templates/network/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showEndpointsPopover=function(e,t,n){e.preventDefault(),e.stopPropagation();var i=t.getEndpoints(n);(i=(i||[]).reduce((function(e,n){var i=r.node.parseEndPoint(n);return e.concat({label:"NETWORK.VIEW.NODE_ADDRESS",value:t.getServer()+(i.path||"")})}),[])).length&&s.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS."+n,items:i}})},e.showWs2pPopover=function(e,t){return e.stopPropagation(),o("NETWORK.VIEW.PRIVATE_ACCESS").then((function(n){s.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:t.bma.private?n:t.getServer()+(t.bma.path||"")},{label:"NETWORK.VIEW.WS2PID",value:t.bma.ws2pid},{label:"NETWORK.VIEW.POW_PREFIX",value:t.powPrefix}]}})}))}}function ye(e,t,n){angular.extend(this,t("ESNetworkLookupCtrl",{$scope:e})),n=n||{},e.enableFilter=!angular.isDefined(n.enableFilter)||n.enableFilter,e.search.type=angular.isDefined(n.type)?n.type:e.search.type,e.search.endpointFilter=angular.isDefined(n.endpointFilter)?n.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(n.expertMode)?n.expertMode:e.expertMode,e.ionItemClass=n.ionItemClass||"item-border-large",e.enableLocationHref=!1,e.helptipPrefix="",e.selectPeer=function(t){e.closeModal(t)},e.$on("modal.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function Pe(e,t){angular.extend(this,t("NetworkLookupCtrl",{$scope:e}));var n=n||{};e.enableFilter=!angular.isDefined(n.enableFilter)||n.enableFilter,e.search.type=angular.isDefined(n.type)?n.type:e.search.type,e.search.endpointFilter=angular.isDefined(n.endpointFilter)?n.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(n.expertMode)?n.expertMode:e.expertMode,e.ionItemClass=n.ionItemClass||"item-border-large",e.helptipPrefix="",e.selectPeer=function(t){e.closePopover(t)},e.$on("popover.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function ke(e,t,n,i,a,o){e.loading=!0,e.formData={},e.load=function(){return e.loading=!0,e.formData={},t.all([o.blockchain.current().then((function(t){e.formData.number=t.number,e.formData.medianTime=t.medianTime,e.formData.powMin=t.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(t){e.formData.version=t&&t.duniter&&t.duniter.version,e.formData.software=t&&t.duniter&&t.duniter.software})).catch((function(){delete e.formData.version,delete e.formData.software})),o.version.latest().then((function(t){e.formData.latestRelease=t})).catch((function(){delete e.formData.latestRelease}))]).then((function(){if(e.formData.latestRelease&&"cesium-plus-pod"===e.formData.software){var t=a.version.compare(e.formData.version,e.formData.latestRelease.version);e.formData.isPreRelease=t>0,e.formData.hasNewRelease=t<0}else e.formData.isPreRelease=!1,e.formData.hasNewRelease=!1;e.loading=!1,e.$broadcast("$$rebind::rebind")}))},i.api.data.on.newBlock(e,(function(t){e.loading||(console.debug("[peer info] Received new block. Reload content"),e.load())})),n.api.data.on.changed(e,(function(t){e.loading||(console.debug("[peer info] Peer settings changed. Reload content"),e.load())})),e.load()}function Me(e,t,n,i,a,o,r,s,l){e.node={},e.loading=!0,e.isHttps="https:"===n.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,t){t.enableBack=!!a.screen.isSmall()||t.enableBack})),e.$on("$ionicView.enter",(function(t,n){var i=!n.stateParams||!n.stateParams.server,a=n.stateParams&&n.stateParams.server||r.server,o=n.stateParams&&"true"==n.stateParams.ssl||!!i&&r.useSsl,s="true"==n.stateParams.tor||!!i&&r.useTor;return e.load(a,o,s).then((function(){return e.$broadcast("$csExtension.enter",t,n)})).then((function(){e.loading=!1})).catch((function(){e.loading=!1}))})),e.load=function(n,i,l){var c={server:n,host:n,useSsl:i,useTor:l},d=n.split(":");return 2===d.length&&(c.host=d[0],c.port=d[1]),c.url=s.getUrl(c.host,c.port,void 0,c.useSsl),angular.merge(e.node,l?r.lightInstance(c.host+".to",443,443,!0,6e4):r.lightInstance(c.host,c.port,c.useSsl),c),e.isReachable=!e.isHttps||i,e.isReachable?t.all([e.node.network.peering.self().then((function(t){e.node.pubkey=t.pubkey,e.node.currency=t.currency})),e.node.record.count(e.options.document.index,e.options.document.type).then((function(t){e.node.docCount=t})),e.node.network.peers().then((function(t){var n=t.peers.reduce((function(e,t){var n=new X(t);return n.hasEsEndpoint()?(n.online="UP"===t.status,n.blockNumber=n.block.replace(/-.+$/,""),n.ep=r.node.parseEndPoint(n.getEsEndpoints()[0]),n.dns=n.getDns(),n.id=n.keyID(),n.server=n.getServer(),e.concat(n)):e}),[]);return o.extendAll([e.node].concat(n)).then((function(){e.peers=_.sortBy(n,(function(e){var t=1;return t+=1e4*(e.online?1:0),t+=1e3*(e.hasMainConsensusBlock?1:0),-(t+=100*(e.name?1:0))})),e.motion.show({selector:".item-peer"})}))})),e.node.blockchain.current().then((function(t){e.current=t}))]).catch(a.onError(l?"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR":"PEER.VIEW.ERROR.LOADING_NODE_ERROR")):r.network.peers().then((function(t){var n=(t&&t.peers||[]).reduce((function(e,t){var n=new X(t);if(!n.hasEsEndpoint())return e;var i=r.node.parseEndPoint(n.getEsEndpoints()[0]);return i.dns!=c.host&&i.ipv4!=c.host&&i.ipv6!=c.host||i.port!=c.port?e:(n.ep=i,e.concat(n))}),[]),i=n.length&&n[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 t={server:e.getServer()};e.isSsl()&&(t.ssl=!0),e.isTor()&&(t.tor=!0),i.go("app.view_es_peer",t)}},e.openRawPeering=function(t){return e.openLink(t,e.node.url+"/network/peering?pretty")},e.openRawCurrentBlock=function(t){return e.openLink(t,e.node.url+"/network/peering?pretty")}}function we(e,t,n,i,a,o){e.search={loading:!0,results:null,type:"last",hasMore:!1,loadingMore:!1,limit:40},e.enableFilter=!t.screen.isSmall(),e.ionItemClass="item-border-large",e.$on("$ionicView.enter",(function(){e.search.loading&&e.doSearch()})),e.doSearchText=function(){var t=e.search.text&&e.search.text.trim();return t&&t.length?(e.search.type="text",e.doSearch()):e.doSearchLast()},e.doSearchLast=function(){return e.search.type="last",e.doSearch()},e.doSearch=function(n,i){var o={};return o.from=n||0,o.size=i||40,o.text="text"==e.search.type&&e.search.text&&e.search.text.trim(),e.search.loading=!0,a.record.search(o).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(i){e.search.loading=!1,n||(e.search.results=[]),e.search.hasMore=!1,t.onError("GROUP.ERROR.SEARCH_GROUPS_FAILED")(i)}))},e.updateView=function(){e.$broadcast("$$rebind::rebind"),e.motion.show({selector:".list.{0} .item".format(e.motion.ionListClass)})},e.select=function(e){e&&e.id&&n.go("app.view_group",{id:e.id})},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.resetData=function(){e.search.loading||(console.debug("[ES] [group] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},i.api.data.on.logout(e,e.resetData),e.showNewRecordModal=function(){e.loadWallet({minData:!0}).then((function(i){t.loading.hide(),e.walletData=i,o.show("plugins/es/templates/group/modal_record_type.html").then((function(e){e&&n.go("app.add_group",{type:e})}))}))}}function Ue(e,t,n,i,a,o,r,s,l){e.formData={},e.id=null,e.pictures=[],e.canEdit=!1,e.loading=!0,e.motion=o.motion.fadeSlideIn,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),o.loading.hide(),e.$broadcast("$recordView.enter",i)):t.go("app.groups")})),e.load=function(t){s.record.load(t,{fetchPictures:!0}).then((function(n){e.id=n.id,e.formData=n.record,e.issuer=n.issuer,e.canEdit=l.isUserPubkey(e.formData.issuer)||l.children.hasPubkey(e.formData.issuer),e.pictures=n.record.pictures||[],delete n.record.pictures,e.$broadcast("$recordView.load",t,s.record.comment),e.loading=!1,o.loading.hide(),e.updateView()})).catch(o.onError("GROUP.ERROR.LOAD_RECORD_FAILED"))},e.updateView=function(){e.motion.show()},e.edit=function(){o.loading.show(),t.go("app.edit_group",{id:e.id})},e.delete=function(){var n;e.hideActionsPopover(),a(["GROUP.VIEW.REMOVE_CONFIRMATION","GROUP.INFO.RECORD_REMOVED"]).then((function(e){return n=e,o.alert.confirm(e["GROUP.VIEW.REMOVE_CONFIRMATION"])})).then((function(a){a&&s.record.remove(e.id).then((function(){i.nextViewOptions({historyRoot:!0}),t.go("app.groups"),o.toast.show(n["GROUP.INFO.RECORD_REMOVED"])})).catch(o.onError("GROUP.ERROR.REMOVE_RECORD_FAILED"))}))},e.showActionsPopover=function(t){o.popover.show(t,{templateUrl:"plugins/es/templates/group/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showSharePopover=function(n){e.hideActionsPopover();var i=e.formData.title,a=(r.shareBaseUrl||$rootScope.rootPath)+t.href("app.view_group",{id:e.id});o.screen.isSmall()&&(n=angular.element(document.querySelector("#group-share-anchor-"+e.id))||n),o.popover.share(n,{bindings:{url:a,titleKey:"GROUP.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:i},time:e.formData.time,postMessage:i}})}}function xe(e,t,n,i,a,o,r,s,l,c){e.walletData={},e.formData={},e.id=null,e.pictures=[],e.loading=!0,e.setForm=function(t){e.form=t},e.$on("$ionicView.enter",(function(t,i){e.loadWallet({minData:!0}).then((function(t){e.walletData=t,i.stateParams&&i.stateParams.id?e.load(i.stateParams.id):(i.stateParams&&i.stateParams.type&&(e.formData.type=i.stateParams.type),e.loading=!1,n.loading.hide(),e.updateView()),l("group-record-title")}))})),e.load=function(i){t.record.load(i,{fetchPictures:!0,html:!1}).then((function(t){e.formData=t.record,e.issuer=t.issuer,e.id=t.id,e.pictures=t.record.pictures||[],delete t.record.pictures,e.loading=!1,n.loading.hide(),e.updateView()})).catch(n.onError("GROUP.ERROR.LOAD_RECORD_FAILED"))},e.updateView=function(){e.motion.show({selector:".list.{0} .item, .card-gallery".format(e.motion.ionListClass)})},e.save=function(){if(e.form.$submitted=!0,!e.saving&&e.form.$valid&&("managed"===e.formData.type||"open"===e.formData.type))return e.saving=!0,n.loading.show().then((function(){var t=e.formData;return t.time=moment().utc().unix(),t.picturesCount=e.pictures.length,t.picturesCount>0?(t.pictures=e.pictures.reduce((function(e,t){return e.concat({file:c.image.toAttachment(t)})}),[]),n.image.resizeSrc(e.pictures[0].src,!0).then((function(e){return t.avatar=c.image.toAttachment({src:e}),t}))):(t.avatar&&(t.avatar={_content:"",_content_type:""}),t.pictures=[],t)})).then((function(n){return e.id?t.record.update(n,{id:e.id}):(n.creationTime=moment().utc().unix(),t.record.add(n))})).then((function(t){return e.id=e.id||t,e.saving=!1,r.clearCache(r.currentView().stateId),r.nextViewOptions({historyRoot:!0}),i.go("app.view_group",{id:e.id,refresh:!0})})).catch((function(t){e.saving=!1,n.onError("GROUP.ERROR.SAVE_RECORD_FAILED")(t)}))},e.openPicturePopup=function(){o.camera.getPicture().then((function(t){e.pictures.push({src:"data:image/png;base64,"+t})})).catch(n.onError("ERROR.TAKE_PICTURE_FAILED"))},e.fileChanged=function(t){return n.loading.show(),a((function(i,a){var o=t.target.files[0];n.image.resizeFile(o).then((function(t){e.pictures.push({src:t}),n.loading.hide(),i()}))}))},e.removePicture=function(t){e.pictures.splice(t,1)},e.favoritePicture=function(t){if(t>0){var n=e.pictures[t];e.pictures.splice(t,1),e.pictures.splice(0,0,n)}},e.cancel=function(){r.goBack()},e.showRecordTypeModal=function(){s.show("plugins/es/templates/group/modal_record_type.html").then((function(t){t&&(e.formData.type=t)}))}}function Be(e,t,n,i,a,o,r,s,l,c,d){var u,p=d.constants.DEFAULT_LOAD_SIZE;e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:p,options:{codes:{includes:c.constants.INVITATION_CODES}}},e.setWallet=function(e){u=e},e.$on("$ionicView.enter",(function(t,n){if(e.search.loading){if(!(u=n.stateParams&&n.stateParams.id?r.children.get(n.stateParams.id):r))return o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome();e.loadWallet({wallet:u,minData:!0}).then((function(){e.addListeners(),s.isAlive()&&(e.load(),e.resetUnreadCount(),e.showFab("fab-new-invitation"))}))}})),e.load=function(t,n){var i=angular.copy(e.search.options);return i.from=i.from||t||0,i.size=i.size||n||p,u=u||r,d.load(i,u.data.keypair).then((function(t){e.search.results=t,e.search.loading=!1,e.search.hasMore=e.search.results&&e.search.results.length>=e.search.limit,e.updateView(),o.loading.hide()})).catch((function(n){if("CANCELLED"===n)return e.cancel();e.search.loading=!1,t||(e.search.results=[]),e.search.hasMore=!1,o.onError("INVITATION.ERROR.LOAD_INVITATIONS_FAILED")(n)}))},e.cancel=function(){},e.updateView=function(){e.motion&&e.search.results&&e.search.results.length&&e.motion.show({selector:".view-invitation .item"})},e.$watchCollection("search.results",e.updateView),e.showMore=function(){e.search.limit=e.search.limit||p,e.search.limit=2*e.search.limit,e.search.limit<p&&(e.search.limit=p),e.search.loadingMore=!0,e.load(e.search.results.length,e.search.limit).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.onNewInvitation=function(t){e.search.loading||e.search.loadingMore||e.search.results[0]&&e.search.results[0]===t||e.search.results.splice(0,0,t)},e.resetData=function(){e.search.loading||(console.debug("[ES] [invitation] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},e.resetUnreadCount=function(){if(e.search.loading||!u.data.invitations)return a(e.resetUnreadCount,2e3);if(u.data.invitations.unreadCount&&(console.debug("[ES] [invitation] Resetting unread count"),u.data.invitations.unreadCount=0,e.search.results&&e.search.results.length)){var t=e.search.results[0],n=t.time?t.time:0;!n||u.data.invitations.readTime&&u.data.invitations.readTime==n||(u.data.invitations.readTime=n,u.storeData())}},e.deleteAll=function(n){if(e.hideActionsPopover(),e.search.results.length)return n?t.all([o.loading.show(),d.deleteAll(u.data.pubkey)]).then((function(){return e.search.results.splice(0,e.search.results.length),o.loading.hide()})).catch(o.onError("INVITATION.ERROR.REMOVE_ALL_INVITATIONS_FAILED")):o.alert.confirm("INVITATION.CONFIRM.DELETE_ALL_CONFIRMATION").then((function(t){if(t)return e.deleteAll(t)}))},e.delete=function(t){var n=e.search.results[t];if(n)return d.delete(n).then((function(){e.search.results[t]&&e.search.results[t]===n&&e.search.results.splice(t,1)})).catch(o.onError("INVITATION.ERROR.REMOVE_INVITATION_FAILED"))},e.accept=function(t){e.hideActionsPopover(),t.state&&i.go(t.state,t.stateParams||{})},e.showNewInvitationModal=function(){return e.hideActionsPopover(),a((function(){return l.showNewInvitation({})}),500)},e.showActionsPopover=function(t){o.popover.show(t,{templateUrl:"plugins/es/templates/invitation/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.addListeners=function(){if(!u)throw"Controller wallet not set !";e.listeners=[s.api.node.on.stop(e,e.resetData),s.api.node.on.start(e,e.load),u.api.data.on.logout(e,e.resetData)],u.isDefault()&&e.listeners.push(d.api.data.on.new(e,e.onNewInvitation))}}function He(e,t,n){angular.extend(this,t("InvitationsCtrl",{$scope:e})),e.motion=null,e.setWallet(n),e.$on("popover.shown",(function(){e.search.loading&&(e.addListeners(),e.load())})),e.updateView=function(){},e.$on("popover.hidden",e.resetUnreadCount),e.hideActionsPopover=function(){e.closePopover()},e.cancel=function(){e.closePopover()}}function Fe(e,t,n,i,a,o,r,s,l){var c;e.recipients=[],e.suggestions=[],e.formData={useComment:!1,walletId:null},e.enableSelectWallet=!0,e.setParameters=function(t){t&&(t.wallet&&"default"!==t.wallet?e.formData.walletId=t.wallet:e.formData.walletId=a.id)},e.setParameters(l),e.load=function(){return e.enableSelectWallet=a.children.count()>0,c=e.enableSelectWallet&&(e.formData.walletId?a.children.get(e.formData.walletId):a)||a,e.formData.walletId=c.id,c.isDefault()||console.debug("[transfer] Using {"+c.id+"} wallet"),c.login({sources:!0,silent:!0}).then((function(t){if(e.walletData=t,i.ink({selector:".modal-invitation .ink"}),e.destPub&&!e.destUid)return csWot.extend({pubkey:e.destPub}).then((function(t){e.destUid=t&&(t.name||t.uid),e.destUid&&(e.destPub=""),e.loading=!1}));e.loading=!1})).catch((function(t){if("CANCELLED"===t)return e.cancel();i.onError("ERROR.LOGIN_FAILED")(t)}))},e.$on("modal.shown",e.load),e.onUseCommentChanged=function(){e.formData.useComment||(e.formData.comment=null)},e.$watch("formData.useComment",e.onUseCommentChanged,!0),e.removeRecipient=function(t,n){e.recipients.splice(t,1),n.preventDefault()},e.removeSuggestion=function(t,n){e.suggestions.splice(t,1),n.preventDefault()},e.cancel=function(){e.closeModal()},e.doSend=function(){if(e.form.$submitted=!0,e.form.$valid&&e.recipients.length&&e.suggestions.length)return c.isLogin()?c.auth({silent:!0}).then((function(){return t.all([r.box.getKeypair(c.data.keypair),i.alert.confirm("INVITATION.CONFIRM.SEND_INVITATIONS_TO_CERTIFY",void 0,{okText:"COMMON.BTN_SEND"})])})).then((function(n){var a=n&&n[0],o=n&&n[1];if(a&&o){i.loading.show();var r=moment().utc().unix(),l=e.formData.useComment&&e.formData.comment&&e.formData.comment.trim();return t.all(e.recipients.reduce((function(t,n){return t.concat(e.suggestions.reduce((function(e,t){if(!t.uid||!t.pubkey)return console.error("Unable to send suggestion for this identity (no uid or pubkey)",t),e;var i={issuer:c.data.pubkey,recipient:n.pubkey,time:r,content:[t.uid,t.pubkey].join("-"),comment:l};return e.concat(s.send(i,{wallet:c,type:"certification"}))}),[]))}),[])).then((function(){return e.closeModal(),i.loading.hide()})).then((function(){i.toast.show("INVITATION.INFO.INVITATION_SENT")})).catch(i.onError("INVITATION.ERROR.SUGGEST_CERTIFICATIONS_FAILED"))}})):e.closeModal()},e.showSelectRecipientModal=function(t){if(!t.isDefaultPrevented())return n.showWotLookup({allowMultiple:!0,enableFilter:!0,title:"INVITATION.NEW.RECIPIENTS_MODAL_TITLE",help:"INVITATION.NEW.RECIPIENTS_MODAL_HELP",okText:"COMMON.BTN_OK",okType:"button-positive",selection:angular.copy(e.recipients)}).then((function(t){t&&(e.recipients=t)}))},e.showSelectSuggestionModal=function(t){if(!t.isDefaultPrevented())return n.showWotLookup({allowMultiple:!0,enableFilter:!0,title:"INVITATION.NEW.SUGGESTION_IDENTITIES_MODAL_TITLE",help:"INVITATION.NEW.SUGGESTION_IDENTITIES_MODAL_HELP",okText:"COMMON.BTN_OK",okType:"button-positive",selection:angular.copy(e.suggestions)}).then((function(t){t&&(e.suggestions=t)}))},e.showSelectWalletModal=function(){if(e.enableSelectWallet)return n.showSelectWallet().then((function(t){t&&e.formData.walletId!==t.id&&(console.debug("[transfer] Using {"+t.id+"} wallet"),e.wallet=t,e.walletData=t.data,e.formData.walletId=t.id,e.onAmountChanged())}))}}function We(e,t,n,i,a,o,r,s){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(t,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();l.auth({minData:!0}).then((function(){return o.loading.hide(),e.load()})).then((function(){e.showFab("fab-add-subscription-record")})).catch((function(t){if("CANCELLED"===t)return o.loading.hide(10),e.loading=!0,void n.goBack();o.onError("SUBSCRIPTION.ERROR.LOAD_SUBSCRIPTIONS_FAILED")(t)}))}},e.$on("$ionicView.enter",e.enter),e.load=function(){return e.loading=!0,s.record.load(l.data.pubkey,l.data.keypair).then((function(e){var t=_.groupBy(e||[],(function(e){return[e.type,e.recipient].join("|")}));return _.keys(t).reduce((function(e,n){var i=n.split("|");return e.concat({type:i[0],recipient:i[1],items:t[n]})}),[])})).then((function(e){return i.extendAll(e,"recipient")})).then(e.updateView).catch((function(t){o.loading.hide(10),t&&404==t.ucode?(e.updateView([]),e.existing=!1):o.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(t)}))},e.updateView=function(t){t&&(e.search.results=t),e.search.results&&e.search.results.length&&e.motion.show(),e.search.loading=!1},e.addSubscription=function(){e.showCategoryModal().then((function(t){if(t){if("email"===t.id)return e.showEmailModal();o.alert.notImplemented()}})).then((function(t){t&&(o.loading.show(),s.record.add(t,{wallet: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(t){var n,i=angular.copy(t);if("email"===t.type&&(n=e.showEmailModal(t)),n)return n.then((function(n){if(n)return o.loading.show(),t.id=i.id,s.record.update(t,l).then((function(){if(i.type!==t.type||i.recipient!==t.recipient)return e.removeFromUI(i),e.addToUI(t)})).then((function(){o.loading.hide(),e.updateView()})).catch(o.onError("SUBSCRIPTION.ERROR.UPDATE_SUBSCRIPTION_FAILED"))}))},e.deleteSubscription=function(t,n){if(t&&t.id){if(!n)return o.alert.confirm("SUBSCRIPTION.CONFIRM.DELETE_SUBSCRIPTION").then((function(n){if(n)return e.deleteSubscription(t,n)}));o.loading.show(),s.record.remove(t.id,{wallet:l}).then((function(){l.data.subscriptions=l.data.subscriptions||{count:1},l.data.subscriptions.count--,e.removeFromUI(t),o.loading.hide()})).catch(o.onError("SUBSCRIPTION.ERROR.DELETE_SUBSCRIPTION_FAILED"))}},e.removeFromUI=function(t){var n=_.findWhere(e.search.results,{type:t.type,recipient:t.recipient}),i=_.findIndex(n.items,t);i>=0&&n.items.splice(i,1),n.items.length||(i=_.findIndex(e.search.results,n),e.search.results.splice(i,1))},e.addToUI=function(n){e.search.results=e.search.results||[];var a=_.findWhere(e.search.results,{type:n.type,recipient:n.recipient});return a?(a.items.push(n),t.when(n)):(a={type:n.type,recipient:n.recipient,items:[]},i.extendAll([a],"recipient").then((function(){return a.items.push(n),e.search.results.push(a),n})))},e.showCategoryModal=function(){return s.category.all().then((function(e){return r.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 r.show("plugins/es/templates/subscription/modal_email.html","ModalEmailSubscriptionsCtrl",e,{focusFirstInput:!0})}}function Ve(e,t,n,i,a,o,r){e.frequencies=[{id:"daily",label:"daily"},{id:"weekly",label:"weekly"}],e.formData=r||{},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(t){if(t)return e.formData.recipient=t.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 t={type:"email",recipient:e.formData.recipient,content:{email:e.formData.content.email,locale:n.data.locale.id,frequency:e.formData.content.frequency}};e.closeModal(t)}},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(t){t&&(e.recipient=t,e.formData.recipient=t.pubkey)}))}}function Ge(e,t,n,i,a,o,r,s,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||(r.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.showHeaders=!angular.isDefined(e.showHeaders)||e.showHeaders,e.enter=function(t,n){e.entered||(e.entered=!0,e.search.index=n.stateParams&&n.stateParams.index||e.search.index,e.search.type=n.stateParams&&n.stateParams.type||e.search.type,e.search.text=n.stateParams&&n.stateParams.q||e.search.text,e.search.last=!e.search.text,e.load()),e.expertMode=angular.isDefined(e.expertMode)?e.expertMode:!r.screen.isSmall()&&a.data.expertMode},e.$on("$ionicView.enter",e.enter),e.computeOptions=function(t,n){var i={index:e.search.index,type:e.search.type,from:t||0,size:n||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(t,n,i){if(!e.search.error){var a=e.computeOptions(t,n);return e.search.loading=!i,(e.search.last?l.search(a):l.searchText(e.search.text||"",a)).then((function(n){t?e.search.results=e.search.results.concat(n.hits):(e.search.results=n.hits,e.search.took=n.took),e.search.total=n.total,r.loading.hide(),e.search.loading=!1,e.search.hasMore=n.hits&&n.hits.length>0&&n.total>e.search.results.length,e.updateView()})).catch((function(t){e.search.results=[],e.search.loading=!1,e.search.error=!0,e.search.hasMore=!1,r.onError("DOCUMENT.ERROR.LOAD_DOCUMENTS_FAILED")(t).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(){n.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 r.alert.confirm("DOCUMENT.CONFIRM.REMOVE_ALL").then((function(t){if(t)return r.loading.show(),l.removeAll(e.search.results).then((function(){return e.search.loading=!1,i((function(){return r.toast.show("DOCUMENT.INFO.REMOVED"),e.load()}),1e3)})).catch(r.onError("DOCUMENT.ERROR.REMOVE_ALL_FAILED"))}))},e.remove=function(t,n){var i=e.search.results[n];i&&!t.defaultPrevented&&(t.stopPropagation(),r.alert.confirm("DOCUMENT.CONFIRM.REMOVE").then((function(t){if(t)return l.remove(i).then((function(){e.search.results.splice(n,1),e.$broadcast("$$rebind::rebind"),r.toast.show("DOCUMENT.INFO.REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_FAILED"))})))},e.selectDocument=function(t,n){console.debug("Selected document: ",n,s);var i=s.getUrl("/{0}/{1}/_search?pretty&q=_id:{2}".format(n.index,n.type,n.id));return e.openLink(t,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(t){e.search.sort!==t||e.search.asc?(e.search.asc=e.search.sort!==t||!e.search.asc,e.search.sort=t):(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 t=Date.now(),n=e.search.index+"/"+e.search.type,i=s.websocket.changes(n);return i.open().then((function(){console.debug("[ES] [document] Websocket opened in {0} ms".format(Date.now()-t)),i.on((function(t){e.search.last&&t&&l.fromHit(t).then((function(n){"DELETE"===t._operation?e.onDeleteDocument(n):e.onNewDocument(n)}))}))}))},e.onNewDocument=function(t){if(e.search.last&&!e.search.loading){console.debug("[ES] [document] Detected new document: ",t);var n=_.findIndex(e.search.results,{id:t.id,index:t.index,type:t.type});n<0?(e.search.total++,e.search.results.splice(0,0,t)):(t.updated=!0,i((function(){t.updated=!1}),2e3),e.search.results.splice(n,1,t)),e.updateView()}},e.onDeleteDocument=function(t){e.search.last&&!e.search.loading&&i((function(){var n=_.findIndex(e.search.results,{id:t.id,index:t.index,type:t.type});n<0||(console.debug("[ES] [document] Detected document deletion: ",t),e.search.results.splice(n,1),e.search.total--,e.updateView())}),750)},e.showActionsPopover=function(t){r.popover.show(t,{templateUrl:"plugins/es/templates/document/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},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.unauth(e,e.resetData)}function Ye(e,t,n,i,a){angular.extend(this,t("ESDocumentLookupCtrl",{$scope:e})),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","type"],e.showHeaders=!1,e.$on("$ionicParentView.enter",e.enter),e.selectDocument=function(e,t){var n;t&&e&&!e.defaultPrevented&&(e.stopPropagation(),"user"===t.index&&"profile"===t.type?i.go("app.wot_identity",{pubkey:t.pubkey,uid:t.name}):"page"===t.index&&"record"===t.type?i.go("app.view_page",{title:t.title,id:t.id}):"page"===t.index&&"comment"===t.type?(n=a("formatHash")(t.id),i.go("app.view_page_anchor",{title:t.title,id:t.record,anchor:n})):"group"===t.index&&"record"===t.type?i.go("app.view_group",{title:t.title,id:t.id}):"group"===t.index&&"comment"===t.type?(n=a("formatHash")(t.id),i.go("app.view_group_anchor",{title:t.title,id:t.record,anchor:n})):console.warn("Click on this kind of document not implement yet!",t))};var o=e.computeOptions;e.computeOptions=function(t,n){var i=o(t,n);if(!i.sort||i.sort.time){var a=i.sort&&i.sort.time||a;i.sort=[{time:a}]}return i._source=i._source||e._source,i.getTimeFunction=function(e){return e.time=e.creationTime||e.time,e.time},i},n((function(){e.startListenChanges()}),1e3)}function $e(e,t,n,i,a,o,r,s,l,c){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:c.constants.KINDS,index:void 0,type:void 0,
id:void 0},e.$on("$recordView.enter",(function(t,n){e.entered?e.id&&e.loadLikes(e.id):e.entered=!1})),e.$on("$recordView.load",(function(t,n){e.id=n||e.id,e.id&&e.loadLikes(e.id)})),e.initLikes=function(){if(!e.likeData)throw new Error("Missing 'likeData' in scope. Cannot load likes counter");if(!e.options.like.service){if(!e.options.like.index||!e.options.like.type)throw new Error("Missing 'options.like.index' or 'options.like.type' in scope. Cannot load likes counter");e.options.like.service=c.instance(e.options.like.index,e.options.like.type)}e.options.like.kinds||(e.options.like.kinds=_.filter(c.constants.KINDS,(function(t){var n=t.toLowerCase()+"s";return angular.isDefined(e.likeData[n])})))},e.loadLikes=function(n){if(e.likeData&&!e.likeData.loading){n=n||e.likeData.id,e.initLikes();var i=e.options.like.kinds||[];if(i.length){e.likeData.loading=!0;var a=Date.now();console.debug("[ES] Loading counter of {0}... ({1})".format(n.substring(0,8),i));var o=s.isLogin()?s.pubkeys():void 0;return t.all(_.map(i,(function(t){var i=t.toLowerCase()+"s";return e.options.like.service.count(n,{issuers:o,kind:t}).then((function(t){e.likeData[i]&&angular.merge(e.likeData[i],t)}))}))).then((function(){e.likeData.id=n,console.debug("[ES] Loading counter of {0} [OK] in {1}ms".format(n.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(t){console.error(t&&t.message||t),e.likeData.loading=!1}))}}},e.toggleLike=function(i,a){if(e.initLikes(),!e.likeData.id)throw new Error("Missing 'likeData.id' in scope. Cannot apply toggle");if(!s.isLogin())return s.auth({minData:!0}).then((function(t){if(o.loading.hide(),!t)throw new Error("CANCELLED");return a.pubkey=a.pubkey||t.pubkey,e.toggleLike(i,a)}));(a=a||{}).kind=a.kind&&a.kind.toUpperCase()||"LIKE";var l=a.kind.toLowerCase()+"s";if(e.likeData[l]=e.likeData[l]||{},!0===e.likeData[l].loading||e.likeData.loading)return i.preventDefault(),t.reject();if(!a.pubkey){if(0!==s.children.count())return r.showSelectWallet({displayBalance:!1}).then((function(t){if(!t)throw new Error("CANCELLED");return a.pubkey=t.data.pubkey,e.toggleLike(i,a)}));a.pubkey=s.data.pubkey}var c=s.getByPubkey(a.pubkey);return c?(e.likeData[l].loading=!0,c.auth({minData:!0}).then((function(t){if(t)return t.isMember,a.id=e.likeData.id,e.options.like.service.toggle(e.likeData.id,a);o.loading.hide()})).then((function(t){o.loading.hide(),0!==t&&(e.likeData[l].total=(e.likeData[l].total||0)+t,e.likeData[l].wasHitByPubkey=e.likeData[l].wasHitByPubkey||{},e.likeData[l].wasHitByPubkey[a.pubkey]=t>0,e.likeData[l].wasHitCount+=t),n((function(){e.likeData[l].loading=!1,e.$broadcast("$$rebind::like")}),1e3)})).catch((function(t){if(e.likeData[l].loading=!1,"CANCELLED"===t)throw"CANCELLED";console.error(t),o.onError("LIKE.ERROR.FAILED_TOGGLE_LIKE")(t),i.preventDefault()}))):void 0},e.setAbuseForm=function(t){e.abuseForm=t},e.showAbuseCommentPopover=function(t){return i(["COMMON.REPORT_ABUSE.TITLE","COMMON.REPORT_ABUSE.SUB_TITLE","COMMON.BTN_SEND","COMMON.BTN_CANCEL"]).then((function(t){return o.loading.hide(),a.show({templateUrl:"plugins/es/templates/common/popup_report_abuse.html",title:t["COMMON.REPORT_ABUSE.TITLE"],subTitle:t["COMMON.REPORT_ABUSE.SUB_TITLE"],cssClass:"popup-report-abuse",scope:e,buttons:[{text:t["COMMON.BTN_CANCEL"],type:"button-stable button-clear gray"},{text:t["COMMON.BTN_SEND"],type:"button button-positive ink",onTap:function(t){if(e.abuseForm.$submitted=!0,e.abuseForm.$valid&&e.abuseData.comment)return e.abuseData;t.preventDefault()}}]})})).then((function(t){if(e.abuseData={},t&&t.comment)return t;o.loading.hide()}))},e.reportAbuse=function(t,n){if(!s.isLogin())return s.auth({minData:!0}).then((function(i){if(o.loading.hide(),!i)throw new Error("CANCELLED");return n.pubkey=n.pubkey||i.pubkey,e.reportAbuse(t,n)}));if(e.likeData&&e.likeData.abuses&&!e.likeData.abuses.wasHitCount&&!e.likeData.abuses.wasHitCount){if(!(n=n||{}).pubkey){if(0!==s.children.count())return r.showSelectWallet({displayBalance:!1}).then((function(i){if(!i)throw"CANCELLED";return n.pubkey=i.data.pubkey,e.reportAbuse(t,n)}));n.pubkey=s.data.pubkey}var i=s.getByPubkey(n.pubkey);if(i&&i.isMember())return n.comment?(n.kind="ABUSE",e.toggleLike(t,n).then((function(){alert("BEFORE display toast"),o.toast.show("COMMON.REPORT_ABUSE.CONFIRM.SENT")}))):e.showAbuseCommentPopover(t).then((function(i){if(i&&i.comment)return n.comment=i.comment,n.level=i.level||i.delete&&5||void 0,e.reportAbuse(t,n)}));o.alert.info("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")}},s.api.data.on.reset(e,(function(){_.forEach(e.options.like.kinds||[],(function(t){var n=t.toLowerCase()+"s";e.likeData[n]&&(e.likeData[n].wasHitByPubkey={},e.likeData[n].wasHitCount=0)})),e.$broadcast("$$rebind::like")}),this)}function Ke(e,t,n,i,a,o,r,s,l){function c(t){return moment.unix(t).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(t,n){if(e.loading){if(n&&n.stateParams&&(e.stateName=n&&n.stateName,e.stateParams=angular.copy(n&&n.stateParams||{}),!e.formData.currency&&n&&n.stateParams&&n.stateParams.currency&&(e.formData.currency=n.stateParams.currency),n.stateParams.t?e.formData.timePct=n.stateParams.t:n.stateParams.timePct&&(e.formData.timePct=n.stateParams.timePct),n.stateParams.stepUnit&&(e.formData.rangeDuration=n.stateParams.stepUnit),n.stateParams.scale&&(e.formData.scale=n.stateParams.scale),n.stateParams.hide&&(e.formData.hide=n.stateParams.hide.split(",").reduce((function(e,t){return e.concat(parseInt(t))}),[]))),e.init(t,n),!e.formData.currency)return r.get().then((function(i){return e.formData.currency=i?i.name:null,e.formData.firstBlockTime=i?c(i.firstBlockTime):0,e.formData.firstBlockTime||console.warn("[graph] currency.firstBlockTime not loaded ! Should have been loaded by currrency service!"),e.formData.currencyAge=c(moment().utc().unix())-e.formData.firstBlockTime,e.enter(t,n)}));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(t,n,i){e.height=t,e.width=n,e.maintainAspectRatio=angular.isDefined(i)?i:e.maintainAspectRatio},e.$on("csView.action.refresh",(function(t,n){if(!n||"currency"==n)return e.load()})),e.init=function(e,t){},e.load=function(){},e.toggleScale=function(){e.setScale("linear"===e.formData.scale?"logarithmic":"linear"),e.updateLocation()},e.setScale=function(n){if(e.hideActionsPopover(),e.formData.scale=n,e.options&&e.options.scales&&e.options.scales.yAxes){var i=t("formatInteger");_.forEach(e.options.scales.yAxes,(function(t,a){t.type=n,t.ticks=t.ticks||{},"linear"==n?(t.ticks.beginAtZero=!angular.isDefined(e.formData.beginAtZero)||e.formData.beginAtZero,delete t.ticks.min,t.ticks.callback=function(e){return i(e)}):(delete t.ticks.beginAtZero,delete t.ticks.callback,t.ticks.callback=function(e,t){if(e)return Math.log10(e)%1==0||Math.log10(e/3)%1==0?i(e):""})}))}},e.setRangeDuration=function(t){e.hideActionsPopover(),e.formData&&t==e.formData.rangeDuration||(e.formData.rangeDuration=t,delete e.formData.startTime,delete e.formData.endTime,delete e.formData.rangeDurationSec,e.load(),e.updateLocation())},e.updateHiddenDataset=function(t){t=t||e.datasetOverride||{},_.forEach(e.formData.hide||[],(function(n){if(t[n]){t[n].hidden=!0;var i=t[n].yAxisID,a=i&&e.options&&e.options.scales&&_.findWhere(e.options.scales.yAxes||[],{id:i});i&&a&&1==_.filter(t,(function(e){return e.yAxisID===i})).length&&(a.display=!1)}}))},e.onLegendClick=function(t,n){var i=n.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=!1!==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(t,n,i){i=!angular.isDefined(i)||i,e.formData.startTime=t,e.formData.endTime=n,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(t){l.popover.show(t,{templateUrl:"plugins/graph/templates/common/popover_range_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function je(e,t,n,i,a,o,r,s){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.displayRightAxis=!0,e.init=function(t,n){n&&n.stateParams&&!e.formData.issuer&&n&&n.stateParams&&n.stateParams.pubkey&&(e.formData.issuer=n.stateParams.pubkey)},e.load=function(t){var i=e.formData;return n.all([o(e.formData.issuer?"GRAPH.BLOCKCHAIN.TX_AMOUNT_PUBKEY_TITLE":"GRAPH.BLOCKCHAIN.TX_AMOUNT_TITLE",i),o(["GRAPH.BLOCKCHAIN.TX_AMOUNT_LABEL","GRAPH.BLOCKCHAIN.TX_COUNT_LABEL","GRAPH.BLOCKCHAIN.TX_AVG_BY_BLOCK","COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"]),r.blockchain.txCount(e.formData.currency,i)]).then((function(n){var i=n[0],o=n[1],r={hour:o["COMMON.DATE_PATTERN"],day:o["COMMON.DATE_SHORT_PATTERN"],month:o["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((n=n[2])&&n.times){e.times=n.times,a("formatInteger");var l=a("formatDecimal");e.currencySymbol=a("currencySymbolNoHtml")(e.formData.currency,e.formData.useRelative),e.formData.rangeDuration,e.data=[n.amount,n.count];var c=r[e.formData.rangeDuration];e.labels=n.times.reduce((function(e,t){return e.concat(moment.unix(t).local().format(c))}),[]),e.colors=s.scale.fix(n.times.length),e.updateRange(n.times[0],n.times[n.times.length-1],t),e.options={responsive:!0,maintainAspectRatio:!0,title:{display:!0,text:i},scales:{yAxes:[{id:"y-axis-amount",position:"left"},{id:"y-axis-count",display:e.displayRightAxis,position:"right",gridLines:{drawOnChartArea:!1}}]},legend:{display:e.displayRightAxis,onClick:e.onLegendClick},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(t,n){return 0===t.datasetIndex?n.datasets[t.datasetIndex].label+": "+l(t.yLabel)+" "+e.currencySymbol:n.datasets[t.datasetIndex].label+": "+t.yLabel}}}},e.datasetOverride=[{yAxisID:"y-axis-amount",type:"bar",label:o["GRAPH.BLOCKCHAIN.TX_AMOUNT_LABEL"],hoverBackgroundColor:s.rgba.calm(.6)},{yAxisID:"y-axis-count",type:"line",label:o["GRAPH.BLOCKCHAIN.TX_COUNT_LABEL"],fill:!1,borderColor:s.rgba.gray(.5),borderWidth:2,backgroundColor:s.rgba.gray(.5),pointBackgroundColor:s.rgba.gray(.5),pointBorderColor:s.rgba.white(),pointHoverBackgroundColor:s.rgba.gray(1),pointHoverBorderColor:s.rgba.translucent(),pointRadius:3}]}}))},e.onChartClick=function(t,n,a){if(a){var o=e.times[a._index],r=moment.unix(o).utc().add(1,e.formData.rangeDuration).unix(),s="_exists_:transactions AND medianTime:>={0} AND medianTime:<{1}".format(o,r);e.formData.issuer&&(s+=" AND issuer:"+e.formData.issuer),i.go("app.blockchain_search",{q:s})}}}function ze(e,t,n,i,a,o,r){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.load=function(){return n.all([a(["GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_TITLE","GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_LABEL"]),r.blockchain.countByIssuer(e.formData.currency)]).then((function(t){var n=t[0];(t=t[1])&&t.data&&(e.data=t.data,e.labels=t.labels,e.blockCount=t.blockCount,e.issuers=t.issuers,e.barOptions={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0,text:n["GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_TITLE"]},scales:{yAxes:[{type:"linear",ticks:{beginAtZero:!0}}]}},e.colors=o.scale.custom(t.data.length))}))},e.onChartClick=function(t,n,a){if(a){var o=e.issuers[a._index];i.go("app.wot_identity",o)}}}function qe(e,t,n,i,a,o){e.extensionPoint=n.extensions.points.current.get(),e.enable=i.isEnable(),e.loading=!0,e.node=e.node||{},i.api.state.on.changed(e,(function(t){e.enable=t})),e.enter=function(n,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():t((function(){return e.enter(n,i)}),500):a.get().then((function(t){return e.node.currency=t?t.name:null,e.enter(n,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(t){e.blockCount=t,e.loading=!1}))}}function Xe(e,t,n,i){e.extensionPoint=t.extensions.points.current.get(),e.enable=i.isEnable(),e.smallscreen=n.screen.isSmall(),i.api.state.on.changed(e,(function(t){e.enable=t}))}function Qe(e,t,n,i,a,o,r,s,l,c){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.useRelative=angular.isDefined(e.formData.useRelative)?e.formData.useRelative:c.data.useRelative,e.displayShareAxis=!0,e.hiddenDatasets=[],e.init=function(e,t){},e.onUseRelativeChanged=function(){e.loading||e.load()},e.$watch("formData.useRelative",e.onUseRelativeChanged);var d=function(e){return Math.trunc(100*e)/100};e.load=function(t,i){return t=t||0,i=i||1e4,n.all([a(["GRAPH.CURRENCY.MONETARY_MASS_TITLE","GRAPH.CURRENCY.MONETARY_MASS_LABEL","GRAPH.CURRENCY.MONETARY_MASS_SHARE_LABEL"]),s.blockchain.withDividend(e.formData.currency,{from:t,size:i})]).then((function(t){var n=t[0];if((t=t[1])&&t.times){e.times=t.times;var i,a=t.times[t.times.length-1]-t.times[0];i=l(a<31557600?"medianDateShort":"formatDateMonth");var o=l("formatDecimal");e.currencySymbol=l("currencySymbolNoHtml")(e.formData.currency,e.formData.useRelative);var s=[];e.formData.useRelative?(s.push(t.blocks.reduce((function(e,t){return e.concat(d(t.monetaryMass/t.dividend/t.membersCount))}),[])),s.push(t.blocks.reduce((function(e,t){return e.concat(d(t.monetaryMass/t.dividend))}),[]))):(s.push(t.blocks.reduce((function(e,t){return e.concat(d(t.monetaryMass/t.membersCount/100))}),[])),s.push(t.blocks.reduce((function(e,t){return e.concat(t.monetaryMass/100)}),[]))),e.data=s,e.labels=t.times.reduce((function(e,t){return e.concat(i(t))}),[]),e.colors=r.scale.fix(t.times.length),e.options={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0,text:n["GRAPH.CURRENCY.MONETARY_MASS_TITLE"]},legend:{display:e.displayShareAxis,onClick:e.onLegendClick},scales:{yAxes:[{id:"y-axis-mn"},{id:"y-axis-mass",display:e.displayShareAxis,position:"right",gridLines:{drawOnChartArea:!1}}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(t,n){return n.datasets[t.datasetIndex].label+": "+o(t.yLabel)+" "+e.currencySymbol}}}},e.datasetOverride=[{yAxisID:"y-axis-mn",type:"line",label:n["GRAPH.CURRENCY.MONETARY_MASS_SHARE_LABEL"],borderWidth:2,pointRadius:0,pointHitRadius:4,pointHoverRadius:3},{yAxisID:"y-axis-mass",type:"line",label:n["GRAPH.CURRENCY.MONETARY_MASS_LABEL"],fill:!1,showLine:!0,borderColor:r.rgba.energized(),borderWidth:1,backgroundColor:r.rgba.energized(),pointBackgroundColor:r.rgba.energized(),pointBorderColor:r.rgba.energized(),pointHoverBackgroundColor:r.rgba.energized(),pointHoverBorderColor:r.rgba.energized(),pointRadius:0,pointHitRadius:4,pointHoverRadius:3}],e.setScale(e.scale),e.blocks=t.blocks.reduce((function(e,t){return e.concat(t.number)}),[])}}))},e.onChartClick=function(t,n,a){if(a){var o=e.blocks[a._index];i.go("app.view_block",{number:o})}},e.showActionsPopover=function(t){o.popover.show(t,{templateUrl:"plugins/graph/templates/currency/popover_monetary_mass_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function Je(e,t,n,i,a,o,r,s){e.formData={scale:"linear",beginAtZero:!1},angular.extend(this,n("GpCurrencyMonetaryMassCtrl",{$scope:e})),e.load=function(n,s){return n=n||0,s=s||1e4,t.all([i(["GRAPH.CURRENCY.UD_TITLE","COMMON.UNIVERSAL_DIVIDEND"]),o.blockchain.withDividend(e.formData.currency,{from:n,size:s})]).then((function(t){var n=t[0];if((t=t[1])&&t.times){e.times=t.times;var i,o=t.times[t.times.length-1]-t.times[0];i=r(o<31557600?"medianDateShort":"formatDateMonth");var s=r("formatDecimal");e.currencySymbol=r("currencySymbolNoHtml")(e.formData.currency,!1),e.data=[t.blocks.reduce((function(e,t){return e.concat(t.dividend/100)}),[])],e.labels=t.times.reduce((function(e,t){return e.concat(i(t))}),[]),e.colors=t.blocks.reduce((function(e){return e.concat(a.rgba.calm(.5))}),[]),e.options={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0,text:n["GRAPH.CURRENCY.UD_TITLE"]},scales:{yAxes:[{id:"y-axis-ud",ticks:{beginAtZero:e.formData.beginAtZero}}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(t,n){return n.datasets[t.datasetIndex].label+": "+s(t.yLabel)+" "+e.currencySymbol}}}},e.setScale(e.scale),e.datasetOverride=[{yAxisID:"y-axis-ud",type:"line",label:n["COMMON.UNIVERSAL_DIVIDEND"],borderWidth:2,pointRadius:0,pointHitRadius:4,pointHoverRadius:3}],e.blocks=t.blocks.reduce((function(e,t){return e.concat(t.number)}),[])}}))},e.showActionsPopover=function(t){s.popover.show(t,{templateUrl:"plugins/graph/templates/currency/popover_monetary_mass_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function Ze(e,t,n,i,a,o,r,s){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.load=function(t,i){return t=t||0,i=i||1e4,n.all([a(["GRAPH.CURRENCY.MEMBERS_COUNT_TITLE","GRAPH.CURRENCY.MEMBERS_COUNT_LABEL"]),r.blockchain.withDividend(e.formData.currency,{from:t,size:i,withCurrent:!0})]).then((function(t){var n=t[0];if((t=t[1])&&t.times){e.times=t.times;var i,a=t.times[t.blocks.length-1]-t.times[0];i=s(a<31557600?"medianDateShort":"formatDateMonth"),e.labels=t.times.reduce((function(e,t){return e.concat(i(t))}),[]),e.options={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0,text:n["GRAPH.CURRENCY.MEMBERS_COUNT_TITLE"]},scales:{xAxes:[{position:"bottom"}],yAxes:[{id:"y-axis-1",ticks:{beginAtZero:!1}}]}},e.datasetOverride=[{yAxisID:"y-axis-1",type:"line",label:n["GRAPH.CURRENCY.MEMBERS_COUNT_LABEL"],borderWidth:2,pointRadius:0,pointHitRadius:4,pointHoverRadius:3}],e.data=[t.blocks.reduce((function(e,t){return e.concat(t.membersCount)}),[])],e.colors=o.scale.fix(t.blocks.length)}}))},e.onChartClick=function(t,n,a){if(a)if(a._index){var o=e.times[a._index-1],r=moment.unix(o).utc().add(1,"day").unix();i.go("app.blockchain_search",{q:"(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded) AND medianTime:>{0} AND medianTime:<={1}".format(o,r)})}else i.go("app.view_block",{number:0})}}function et(e,t,n,i,a,o,r,s,l,c){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.init=function(t,n){n&&n.stateParams&&n.stateParams.pubkey?e.formData.pubkey=n.stateParams.pubkey:c.isLogin()&&(e.formData.pubkey=c.data.pubkey)};var d=e.setScale;e.setScale=function(t){e.data[e.data.length-2]="linear"===t?_.map(e.data[e.data.length-2],(function(e){return-1*Math.abs(e)})):_.map(e.data[e.data.length-2],(function(e){return Math.abs(e)})),d(t)},e.load=function(t){t=!angular.isDefined(t)||t;var i=!0;return r.load(e.formData.pubkey,null,{cache:!0}).then((function(t){return e.identity=t,i=e.identity.isMember||e.identity.wasMember,n.all([o("GRAPH.ACCOUNT.BALANCE_TITLE",e.formData),o(["GRAPH.ACCOUNT.UD_LABEL","GRAPH.ACCOUNT.TX_RECEIVED_LABEL","GRAPH.ACCOUNT.TX_SENT_LABEL","GRAPH.ACCOUNT.UD_ACCUMULATION_LABEL","GRAPH.ACCOUNT.TX_ACCUMULATION_LABEL","GRAPH.ACCOUNT.BALANCE_LABEL","COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"]),s.blockchain.movement(e.formData.currency,angular.copy(e.formData,{withUD:i}))])})).then((function(n){var o=n[0],r=n[1];if((n=n[2])&&n.times){e.times=n.times;var s=a("formatDecimal");e.currencySymbol=a("currencySymbolNoHtml")(e.formData.currency,e.formData.useRelative),e.data=[n.ud,n.received,n.sent,n.balance];var c={hour:r["COMMON.DATE_PATTERN"],day:r["COMMON.DATE_SHORT_PATTERN"],month:r["COMMON.DATE_MONTH_YEAR_PATTERN"]}[e.formData.rangeDuration];e.labels=n.times.reduce((function(e,t){return e.concat(moment.unix(t).local().format(c))}),[]),e.colors=l.scale.fix(n.times.length),e.updateRange(n.times[0],n.times[n.times.length-1],t),e.options={responsive:!0,maintainAspectRatio:!0,title:{display:!0,text:o},scales:{xAxes:[{stacked:!0}],yAxes:[{id:"y-axis-left",type:"linear",position:"left",stacked:!0}]},legend:{display:!0,onClick:e.onLegendClick},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(t,n){return n.datasets[t.datasetIndex].label+": "+(t.yLabel?s(t.yLabel)+" "+e.currencySymbol:"0")}}}},e.datasetOverride=[{yAxisID:"y-axis-left",type:"bar",label:r["GRAPH.ACCOUNT.UD_LABEL"],backgroundColor:l.rgba.energized(.3),hoverBackgroundColor:l.rgba.energized(.5),borderWidth:1},{yAxisID:"y-axis-left",type:"bar",label:r["GRAPH.ACCOUNT.TX_RECEIVED_LABEL"],backgroundColor:l.rgba.positive(.4),hoverBackgroundColor:l.rgba.positive(.6),borderWidth:1},{yAxisID:"y-axis-left",type:"bar",label:r["GRAPH.ACCOUNT.TX_SENT_LABEL"],backgroundColor:l.rgba.assertive(.4),hoverBackgroundColor:l.rgba.assertive(.6),borderWidth:1},{yAxisID:"y-axis-left",type:"line",label:r["GRAPH.ACCOUNT.BALANCE_LABEL"],fill:"origin",borderColor:l.rgba.calm(.5),borderWidth:2,pointBackgroundColor:l.rgba.calm(.5),pointBorderColor:l.rgba.white(),pointHoverBackgroundColor:l.rgba.calm(1),pointHoverBorderColor:"rgba(0,0,0,0)",pointRadius:3,lineTension:.1}],i||(e.data.splice(0,1),e.datasetOverride.splice(0,1))}}))},e.onChartClick=function(t,n,a){if(a){var o=e.times[a._index],r=moment.unix(o).utc().add(1,e.formData.rangeDuration).unix(),s="medianTime:>={0} AND medianTime:<{1}".format(o,r);e.formData.pubkey&&(s+=" AND (transactions.issuers:"+e.formData.pubkey+" OR transactions.outputs:*"+e.formData.pubkey+")"),i.go("app.blockchain_search",{q:s})}}}function tt(e,t,n,i,a,o){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.init=function(t,n){e.pubkey=n&&n.stateParams&&n.stateParams.pubkey},e.load=function(t,n){if(e.pubkey)return a.load(e.pubkey,-1).then((function(t){t&&t.tx&&t.tx.history&&(e.inputChart=e.computeChartData(_.filter(t.tx.history,(function(e){return e.amount>0}))),e.outputChart=e.computeChartData(_.filter(t.tx.history,(function(e){return e.amount<0}))))}))},e.computeChartData=function(e){var t=n("formatPubkey"),i={};_.forEach(e,(function(e){i[e.pubkey]=i[e.pubkey]||{label:e.name||e.uid||t(e.pubkey),pubkey:e.pubkey,sum:0},i[e.pubkey].sum+=Math.abs(e.amount)}));var a=_.sortBy(_.values(i),"sum").reverse();return _.each(a,(function(e){e.sum=e.sum/100})),{data:_.pluck(a,"sum"),labels:_.pluck(a,"label"),pubkeys:_.pluck(a,"pubkey"),colors:o.scale.custom(Math.max(10,a.length))}},e.onInputChartClick=function(t,n,a){if(a){var o=e.inputChart.pubkeys[a._index];i.go("app.wot_identity",{pubkey:o})}},e.onOutputChartClick=function(t,n,a){if(a){var o=e.outputChart.pubkeys[a._index];i.go("app.wot_identity",{pubkey:o})}}}function nt(e,t,n,i,a,o,r,s,l){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.init=function(t,n){n&&n.stateParams&&n.stateParams.pubkey?e.formData.pubkey=n.stateParams.pubkey:l.isLogin()&&(e.formData.pubkey=l.data.pubkey)},e.load=function(t){var i=e.formData;return n.all([o("GRAPH.ACCOUNT.CERTIFICATION_TITLE",i),o(["GRAPH.ACCOUNT.GIVEN_CERT_LABEL","GRAPH.ACCOUNT.RECEIVED_CERT_LABEL","GRAPH.ACCOUNT.GIVEN_CERT_DELTA_LABEL","GRAPH.ACCOUNT.RECEIVED_CERT_DELTA_LABEL","COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"]),r.wot.certifications(i)]).then((function(n){var i=n[0],o=n[1];if((n=n[2])&&n.times){e.times=n.times;var r=a("formatInteger");e.data=[n.deltaReceived,n.received,n.deltaGiven,n.given],e.labels=n.labels;var l={hour:o["COMMON.DATE_PATTERN"],day:o["COMMON.DATE_SHORT_PATTERN"],month:o["COMMON.DATE_MONTH_YEAR_PATTERN"]}[e.formData.rangeDuration];e.labels=n.times.reduce((function(e,t){return e.concat(moment.unix(t).local().format(l))}),[]),e.colors=s.scale.fix(n.times.length),e.updateRange(n.times[0],n.times[n.times.length-1],t),e.options={responsive:!0,maintainAspectRatio:!0,title:{display:!0,text:i},scales:{yAxes:[{id:"y-axis-left",type:"linear",position:"left"},{id:"y-axis-hide",type:"linear",display:!1,position:"right"}]},legend:{display:!0},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(e,t){var n=(0===e.datasetIndex||2===e.datasetIndex)&&e.yLabel>0;return t.datasets[e.datasetIndex].label+": "+(n?"+":"")+!e.yLabel?"0":r(e.yLabel)}}}},e.datasetOverride=[{yAxisID:"y-axis-left",type:"bar",label:o["GRAPH.ACCOUNT.RECEIVED_CERT_DELTA_LABEL"],borderColor:s.rgba.positive(.6),borderWidth:1,backgroundColor:s.rgba.positive(.4),hoverBackgroundColor:s.rgba.positive(.6)},{yAxisID:"y-axis-left",type:"line",label:o["GRAPH.ACCOUNT.RECEIVED_CERT_LABEL"],fill:!1,borderColor:s.rgba.positive(.5),borderWidth:2,backgroundColor:s.rgba.positive(1),pointBackgroundColor:s.rgba.positive(.5),pointBorderColor:s.rgba.white(),pointHoverBackgroundColor:s.rgba.positive(1),pointHoverBorderColor:"rgba(0,0,0,0)",pointRadius:3},{yAxisID:"y-axis-left",type:"bar",label:o["GRAPH.ACCOUNT.GIVEN_CERT_DELTA_LABEL"],borderColor:s.rgba.assertive(.6),borderWidth:1,backgroundColor:s.rgba.assertive(.4),hoverBackgroundColor:s.rgba.assertive(.6)},{yAxisID:"y-axis-left",type:"line",label:o["GRAPH.ACCOUNT.GIVEN_CERT_LABEL"],fill:!1,borderColor:s.rgba.assertive(.4),borderWidth:2,backgroundColor:s.rgba.assertive(1),pointBackgroundColor:s.rgba.assertive(.4),pointBorderColor:s.rgba.white(),pointHoverBackgroundColor:s.rgba.assertive(1),pointHoverBorderColor:"rgba(0,0,0,0)",pointRadius:3,lineTension:.1}]}}))},e.onChartClick=function(t,n,a){if(a){var o=e.times[a._index],r=moment.unix(o).utc().add(1,e.formData.rangeDuration).unix(),s="_exists_:transactions AND medianTime:>={0} AND medianTime:<{1}".format(o,r);e.formData.pubkey&&(s+=" AND (transactions.issuers:"+e.formData.pubkey+" OR transactions.outputs:*"+e.formData.pubkey+")"),i.go("app.blockchain_search",{q:s})}}}function it(e,t,n,i,a,o,r,s){angular.extend(this,n("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.rangeDuration="month",e.displayRightAxis=!0,e.hiddenDatasets=[],e.chartIdPrefix="docstats-chart-",e.charts=[{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"}}},{key:"invitation_certification",label:"GRAPH.DOC_STATS.MESSAGE.INVITATION_CERTIFICATION",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"invitation",type:"certification"}}}]},{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:"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=s("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,t){return t.datasets[e.datasetIndex].label+": "+l(e.yLabel)}}}},e.init=function(t,n){if(n&&n.stateParams){var i=n.stateParams&&n.stateParams.server||void 0;i&&(console.debug("[docstats] Will use server: "+i),angular.merge(e.formData,{server:n.stateParams.server,useSsl:n.stateParams.useSsl,useTor:n.stateParams.useTor}))}},e.load=function(t){return i.all([a(e.charts.reduce((function(e,t){return e.concat(t.series.reduce((function(e,t){return e.concat(t.label)}),[t.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),r.docstat.get(e.formData)]).then((function(n){var i=n[0],a={hour:i["COMMON.DATE_PATTERN"],day:i["COMMON.DATE_SHORT_PATTERN"],month:i["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((n=n[1])&&n.times){e.times=n.times;var r=a[e.formData.rangeDuration];e.labels=_.map(n.times,(function(e){return moment.unix(e).local().format(r)})),e.updateRange(n.times[0],n.times[n.times.length-1],t),e.setScale(e.scale),_.forEach(e.charts,(function(t){var a={};t.data=_.map(t.series,(function(e){if(a[e.yAxisID||"y-axis"]=!0,e.key.endsWith("_delta")){var t=e.key.substring(0,e.key.length-"_delta".length);return((i=n[t])?_.map(i,(function(e){var t=void 0!==e&&void 0!==o?e-(o||e):void 0;return o=e,t})):void 0)||[]}var i,o;return n[e.key]||[]})),t.options=angular.copy(e.defaultChartOptions),t.options.title.text=i[t.title],t.options.scales.yAxes=t.options.scales.yAxes.reduce((function(e,t){return a[t.id]?e.concat(t):e}),[]),t.datasetOverride=_.map(t.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(n,i,a){if(a){var o=_.find(e.charts,(function(t){return e.chartIdPrefix+t.id===a._chart.canvas.id})),r=o&&o.series[a._datasetIndex],s=e.times[a._index],l=moment.unix(s).utc().add(1,e.formData.rangeDuration).unix();if(r&&r.clickState&&r.clickState.name){var c=r.clickState.params?angular.copy(r.clickState.params):{};return c.q="time:>={0} AND time:<{1}".format(s,l),t.go(r.clickState.name,c)}r&&console.debug("Click on item index={0} on range [{1},{2}]".format(a._index,s,l))}}}function at(e,t,n,i,a,o,r){angular.extend(this,t("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 s=r("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,t){return t.datasets[e.datasetIndex].label+": "+s(e.yLabel)}}}},e.init=function(t,n){if(n&&n.stateParams){var i=n.stateParams&&n.stateParams.server||void 0;i&&(console.debug("[synchro] Will use server: "+i),angular.merge(e.formData,n.stateParams))}},e.load=function(t){return n.all([i(e.charts.reduce((function(e,t){return e.concat(t.series.reduce((function(e,t){return e.concat(t.label)}),[t.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),o.synchro.execution.get(e.formData)]).then((function(n){var i=n[0],o={hour:i["COMMON.DATE_PATTERN"],day:i["COMMON.DATE_SHORT_PATTERN"],month:i["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((n=n[1])&&n.times){e.times=n.times;var r=o[e.formData.rangeDuration];e.labels=n.times.reduce((function(e,t){return e.concat(moment.unix(t).local().format(r))}),[]),e.updateRange(n.times[0],n.times[n.times.length-1],t),e.setScale(e.scale),_.forEach(e.charts,(function(t){t.data=[],_.forEach(t.series,(function(e){t.data.push(n[e.key]||[])})),t.options=angular.copy(e.defaultChartOptions),t.options.title.text=i[t.title],t.datasetOverride=t.series.reduce((function(e,t){return e.concat({yAxisID:"y-axis",type:t.type||"line",label:i[t.label],fill:!0,borderWidth:2,pointRadius:0,pointHitRadius:4,pointHoverRadius:3,borderColor:t.color,backgroundColor:t.color,pointBackgroundColor:t.color,pointBorderColor:t.color,pointHoverBackgroundColor:t.pointHoverBackgroundColor||t.color,pointHoverBorderColor:t.pointHoverBorderColor||a.rgba.white()})}),[])}))}}))}}function ot(e,t,n,i,a){var o=[];e.mapId="map-user-profile-"+e.$id,e.map=i.map({markers:{},center:{zoom:13}}),e.loading=!0,e.mapId=e.mapId||"map-abstract-"+e.$id,e.enter=function(n,i){return e.formData&&(e.formData.title||e.formData.geoPoint)?(e.loading=!0,e.load()):t(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(t){e.map.markers.geoPoint={message:t,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 n=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(n),e.ionItemClass||(e.ionItemClass="done in"),e.loading=!1})):(_.forEach(o,(function(e){e()})),o=[],delete e.map.markers.geoPoint,e.loading=!1,n.when())},e.$watch("formData.geoPoint",(function(){e.loading||e.load()}),!0)}function rt(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b){angular.extend(this,l("WotIdentityAbstractCtrl",{$scope:e})),angular.extend(this,l("ESWotIdentityViewCtrl",{$scope:e}));var g,f={member:{type:"awesomeMarker",icon:"person",markerColor:"blue"},pending:{type:"awesomeMarker",icon:"clock",markerColor:"lightgreen",iconColor:"gray"},wallet:{type:"awesomeMarker",icon:"key",markerColor:"lightgray"}};e.loading=!0,e.loadingMarker=!0,e.mapId="map-wot-"+e.$id,e.map=E.map({cache:"map-wot",layers:{overlays:{member:{type:"featureGroup",name:"MAP.WOT.VIEW.LAYER.MEMBER",visible:!0},pending:{type:"featureGroup",name:"MAP.WOT.VIEW.LAYER.PENDING",visible:!0},wallet:{type:"featureGroup",name:"MAP.WOT.VIEW.LAYER.WALLET",visible:!0}}},bounds:{},markers:{},loading:!0},e.mapId),e.showDescription=!1,c().then((function(){e.enableDescription=!u.screen.isSmall()&&"a"===ionic.Platform.grade.toLowerCase(),e.enableDescription||console.debug("[map] [wot] Disable profile description.",ionic.Platform.grade)})),e.$on("$ionicView.beforeEnter",(function(e,t){t.enableBack=!!u.screen.isSmall()||t.enableBack})),e.enter=function(t,n){if(e.loading){if(u.loading.show({noBackdrop:!0}),n.stateParams&&n.stateParams.c){var i=n.stateParams.c.split(":");e.map.center.lat=parseFloat(i[0]),e.map.center.lng=parseFloat(i[1]),e.map.center.zoom=parseInt(i[2])}e.$watch("map.center",(function(){if(!e.loading)return a((function(){e.updateLocationHref()}),300)}),!0);var o=Date.now();e.loadMap().then(e.load).then((function(){console.debug("[map] [wot] Loaded in "+(Date.now()-o)+"ms"),e.showHelpTip()}))}else e.updateLocationHref(),e.showHelpTip()},e.$on("$ionicView.enter",e.enter),e.loadMap=function(){return s.all([r(["COMMON.BTN_HELP_TOUR_SCREEN","COMMON.BTN_REFRESH","MAP.COMMON.BTN_LOCALIZE_ME"]),d.getMap(e.mapId)]).then((function(t){var o=t[0],r=t[1];if(!e.map.loading)return r;u.screen.isSmall()||(L.easyButton({position:"topright",type:"replace",leafletClasses:!0,states:[{stateName:"show-help-tour",onClick:e.startHelpTour,title:o["COMMON.BTN_HELP_TOUR_SCREEN"],icon:"icon ion-easel"}]}).addTo(r),L.easyButton({position:"topright",type:"replace",leafletClasses:!0,states:[{stateName:"refresh",onClick:function(t,n){return e.load(n)},title:o["COMMON.BTN_REFRESH"],icon:"icon ion-refresh"}]}).addTo(r)),L.Control.loading({position:"topright",separate:!0}).addTo(r),E.control.localizeMe({title:o["MAP.COMMON.BTN_LOCALIZE_ME"]}).addTo(r),g=L.layerGroup({visible:!1});var s=i(n.get("plugins/map/templates/wot/item_search_tooltip.html"));E.control.search({layer:g,propertyName:"title",buildTip:function(e,t){return s(t.layer.options)},moveToLocation:function(e,t,n){this.options.zoom?this._map.setView(e,this.options.zoom):this._map.panTo(e);var i=e.layer&&e.layer.options&&e.layer.options.popupMarkerId;a((function(){var e=i&&_.find(n._layers,(function(e){return e.options&&e.options.id===i}));e&&e.openPopup()}),400)},firstTipSubmit:!0,tooltipLimit:50}).addTo(r);var l=function(e){return e.options&&e.options.layer},c=L.markerClusterGroup({disableClusteringAtZoom:E.constants.LOCALIZE_ZOOM,maxClusterRadius:65,showCoverageOnHover:!1,iconCreateFunction:function(e){var t=_.countBy(e.getAllChildMarkers(),l),n=t.member?"blue":t.pending?"lightgreen":"lightgray",i=e.getChildCount(),a="marker-cluster "+n+" marker-cluster-";return a+=i<10?"small":i<100?"medium":"large",L.divIcon({html:"<div><span>"+i+"</span></div>",className:a,iconSize:new L.Point(40,40)})}});return r.eachLayer((function(e){e.addLayer&&angular.extend(e,L.featureGroup.subGroup(c))})),c.addTo(r),e.map.loading=!1,r}))},e.load=function(i){if(!i)return d.getMap(e.mapId).then(e.load);e.loading=!0,i.fire("dataloading");var o={fields:{description:e.enableDescription}};return e.map.bounds,b.load(o).then((function(o){var r={};if(g.clearLayers(),o&&o.length){var s=t("formatPubkey"),l=n.get("plugins/map/templates/wot/popup_marker.html");_.forEach(o,(function(t){var n=t.pending?"pending":t.uid?"member":"wallet",i=s(t.pubkey),a=t.index+"_"+(t.id||(t.uid?t.uid+":"+t.pubkey:t.pubkey)).replace(/-/g,"_"),o={layer:n,icon:f[n],opacity:t.uid?1:.7,title:t.name+" | "+i,lat:t.geoPoint.lat,lng:t.geoPoint.lon,getMessageScope:function(){var n=e.$new();return n.loadingMarker=!0,n.formData={},n.$applyAsync((function(){n.formData={pubkey:t.pubkey,uid:t.uid,name:t.name,profile:t},n.loadingMarker=!1})),n},focus:!1,message:l,id:a};r[a]=o;var c=t.name+(t.uid&&t.uid!=t.name?" | "+t.uid:"")+" | "+i,d=angular.merge({type:n,opacity:0,icon:L.divIcon({className:n+" ng-hide",iconSize:L.point(0,0)})},{title:c,pubkey:t.pubkey,uid:t.uid,name:t.name,pending:t.pending,popupMarkerId:a});g.addLayer(new L.Marker({lat:t.geoPoint.lat,lng:t.geoPoint.lon},d))}))}return e.map.markers=r,a((function(){e.loading=!1,i.fire("dataload"),u.loading.hide()}))})).catch((function(t){e.map.markers={},e.loading=!1,u.onError("MAP.WOT.ERROR.LOAD_POSITION_FAILED")(t)}))},e.updateLocationHref=function(t){(o.search()||{}).c&&E.center.isDefault(e.map.center)||(t=t||"{0}:{1}:{2}".format(e.map.center.lat.toFixed(4),e.map.center.lng.toFixed(4),e.map.center.zoom),o.search({c:t}).replace())},e.startHelpTour=function(){return e.showHelpTip(0,!0)},e.showHelpTip=function(t,n){if((n||m.isLogin())&&(t=angular.isDefined(t)?t:angular.isNumber(p.data.helptip.mapwot)?p.data.helptip.mapwot:0,n=!!angular.isDefined(n)&&n,!(t<0||t>2))){var i=e.createHelptipScope(n,"MapHelpTipCtrl");if(i)return i.tour=n,i.mapId=e.mapId,i.startMapWotTour(t,!1).then((function(e){i.$destroy(),p.data.helptip.mapwot=angular.isNumber(p.data.helptip.mapwot)?Math.max(e,p.data.helptip.mapwot):e,p.store()}))}}}function st(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){var b,g={shop:{type:"awesomeMarker",icon:"page-shop",markerColor:"blue"},company:{type:"awesomeMarker",icon:"page-company",markerColor:"blue"},association:{type:"awesomeMarker",icon:"page-association",markerColor:"lightgreen",iconColor:"gray"},institution:{type:"awesomeMarker",icon:"page-institution",markerColor:"lightgray"}};e.loading=!0,e.loadingMarker=!0,e.mapId="map-registry-"+e.$id,e.map=m.map({cache:"map-registry",layers:{overlays:{shop:{type:"featureGroup",name:"MAP.REGISTRY.VIEW.LAYER.SHOP",visible:!0},company:{type:"featureGroup",name:"MAP.REGISTRY.VIEW.LAYER.COMPANY",visible:!0},association:{type:"featureGroup",name:"MAP.REGISTRY.VIEW.LAYER.ASSOCIATION",visible:!0},institution:{type:"featureGroup",name:"MAP.REGISTRY.VIEW.LAYER.INSTITUTION",visible:!0}}},bounds:{},markers:{},loading:!0},e.mapId),e.formData={},e.showDescription=!1,l().then((function(){e.enableDescription=!d.screen.isSmall()&&"a"===ionic.Platform.grade.toLowerCase(),e.enableDescription||console.debug("[map] [wot] Disable profile description.",ionic.Platform.grade)})),e.$on("$ionicView.beforeEnter",(function(e,t){t.enableBack=!!d.screen.isSmall()||t.enableBack})),e.enter=function(t,n){if(e.loading){if(n.stateParams&&n.stateParams.c){var i=n.stateParams.c.split(":");e.map.center.lat=parseFloat(i[0]),e.map.center.lng=parseFloat(i[1]),e.map.center.zoom=parseInt(i[2])}e.$watch("map.center",(function(){if(!e.loading)return a((function(){e.updateLocationHref()}),300)}),!0),e.loadMap().then((function(){return p.isLogin()&&e.showHelpTip(),e.load()}))}else e.updateLocationHref(),p.isLogin()&&e.showHelpTip()},e.$on("$ionicView.enter",e.enter),e.loadMap=function(){return s.all([r(["COMMON.BTN_HELP_TOUR_SCREEN","COMMON.BTN_REFRESH","MAP.COMMON.BTN_LOCALIZE_ME"]),c.getMap(e.mapId)]).then((function(t){var o=t[0],r=t[1];if(!e.map.loading)return r;d.screen.isSmall()||L.easyButton({position:"topright",type:"replace",leafletClasses:!0,states:[{stateName:"refresh",onClick:function(t,n){return e.load(n)},title:o["COMMON.BTN_REFRESH"],icon:"icon ion-refresh"}]}).addTo(r),L.Control.loading({position:"topright",separate:!0}).addTo(r),m.control.localizeMe({title:o["MAP.COMMON.BTN_LOCALIZE_ME"]}).addTo(r),b=L.layerGroup({visible:!1});var s=i(n.get("plugins/map/templates/registry/item_search_tooltip.html"));m.control.search({layer:b,propertyName:"title",buildTip:function(e,t){return s(t.layer.options)},moveToLocation:function(e,t,n){this.options.zoom?this._map.setView(e,this.options.zoom):this._map.panTo(e);var i=e.layer&&e.layer.options&&e.layer.options.popupMarkerId;a((function(){var e=i&&_.find(n._layers,(function(e){return e.options&&e.options.id===i}));e&&e.openPopup()}),400)},firstTipSubmit:!0,tooltipLimit:50}).addTo(r);var l=function(e){return e.options&&e.options.layer},c=L.markerClusterGroup({disableClusteringAtZoom:m.constants.LOCALIZE_ZOOM,maxClusterRadius:65,showCoverageOnHover:!1,iconCreateFunction:function(e){var t=_.countBy(e.getAllChildMarkers(),l),n=t.shop||t.company?"blue":t.association?"lightgreen":"lightgray",i=e.getChildCount(),a="marker-cluster "+n+" marker-cluster-";return a+=i<10?"small":i<100?"medium":"large",L.divIcon({html:"<div><span>"+i+"</span></div>",className:a,iconSize:new L.Point(40,40)})}});return r.eachLayer((function(e){e.addLayer&&angular.extend(e,L.featureGroup.subGroup(c))})),c.addTo(r),e.map.loading=!1,r}))},e.load=function(i){if(!i)return c.getMap(e.mapId).then(e.load);e.loading=!0,i.fire("dataloading");var a={fields:{description:e.enableDescription}};return E.load(a).then((function(a){var o={};if(b.clearLayers(),a&&a.length){var r=t("formatPubkey"),s=n.get("plugins/map/templates/registry/popup_marker.html");_.forEach(a,(function(t){var n=r(t.pubkey),i=t.index+"_"+t.id.replace(/-/g,"_"),a={layer:t.type,icon:g[t.type],opacity:1,title:t.name+" | "+n,lat:t.geoPoint.lat,lng:t.geoPoint.lon,getMessageScope:function(){var n=e.$new();return n.loadingMarker=!0,n.formData={},n.$applyAsync((function(){angular.extend(n.formData,t),n.loadingMarker=!1})),n},focus:!1,message:s,id:i};o[i]=a;var l=t.name+" | "+n,c=angular.merge({type:t.type,opacity:0,icon:L.divIcon({className:t.type+" ng-hide",iconSize:L.point(0,0)})},{title:l,pubkey:t.pubkey,name:t.name,popupMarkerId:i});b.addLayer(new L.Marker({lat:t.geoPoint.lat,lng:t.geoPoint.lon},c))}))}e.map.markers=o,e.loading=!1,i.fire("dataload")})).catch((function(t){e.map.markers={},e.loading=!1,d.onError("MAP.WOT.ERROR.LOAD_POSITION_FAILED")(t)}))},e.updateLocationHref=function(t){(o.search()||{}).c&&m.center.isDefault(e.map.center)||(t=t||"{0}:{1}:{2}".format(e.map.center.lat.toFixed(4),e.map.center.lng.toFixed(4),e.map.center.zoom),o.search({c:t}).replace())},e.$on("centerUrlHash",(function(t,n){if(!e.loading)return a((function(){e.updateLocationHref(n)}),300)})),e.startHelpTour=function(){return e.showHelpTip(0,!0)},e.showHelpTip=function(t,n){if(t=angular.isDefined(t)?t:angular.isNumber(u.data.helptip.mapwot)?u.data.helptip.mapwot:0,n=!!angular.isDefined(n)&&n,!(t<0||t>2)){var i=e.createHelptipScope(n,"MapHelpTipCtrl");if(i)return i.tour=n,i.mapId=e.mapId,i.startMapWotTour(t,!1).then((function(e){i.$destroy(),u.data.helptip.mapwot=angular.isNumber(u.data.helptip.mapwot)?Math.max(e,u.data.helptip.mapwot):e,u.store()}))}}}function lt(e,t){e.mapId="map-page-"+e.$id,angular.extend(this,t("MapEditPositionAbstractCtrl",{$scope:e}))}function ct(e,t){e.mapId="map-profile-"+e.$id,angular.extend(this,t("MapEditPositionAbstractCtrl",{$scope:e}))}function dt(e,t){angular.extend(this,t("HelpTipCtrl",{$scope:e})),e.mapId=void 0,e.startMapWotTour=function(t,n){var i=[function(){return e.showHelpTip("helptip-map-wot",{bindings:{content:"MAP.HELP.TIP.WOT",icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return e.showHelpTip(null,{selector:"#{0} .leaflet-control-search".format(e.mapId),bindings:{content:"MAP.HELP.TIP.WOT_BTN_SEARCH",icon:{position:"center"}}})},function(){return e.showHelpTip(null,{selector:"#{0} .leaflet-control-layers".format(e.mapId),bindings:{content:"MAP.HELP.TIP.WOT_BTN_LAYERS",icon:{position:"right"},hasNext:n}})}];return e.executeStep("mapwot",i,t)}}if(angular.module("cesium.settings.services",["ngApi","cesium.config"]).factory("csSettings",["$rootScope","$q","$window","Api","localStorage","$translate","csConfig",function(e,t,n,i,a,o,r){var s=[{id:"en",label:"English",flag:"us"},{id:"en-GB",label:"English (UK)",flag:"gb"},{id:"eo-EO",label:"Esperanto",flag:"eo"},{id:"fr-FR",label:"Français",flag:"fr"},{id:"nl-NL",label:"Nederlands",flag:"nl"},{id:"es-ES",label:"Spanish",flag:"es"},{id:"it-IT",label:"Italiano",flag:"it"}],l=r.fallbackLanguage?c(r.fallbackLanguage):"en";function c(e){if(!e)return l;if(_.findWhere(s,{id:e}))return e;var t=e.split("-");if(t.length>1)return c(t[0]);var n=_.find(s,(function(t){return String.prototype.startsWith.call(t.id,e)}));return n?n.id:l}var d,u,p,m,E={STORAGE_KEY:"settings",KEEP_AUTH_IDLE_SESSION:9999},b={timeout:4e3,cacheTimeMs:6e4,timeWarningExpireMembership:5184e3,timeWarningExpire:7776e3,minVersion:"1.1.0",sourceUrl:"https://git.duniter.org/clients/cesium-grp/cesium",sourceLicenseUrl:"https://git.duniter.org/clients/cesium-grp/cesium/-/raw/master/LICENSE",newIssueUrl:"https://git.duniter.org/clients/cesium-grp/cesium/issues/new",userForumUrl:"https://forum.monnaie-libre.fr",latestReleaseUrl:"https://api.github.com/repos/duniter/cesium/releases/latest",duniterLatestReleaseUrl:"https://api.github.com/repos/duniter/duniter/releases/latest",httpsMode:!1},g=angular.merge({useRelative:!1,useLocalStorage:!!n.localStorage,useLocalStorageEncryption:!1,persistCache:!1,walletHistoryTimeSecond:2592e3,walletHistorySliceSecond:432e3,walletHistoryAutoRefresh:!0,rememberMe:!0,keepAuthIdle:600,showUDHistory:!0,expertMode:!1,decimalCount:4,uiEffects:!0,blockValidityWindow:6,helptip:{enable:!0,installDocUrl:"https://duniter.org/en/wiki/duniter/install/",currency:0,network:0,wotLookup:0,wot:0,wotCerts:0,wallet:0,walletCerts:0,wallets:0,header:0,settings:0},currency:{allRules:!1,allWotRules:!1},wallet:{showPubkey:!0,alertIfUnusedWallet:!0},locale:{id:(p=r.defaultLanguage||o.use(),m=c(p),p!==m&&console.debug("[settings] Fix locale [{0}] -> [{1}]".format(p,m)),m)},license:{en:"license/license_g1-en","fr-FR":"license/license_g1-fr-FR","es-ES":"license/license_g1-es-ES"}},b,r),f={},h=!1,T=new i(this,"csSettings"),v=function(){if(angular.isUndefined(d)||!angular.equals(d,f))return d=angular.copy(f),T.data.raise.changed(f)},I=function(){return h?(f.useLocalStorage?!0===f.node.temporary?a.getObject(E.STORAGE_KEY).then((function(e){var t=angular.copy(f);return t.node=e&&e.node||{},delete t.temporary,a.setObject(E.STORAGE_KEY,t)})):a.setObject(E.STORAGE_KEY,f):a.setObject(E.STORAGE_KEY,null)).then((function(){return f.useLocalStorage&&console.debug("[setting] Saved locally"),T.data.raisePromise.store(f)})).then(v):(console.debug("[setting] Waiting start finished..."),(u||R()).then(I))},O=function(e){if(e){var t=!1;if(e.locale&&e.locale.id){var n=c(e.locale.id);e.locale=_.findWhere(s,{id:n}),t=!f.locale||e.locale.id!==f.locale.id||e.locale.id!==o.use()}_.keys(b).forEach((function(t){e[t]=g[t]})),angular.merge(f,e),(e&&e.node&&!e.node.temporary||!f.node.temporary)&&delete f.node.temporary,t&&o.use(f.locale.id)}},N=function(){var e=Date.now();return a.getObject(E.STORAGE_KEY).then((function(t){if(!t)return console.debug("[settings] No settings in local storage. Using defaults."),O(g),void v();O(t),console.debug("[settings] Loaded from local storage in "+(Date.now()-e)+"ms"),v()}))},R=function(){return console.debug("[settings] Starting..."),u=a.ready().then(N).then((function(){console.debug("[settings] Started"),h=!0,u=null,T.data.raise.ready(f)}))};return e.$on("$translateChangeSuccess",(function(){var e=o.use();console.debug("[settings] Locale ["+e+"]");try{moment.locale(e.toLowerCase())}catch(t){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(t){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"),O(g),{isStarted:function(){return h},ready:function(){return h?t.when():u||R()},start:R,data:f,apply:O,getByPath:function(e,t){var n=f;return _.each(e.split("."),(function(e){n=n[e],angular.isUndefined(n)&&(n=t)})),n},reset:function(){return _.keys(f).forEach((function(e){delete f[e]})),O(g),T.data.raisePromise.reset(f).then(I)},store:I,restore:N,getLicenseUrl:function(){var e=f.locale&&f.locale.id||r.defaultLanguage||"en";return r.license?r.license[e]?r.license[e]:g.license[r.defaultLanguage||"en"]||r.license:void 0},getFeedUrl:function(){var e=f.locale&&f.locale.id||r.defaultLanguage||"en";return r.feed&&r.feed.jsonFeed?r.feed.jsonFeed[e]?r.feed.jsonFeed[e]:g.feed.jsonFeed[r.defaultLanguage||"en"]||r.feed:void 0},defaultSettings:g,api:T,locales:s,constants:E}}]),angular.module("cesium.network.services",["ngApi","cesium.currency.services","cesium.http.services"]).factory("csNetwork",["$rootScope","$q","$interval","$timeout","$window","csConfig","BMA","csHttp","csCurrency","Api",function(t,i,a,o,r,s,l,c,d,u){var p,m="https:"===r.location.protocol,E=new u(this,"csNetwork"),b={bma:null,listeners:[],loading:!0,peers:[],filter:{member:!0,mirror:!0,endpoint:null,online:!1,bma:!1,ssl:void 0,tor:void 0},sort:{type:null,asc:!0,compact:!0},groupBy:"pubkey",expertMode:!1,knownBlocks:[],mainBlock:null,minOnlineBlockNumber:0,uidsByPubkeys:null,searchingPeersOnNetwork:!1,difficulties:null,ws2pHeads:null,timeout:s.timeout},g=function(e){return e&&[e.number,e.hash].join("-")},f=function(){return b.bma.network.ws2p.heads().then((function(e){b.ws2pHeads=e.heads?e.heads.reduce((function(e,t){if(t.message&&t.sig)try{var i=new n(t.message);e[[i.pubkey,i.ws2pid].join("-")]=i}catch(e){console.error("[network] Ignoring WS2P head.",e&&e.message||e)}return e}),{}):{}})).catch((function(e){if(e&&e.ucode==l.errorCodes.HTTP_LIMITATION)return o((function(){return f()}),3e3);console.error(e),b.ws2pHeads={}}))},h=function(){return b.bma.blockchain.stats.difficulties().then((function(e){b.difficulties=e.levels?e.levels.reduce((function(e,t){return t.uid&&t.level&&(e[t.uid]=t.level),e}),{}):{}})).catch((function(e){if(e&&e.ucode==l.errorCodes.HTTP_LIMITATION)return o((function(){return h()}),3e3);console.error(e),b.difficulties={}}))},T=function(){b.peers=[],b.searchingPeersOnNetwork=!0,b.loading=!0,b.bma=b.bma||l;var t=[];p&&a.cancel(p),p=a((function(){t.length?R(t):b.loading&&!b.searchingPeersOnNetwork&&(b.loading=!1,a.cancel(p),S(!0),console.debug("[network] Finish: {0} peers found.".format(b.peers.length)))}),1e3);var n=[b.bma.wot.member.uids().then((function(e){b.uidsByPubkeys=e})).catch((function(e){console.error(e),b.uidsByPubkeys={}})),f()];return b.expertMode&&n.push(h()),i.all(n).then((function(){return b.bma&&b.bma.network.peers()})).then((function(n){if(n&&n.peers&&n.peers.length){if(!b.filter.online)return i.all(_(n&&n.peers||[]).reduce((function(e,n){return e.concat(I(n,t))}),[]));var a=[];_.forEach(n.peers,(function(e){"UP"===e.status&&(e.blockNumber=e.block&&parseInt(e.block.split("-")[0]),e.blockNumber&&e.blockNumber<b.minOnlineBlockNumber?console.debug("[network] Exclude a too old peer document, on pubkey {0}".format(e.pubkey.substring(0,6))):(a.push(I(e,t)),_.forEach(e.endpoints||[],(function(t){if(t.startsWith("WS2P")){var n=e.pubkey+"-"+t.split(" ")[1];b.ws2pHeads[n]&&(b.ws2pHeads[n].hasEndpoint=!0)}}))))}));var o=_.values(b.ws2pHeads);if(o&&o.length){var r=0;_.forEach(o,(function(n){if(!n.hasEndPoint){var i=n.buid&&parseInt(n.buid.split("-")[0]);if(i&&i<b.minOnlineBlockNumber)return void console.debug("[network] Exclude a too old WS2P message, on pubkey {0}".format(n.pubkey.substring(0,6)));var a=new e({buid:n.buid,currentNumber:i,pubkey:n.pubkey,version:n.version,powPrefix:n.powPrefix,online:!0,uid:b.uidsByPubkeys[n.pubkey],bma:{useWs2p:!0,private:!0,ws2pid:n.ws2pid},endpoints:["WS2P "+n.ws2pid]});a.id=a.keyID(),a.uid&&b.expertMode&&b.difficulties&&(a.difficulty=b.difficulties[a.uid]),v(a)&&(t.push(a),r++)}})),r&&console.debug("[http] Found {0} WS2P endpoints without endpoint (private ?)".format(r))}return a.length?i.all(a):void 0}})).then((function(){b.searchingPeersOnNetwork=!1})).catch((function(e){console.error(e),b.searchingPeersOnNetwork=!1}))},v=function(e){return!(b.filter&&(b.filter.member&&!b.filter.mirror&&!e.uid||b.filter.mirror&&!b.filter.member&&e.uid||b.filter.endpoint&&!e.hasEndpoint(b.filter.endpoint)||b.filter.online&&"UP"!==e.status&&e.oldBlock||!b.filter.online&&"UP"===e.status&&!e.oldBlock||angular.isDefined(b.filter.bma)&&e.isBma()!=b.filter.bma||angular.isDefined(b.filter.ws2p)&&e.isWs2p()!=b.filter.ws2p||angular.isDefined(b.filter.ssl)&&e.isSsl()!=b.filter.ssl||angular.isDefined(b.filter.tor)&&e.isTor()!=b.filter.tor))},I=function(e,t){t=t||b.newPeers,e.blockNumber=e.block&&parseInt(e.block.split("-")[0]),e.oldBlock="UP"===e.status&&e.blockNumber&&e.blockNumber<b.minOnlineBlockNumber;var n=O(e),a=!1,o=n.reduce((function(e,n){var i=_.findWhere(b.peers,{id:n.id}),o=i?i.buid:null,r=!!i&&i.online;return e.concat(N(n).then((function(e){if(i)if(!e||e.online!==b.filter.online&&"all"!==b.filter.online){var s=b.peers.indexOf(i);-1!==s&&(console.debug("[network] Peer [{0}] removed (cause: {1})".format(n.server,e?e.online?"UP":"DOWN":"filtered")),b.peers.splice(s,1),a=!0)}else e.buid!==o?(console.debug("[network] {0} endpoint [{1}] new current block".format(e.bma&&(e.bma.useBma?"BMA":"WS2P")||"null",e.server)),a=!0):r!==e.online?(console.debug("[network] {0} endpoint [{1}] is now {2}".format(e.bma&&(e.bma.useBma?"BMA":"WS2P")||"null",e.server,e.online?"UP":"DOWN")),a=!0):console.debug("[network] {0} endpoint [{1}] unchanged".format(e.bma&&(e.bma.useBma?"BMA":"WS2P")||"null",e.server));else!e||e.online!==b.filter.online&&"all"!==b.filter.online||(console.debug("[network] {0} endpoint [{1}] is {2}".format(e.bma&&(e.bma.useBma?"BMA":"WS2P")||"null",e.server,e.online?"UP":"DOWN")),t.push(e),a=!0)})))}),[]);return(1===o.length?o[0]:i.all(o)).then((function(){return a}))},O=function(t,n){if(!t)return[];var i=new e(t);if(!n){var a=i.getEndpoints();if(!a)return[];var o=a.reduce((function(e,t){var n=l.node.parseEndPoint(t);return n?e.concat(n):e}),[]);if(o.length>1)return o.reduce((function(e,n){return e.concat(O(t,n))}),[]);n=o[0]}return i.bma=n,i.server=i.getServer(),i.dns=i.getDns(),i.buid=i.buid||i.block,i.blockNumber=i.buid&&parseInt(i.buid.split("-")[0]),i.uid=i.pubkey&&b.uidsByPubkeys[i.pubkey],i.id=i.keyID(),[i]},N=function(e){if(!v(e))return i.when();if(!b.filter.online||!b.filter.online&&"DOWN"===e.status||!e.getHost())return e.online=!1,i.when(e);if(e.bma.useWs2p&&b.ws2pHeads){var t=[e.pubkey,e.bma.ws2pid].join("-"),n=b.ws2pHeads[t];return delete b.ws2pHeads[t],n&&(e.buid=n.buid,e.currentNumber=n.buid&&parseInt(n.buid.split("-")[0]),e.version=n.version,e.powPrefix=n.powPrefix),e.online=!!e.buid,e.uid&&b.expertMode&&b.difficulties&&(e.difficulty=b.difficulties[e.uid]),i.when(e)}return e.bma.useWs2p||!m||e.bma.useSsl?e.bma.useTor||e.bma.useWs2p?(e.online="UP"===e.status,e.buid=-1,delete e.version,e.uid&&b.expertMode&&b.difficulties&&(e.difficulty=b.difficulties[e.uid]),i.when(e)):(e.api=e.api||l.lightInstance(e.getHost(),e.getPort(),e.isSsl(),b.timeout),e.api.blockchain.current(!1).then((function(t){if(!t)throw new Error("Wrong response for /blockchain/current (empty)");return e.currentNumber=t.number,e.online=!0,e.buid=g(t),e.medianTime=t.medianTime,-1===b.knownBlocks.indexOf(e.buid)&&b.knownBlocks.push(e.buid),e})).catch((function(t){if(t&&t.ucode==l.errorCodes.NO_CURRENT_BLOCK)return e.online=!0,e.buid=g({number:0,hash:l.constants.ROOT_BLOCK_HASH}),e.difficulty=0,e;if(!e.secondTry){var n=e.bma||e.getBMA();if(n.dns&&-1===e.server.indexOf(n.dns))return e.secondTry=!0,e.api=l.lightInstance(n.dns,n.port,n.useSsl),N(e)}return e.buid=null,e.blockNumber=null,e.currentNumber=null,e.online=!1,e.uid=b.uidsByPubkeys[e.pubkey],e})).then((function(e){if(!(b.filter.online&&e&&e.online&&b.expertMode))return e;var t=[];return e.uid&&t.push(e.api.blockchain.stats.hardship({pubkey:e.pubkey}).then((function(t){e.difficulty=t?t.level:null})).catch((function(){e.difficulty=null}))),t.push(e.api.node.summary().then((function(t){e.software=t&&t.duniter&&t.duniter.software||void 0,e.version=t&&t.duniter&&t.duniter.version||"?"})).catch((function(){e.software=void 0,e.version="?"}))),i.all(t).then((function(){return e}))}))):(e.online="UP"===e.status,e.buid=-1,delete e.version,e.uid&&b.expertMode&&b.difficulties&&(e.difficulty=b.difficulties[e.uid]),i.when(e))},R=function(e,t){if((e=e||b.newPeers).length){var n=_.map(b.peers,(function(e){return e.id})),i=!1,a=0;_.forEach(e.splice(0),(function(e){n[e.id]||(b.peers.push(e),n[e.id]=e,i=!0,a++)})),i&&(console.debug("[network] Flushing {0} new peers...".format(a)),S(t))}},A=function(e,t,n){if(!e)return 0;var i=0;t>(e=e.toLowerCase()).length&&(t=e.length),i+=e.charCodeAt(0);for(var a=1;a<t;a++)i+=Math.pow(.001,a)*e.charCodeAt(a);return n?1e3-i:i},S=function(e){var t={};b.memberPeersCount=0,_.forEach(b.peers,(function(e){if(e.buid){var n=t[e.buid];n&&n.medianTime?!n.medianTime&&e.medianTime&&(n.medianTime=e.medianTime):(n={buid:e.buid,medianTime:e.medianTime,count:0},t[e.buid]=n),-1!==n.buid&&n.count++}b.memberPeersCount+=e.uid?1:0}));var n,i=b.mainBlock;b.filter.online&&(_.forEach(_.values(t),(function(e){e.pct=100*e.count/b.peers.length})),i=_.max(t,(function(e){return e.count})),_.forEach(b.peers,(function(e){e.hasMainConsensusBlock=e.buid===i.buid,e.hasConsensusBlock=e.buid&&!e.hasMainConsensusBlock&&t[e.buid].count>1,e.hasConsensusBlock&&(e.consensusBlockDelta=t[e.buid].medianTime-i.medianTime)}))),b.peers=_.uniq(b.peers,!1,(function(e){return e.id})),b.peers=_.sortBy(b.peers,(function(e){var n=0;return b.sort.type&&(n+="uid"===b.sort.type?A(e.uid||e.pubkey,3,b.sort.asc):0,n+="api"===b.sort.type&&(e.isWs2p()&&(b.sort.asc?1:-1)||0)+(e.hasEndpoint("ES_USER_API")&&(b.sort.asc?.01:-.01)||0)+(e.isSsl()&&(b.sort.asc?.75:-.75)||0)||0,n+="difficulty"===b.sort.type&&e.difficulty?b.sort.asc?1e4-e.difficulty:e.difficulty:0,n+="current_block"===b.sort.type&&e.currentNumber?b.sort.asc?1e9-e.currentNumber:e.currentNumber:0),n*=1e10,n+=1e9*(e.online?1:0),n+=1e8*(e.hasMainConsensusBlock?1:0),n+=1e6*(e.hasConsensusBlock?t[e.buid].pct:0),b.expertMode?(n+=100*(e.difficulty?1e4-e.difficulty:0),n+=1*(e.uid?A(e.uid,2,!0):0),n+=.001*(e.uid?0:A(e.pubkey,3,!0))):(n+=100*(e.uid?A(e.uid,2,!0):0),n+=.001*(e.uid?0:A(e.pubkey,3,!0))),n+=1e-5*(e.isBma()?e.isSsl()?1:.5:0),e.score=n,-n})),b.groupBy&&b.peers.forEach((function(e){e.compacted=n&&e[b.groupBy]&&e[b.groupBy]===n[b.groupBy],n=e})),e&&i&&i.buid&&(!b.mainBlock||b.mainBlock.buid!==i.buid)&&(b.mainBlock=i,E.data.raise.mainBlockChanged(i)),E.data.raise.changed(b)},C=function(e,t){return t=t||{},l.ready().then((function(){if(L(),b.bma=e||l,b.filter=t.filter?angular.merge(b.filter,t.filter):b.filter,b.sort=t.sort?angular.merge(b.sort,t.sort):b.sort,b.expertMode=angular.isDefined(t.expertMode)?t.expertMode:b.expertMode,b.timeout=angular.isDefined(t.timeout)?t.timeout:s.timeout,b.minOnlineBlockNumber=b.mainBlock&&b.mainBlock.buid&&parseInt(b.mainBlock.buid.split("-")[0])-1e3||void 0,void 0===b.minOnlineBlockNumber)return d.blockchain.current(!0).then((function(e){b.minOnlineBlockNumber=e.number-1e3}))})).then((function(){console.info("[network] Starting network from [{0}]".format(e.server));var t=Date.now();return b.listeners=[b.bma.websocket.block().onListener((function(e){if(e&&!b.loading){var t=[e.number,e.hash].join("-");-1===b.knownBlocks.indexOf(t)&&(console.debug("[network] Receiving block: "+t.substring(0,20)),b.knownBlocks.push(t),1===b.knownBlocks.length||(b.loading=!0,o((function(){console.debug("[network] new block received by WS: will refresh peers"),T()}),2e3,!1)))}})),b.bma.websocket.peer().onListener((function(e){if(e&&!b.loading){var t=[];I(e,t).then((function(e){e&&(t.length>0?R(t,!0):(console.debug("[network] [ws] Peers updated received"),S(!0)))}))}}))],T().then((function(e){return console.debug("[network] Started in "+(Date.now()-t)+"ms"),e}))}))},L=function(){b.bma&&(console.info("[network-service] Stopping..."),_.forEach(b.listeners,(function(e){e()})),b.listeners=[],b.bma=null,b.listeners=[],b.peers.splice(0),b.filter={member:!0,mirror:!0,endpoint:null,online:!0,bma:!1,ssl:void 0,tor:void 0},b.sort={type:null,asc:!0},b.groupBy="pubkey",b.expertMode=!1,b.memberPeersCount=0,b.knownBlocks=[],b.mainBlock=null,b.minOnlineBlockNumber=0,b.uidsByPubkeys={},b.loading=!0,b.searchingPeersOnNetwork=!1,b.difficulties=null,b.ws2pHeads=null,b.timeout=s.timeout)},D=function(e){return b.bma?C().then((function(){return i(e)})):i(e)};return E.registerEvent("data","changed"),E.registerEvent("data","mainBlockChanged"),E.registerEvent("data","rollback"),{data:b,start:C,close:L,hasPeers:function(){return b.peers&&b.peers.length>0},getPeers:function(){return b.peers},sort:function(e){e=e||{},b.filter=e.filter?angular.merge(b.filter,e.filter):b.filter,b.sort=e.sort?angular.merge(b.sort,e.sort):b.sort,S(!1)},getTrustedPeers:function(){return D((function(e,t){e(b.peers.reduce((function(e,t){return t.hasMainConsensusBlock&&t.uid?e.concat(t):e}),[]))}))},getKnownBlocks:function(){return b.knownBlocks},getMainBlockUid:function(){return D((function(e,t){e(b.mainBuid)}))},loadPeers:T,isBusy:function(){return b.loading},api:E}}]),angular.module("cesium.crypto.services",["cesium.utils.services"]).factory("CryptoUtils",["$q","$timeout","ionicReady",function(e,t,n){function i(){this.loaded=!1;var e=this;this.copy=function(t){_.forEach(_.keys(t),(function(n){e[n]=t[n]}))},this.isLoaded=function(){return this.loaded},this.util=this.util||{},this.util.array_to_string=function(e,t){var n=new Blob([new Uint8Array(e)]),i=new FileReader;i.onload=function(e){t(e.target.result)},i.readAsText(n)}}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 n=this;if(null!==Base58)return e(Base58);t((function(){n.async_load_base58(e)}),100)},i.prototype.async_load_scrypt=function(e,n){var i=this;null!==scrypt_module_factory?scrypt_module_factory(e,n):t((function(){i.async_load_scrypt(e,n)}),100)},i.prototype.async_load_nacl_js=function(e,n){var i=this;null!==nacl_factory?nacl_factory.instantiate(e,n):t((function(){i.async_load_nacl_js(e,n)}),100)},i.prototype.async_load_base64=function(e){var n=this;null!==Base64?e(Base64):t((function(){n.async_load_base64(e)}),100)},i.prototype.async_load_sha256=function(e){var n=this;if(null!==sha256)return e(sha256);t((function(){n.async_load_sha256(e)}),100)},i.prototype.seed_from_signSk=function(e){for(var t=new Uint8Array(this.constants.SEED_LENGTH),n=0;n<t.length;n++)t[n]=e[n];return t};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 t=this;function n(e,t){if(0!==t)throw{message:"nacl_raw."+e+" signalled an error"}}function i(e,n,i,o,r){return function(e,t,n,i){if(n.length!==i)throw{message:"nacl."+e+" expected "+i+"-byte "+t+" but got length "+n.length}}(e,n,i,o),function(e,n){var i=n||0,o=a(e.length+i);t.nacl.nacl_raw.HEAPU8.set(e,o+i);for(var r=o;r<o+i;r++)t.nacl.nacl_raw.HEAPU8[r]=0;return o}(i,r)}function a(e){var n=t.nacl.nacl_raw._malloc(e);if(0===n)throw{message:"malloc() failed",nbytes:e};return n}function o(e){t.nacl.nacl_raw._free(e)}function r(e){this.length=e,this.address=a(e)}this.util=this.util||{},this.util.decode_utf8=function(e){var t,n=unescape(encodeURIComponent(e)),i=new Uint8Array(n.length);for(t=0;t<n.length;t++)i[t]=n.charCodeAt(t);return i},this.util.encode_utf8=function(e){return t.nacl.encode_utf8(e)},this.util.encode_base58=function(e){return t.base58.encode(e)},this.util.decode_base58=function(e){var n,i=t.base58.decode(e),a=new Uint8Array(i.length);for(n=0;n<i.length;n++)a[n]=i[n];return a},this.util.decode_base64=function(e){return t.base64.decode(e)},this.util.encode_base64=function(e){return t.base64.encode(e)},this.util.hash_sha256=function(n){return e((function(e){var i=t.util.decode_utf8(n);e(t.nacl.to_hex(t.nacl.crypto_hash_sha256(i)).toUpperCase())}))},this.util.random_nonce=function(){if(t.crypto&&t.crypto.getRandomValues){var n=new Uint8Array(t.constants.crypto_secretbox_NONCEBYTES);return t.crypto.getRandomValues(n),e.when(n)}return e.when(t.nacl.crypto_box_random_nonce())},this.util.crypto_hash_sha256=function(e){return t.nacl.crypto_hash_sha256(e)},this.util.crypto_scrypt=function(n,i,a,o,r,s){return e((function(e,l){try{e(t.scrypt.crypto_scrypt(n,i,a,o,r,s))}catch(e){l(e)}}))},this.box_keypair_from_sign=function(a){return a.boxSk&&a.boxPk?e.when(a):e((function(e,s){try{e((l=i("crypto_box_keypair_from_sign_sk","sk",a.signSk,t.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new r(t.nacl.nacl_raw._crypto_box_secretkeybytes()),n("_crypto_sign_ed25519_sk_to_curve25519",t.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),t.nacl.crypto_box_keypair_from_raw_sk(c.extractBytes())))}catch(e){s(e)}var l,c}))},this.box_pk_from_sign=function(a){return e((function(e,s){try{e((l=i("crypto_box_pk_from_sign_pk","pk",a,t.nacl.nacl_raw._crypto_sign_publickeybytes()),c=new r(t.nacl.nacl_raw._crypto_box_publickeybytes()),n("_crypto_sign_ed25519_pk_to_curve25519",t.nacl.nacl_raw._crypto_sign_ed25519_pk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){s(e)}var l,c}))},this.box_sk_from_sign=function(a){return e((function(e,s){try{e((l=i("crypto_box_sk_from_sign_sk","sk",a,t.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new r(t.nacl.nacl_raw._crypto_box_secretkeybytes()),n("_crypto_sign_ed25519_sk_to_curve25519",t.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){s(e)}var l,c}))},this.box=function(n,i,a,o){return e((function(e,r){if(n){var s=t.nacl.encode_utf8(n);"string"==typeof a&&(a=t.util.decode_base58(a));try{var l=t.nacl.crypto_box(s,i,a,o);e(t.util.encode_base64(l))}catch(e){r(e)}}else e(n)}))},this.box_open=function(n,i,a,o){return e((function(e,r){if(n){var s=t.util.decode_base64(n);"string"==typeof a&&(a=t.util.decode_base58(a));try{var l=t.nacl.crypto_box_open(s,i,a,o);e(t.nacl.decode_utf8(l))}catch(e){r(e)}}else e(n)}))},this.scryptKeypair=function(e,n,i){return t.util.crypto_scrypt(t.util.encode_utf8(n),t.util.encode_utf8(e),i&&i.N||t.constants.SCRYPT_PARAMS.DEFAULT.N,i&&i.r||t.constants.SCRYPT_PARAMS.DEFAULT.r,i&&i.p||t.constants.SCRYPT_PARAMS.DEFAULT.p,t.constants.SEED_LENGTH).then((function(e){var n=t.nacl.crypto_sign_seed_keypair(e),i=t.nacl.crypto_box_seed_keypair(e);return{signPk:n.signPk,signSk:n.signSk,boxPk:i.boxPk,boxSk:i.boxSk}}))},this.seedKeypair=function(n){return e((function(e,i){var a=t.nacl.crypto_sign_seed_keypair(n),o=t.nacl.crypto_box_seed_keypair(n);e({signPk:a.signPk,signSk:a.signSk,boxPk:o.boxPk,boxSk:o.boxSk})}))},this.scryptSignPk=function(n,i,a){return e((function(e,o){try{var r=t.scrypt.crypto_scrypt(t.util.encode_utf8(i),t.util.encode_utf8(n),a&&a.N||t.constants.SCRYPT_PARAMS.DEFAULT.N,a&&a.r||t.constants.SCRYPT_PARAMS.DEFAULT.r,a&&a.p||t.constants.SCRYPT_PARAMS.DEFAULT.p,t.constants.SEED_LENGTH);e(t.nacl.crypto_sign_seed_keypair(r).signPk)}catch(e){o(e)}}))},this.verify=function(n,i,a){return e((function(e,o){var r,s=t.util.decode_utf8(n),l=t.util.decode_base64(i),c=t.util.decode_base58(a),d=new Uint8Array(t.constants.crypto_sign_BYTES+s.length);for(r=0;r<t.constants.crypto_sign_BYTES;r++)d[r]=l[r];for(r=0;r<s.length;r++)d[r+t.constants.crypto_sign_BYTES]=s[r];e(null!==t.nacl.crypto_sign_open(d,c))}))},this.sign=function(n,i){return e((function(e,a){for(var o=t.util.decode_utf8(n),r=i.signSk,s=t.nacl.crypto_sign(o,r),l=new Uint8Array(t.constants.crypto_sign_BYTES),c=0;c<l.length;c++)l[c]=s[c];e(t.base64.encode(l))}))},this.load=function(){var n=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,r=function(){4==++o&&(t.loaded=!0,n.resolve())};return this.async_load_nacl_js((function(e){t.nacl=e,r()}),i),this.async_load_scrypt((function(e){t.scrypt=e,t.scrypt.requested_total_memory=a.requested_total_memory,r()}),a),this.async_load_base58((function(e){t.base58=e,r()})),t.async_load_base64((function(e){t.base64=e,r()})),n.promise},this.util.hash=t.util.hash_sha256,this.box={keypair:{fromSignKeypair:t.box_keypair_from_sign,skFromSignSk:t.box_sk_from_sign,pkFromSignPk:t.box_pk_from_sign},pack:t.box,open:t.box_open},r.prototype.extractBytes=function(e){var n=function(e,n){var i=new Uint8Array(n);return i.set(t.nacl.nacl_raw.HEAPU8.subarray(e,e+n)),i}(this.address+(e||0),this.length-(e||0));return o(this.address),this.address=null,n}}a&&a.getRandomValues&&(i.prototype.crypto=a,i.prototype.util={},i.prototype.util.random_nonce=function(){var t=new Uint8Array(crypto_secretbox_NONCEBYTES);return this.crypto.getRandomValues(t),e.when(t)}),o.prototype=new i,new i;var r=new i;return n().then((function(){console.debug("[crypto] Starting...");var e,t=Date.now();console.debug("[crypto] Loading 'FullJS' implementation..."),(e=new o).load().catch((function(e){throw console.error(e),e})).then((function(){r.copy(e),console.debug("[crypto] Loaded '{0}' implementation in {1}ms".format(r.id,Date.now()-t))}))})),r}]).factory("csCrypto",["$q","$rootScope","$timeout","CryptoUtils","UIUtils","Modals",function(e,t,n,i,a,o){function r(e){return new RegExp(e)}function s(e,t){for(var n=Math.max(e.length,t.length),i=new Uint8Array(n),a=0;a<n;++a)i[a]=e[a]^t[a];return i}function l(e,t){var n=new Uint8Array(e.byteLength+t.byteLength);return n.set(new Uint8Array(e),0),n.set(new Uint8Array(t),e.byteLength),n}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|$)"}}},d={FILE:{TYPE_LINE:r(c.REGEXP.FILE.TYPE_LINE),VERSION:r(c.REGEXP.FILE.VERSION),PUB:r(c.REGEXP.FILE.PUB),SEC:r(c.REGEXP.FILE.SEC),DATA:r(c.REGEXP.FILE.DATA)}},u={BAD_PASSWORD:3001,BAD_CHECKSUM:3002};function p(t,n){if(!t)return e.reject("Argument [content] is missing");var a;(n=n||{}).withSecret=!!angular.isDefined(n.withSecret)&&n.withSecret,n.defaultType=n.defaultType||"PubSec";var o=d.FILE.TYPE_LINE.exec(t),r=o&&o[1];if(!r&&n.defaultType)return p("Type: {0}\n{1}".format(n.defaultType,t),n);if("PubSec"==r){if(!(a=d.FILE.PUB.exec(t)))return e.reject("Missing [pub] field in file, or invalid public key value");var s={signPk:i.base58.decode(a[1])};return n.withSecret?(a=d.FILE.SEC.exec(t))?(s.signSk=i.base58.decode(a[1]),e.resolve(s)):e.reject("Missing [sec] field in file, or invalid secret key value"):e.resolve(s)}return"WIF"==r||"EWIF"==r?(a=d.FILE.DATA.exec(t))?m(a[1],{type:r,password:n.password}).then((function(e){return e&&!n.withSecret?{signPk:e.signPk}:e})):e.reject("Missing [Data] field in file. This is required for WIF or EWIF format"):n.defaultType?e.reject("Bad file format: missing Type field"):e.reject("Bad file format, unknown type ["+r+"]")}function m(t,n){n=n||{};var a=t&&i.base58.decode(t);return!a||a.length!=c.EWIF.DATA_LENGTH&&a.length!=c.WIF.DATA_LENGTH?e.reject("Invalid WIF or EWIF format (invalid bytes count)."):(n.type=n.type||1==a[0]&&"WIF"||2==a[0]&&"EWIF","WIF"==n.type?function(t){var n=i.util.decode_base58(t);if(1!=n[0])return e.reject({message:"Invalid WIF v1 format: expected [0x01] as first byte"});if(n.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=n.slice(0,-2),o=n.slice(1,-2),r=n.slice(-2),s=i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(a)).slice(0,2);return i.util.encode_base58(r)!=i.util.encode_base58(s)&&e.reject({message:"Invalid WIF format: bad checksum"}),i.seedKeypair(o)}(t):"EWIF"==n.type?"function"!=typeof n.password||(n.password=n.password(),n.password)?"object"==typeof n.password&&n.password.then?n.password.then((function(e){if(!e)throw"CANCELLED";return E(t,e)})):"string"==typeof n.password?E(t,n.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(t,n){var a=i.util.decode_base58(t);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),r=a.slice(-2),d=a.slice(1,5),p=a.slice(5,21),m=a.slice(21,37);return i.util.crypto_scrypt(i.util.encode_utf8(n),d,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var t=e.slice(0,32),n=e.slice(32,64),i=new aesjs.ModeOfOperation.ecb(n),a=i.decrypt(p),o=i.decrypt(m);return a=new Uint8Array(a),o=new Uint8Array(o),l(s(a,t.slice(0,16)),s(o,t.slice(16,32)))})).then(i.seedKeypair).then((function(e){var t=i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(e.signPk)).slice(0,4);if(i.util.encode_base58(d)!==i.util.encode_base58(t))throw{ucode:u.BAD_PASSWORD,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"};var n=i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(o)).slice(0,2);if(i.util.encode_base58(r)!=i.util.encode_base58(n))throw{ucode:u.BAD_CHECKSUM,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM"};return e}))}function b(t){if(!t)throw new Error("Missing keypair");return t.boxPk&&t.boxSk?e.when(t):e.all([i.box.keypair.skFromSignSk(t.signSk),i.box.keypair.pkFromSignPk(t.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{errorCodes:u,constants:c,util:angular.extend({pkChecksum:function(e){var t=i.util.decode_base58(e);return i.util.encode_base58(i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(t))).substring(0,3)}},i.util),keyfile:{read:function(t,n){return t&&t.content?p(t.content,n):e((function(e,i){if(!t)return i("Argument [file] is missing");var a=new FileReader;a.onload=function(t){p(t.target.result,n).then(e).catch(i)},a.readAsText(t,"utf8")}))},parseData:function e(t,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 n((function(){return e&&a.loading.show(),e}),150)}))},i.silent||a.loading.show(),m(t,i).then((function(e){return e})).catch((function(n){if(!n||"CANCELLED"!==n){if(n&&n.ucode==u.BAD_PASSWORD)return e(t,{withSecret:i.withSecret,error:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"});throw console.error("[crypto] Unable to parse as WIF or EWIF format: "+(n&&n.message||n)),n}}))},generateContent:function t(n,a){switch((a=a||{}).type=a.type||"PubSec",a.type){case"PubSec":return e.resolve("Type: PubSec\nVersion: 1\npub: "+i.base58.encode(n.signPk)+"\nsec: "+i.base58.encode(n.signSk)+"\n");case"WIF":return function(t){var n=i.seed_from_signSk(t.signSk);if(!n||n.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,n),r=l(o,i.util.crypto_hash_sha256(i.util.crypto_hash_sha256(o)).slice(0,2));return e.when(i.util.encode_base58(r))}(n).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 t(n,angular.merge({},a,{password:e}))})):a.password&&"string"==typeof a.password?function(t,n){var a=i.seed_from_signSk(t.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(t.signPk)).slice(0,4);return i.util.crypto_scrypt(i.util.encode_utf8(n),o,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var t=e.slice(0,32),n=e.slice(32,64),r=s(a.slice(0,16),t.slice(0,16)),c=s(a.slice(16,32),t.slice(16,32)),d=new aesjs.ModeOfOperation.ecb(n),u=d.encrypt(r),p=d.encrypt(c);u=new Uint8Array(u),p=new Uint8Array(p);var m=new Uint8Array(1);return m[0]=2,m=l(m,o),m=l(m,u),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)}))}(n,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:b,pack:function(t,n,a,o,r){if(!t[a=a||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(o=o||"content")&&(o=[o]),t=angular.copy(t);var s=i.util.decode_base58(t[a]);return e.all([b(n),i.box.keypair.pkFromSignPk(s),r?e.when(r):i.util.random_nonce()]).then((function(n){var a=n[0].boxSk,r=n[1],s=n[2];return e.all(o.reduce((function(e,n){return t[n]?e.concat(i.box.pack(t[n],s,r,a)):e}),[])).then((function(e){var n=0;return _.forEach(o,(function(i){t[i]?t[i]=e[n++]:t[i]=null})),t.nonce=i.util.encode_base58(s),t}))}))},open:function(t,n,a,o){a=a||"issuer","string"==typeof(o=o||"content")&&(o=[o]);var r=Date.now(),s={},l=[b(n)];return e.all(t.reduce((function(e,t){var n=t[a];if(!n)throw"Record has no "+a;return s[n]?res:e.concat(i.box.keypair.pkFromSignPk(i.util.decode_base58(n)).then((function(e){s[n]=e})))}),l)).then((function(n){var r=n[0];return e.all(t.reduce((function(e,t){var n=s[t[a]],l=i.util.decode_base58(t.nonce);return t.valid=!0,e.concat(o.reduce((function(e,a){return t[a]?e.concat(i.box.open(t[a],l,n,r.boxSk).then((function(e){t[a]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+a),t.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+(Date.now()-r)+"ms"),t}))}}}}]),angular.module("cesium.utils.services",["angular-fullscreen-toggle"]).factory("ionicReady",["$ionicPlatform",function(e){var t;return function(){return t||(t=e.ready()),t}}]).factory("UIUtils",["$ionicLoading","$ionicPopup","$ionicConfig","$ionicHistory","$translate","$q","ionicMaterialInk","ionicMaterialMotion","$window","$timeout","Fullscreen","$ionicPopover","$state","$rootScope","screenmatch",function(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){var b,g=null,f={smallscreen:E.bind("xs, sm",m)},h={};function T(e,n){return e?o((function(i){a([e,"ERROR.POPUP_TITLE","ERROR.UNKNOWN_ERROR","COMMON.BTN_OK"].concat(n?[n]:[])).then((function(a){var o=e.message||a[e];return t.show({template:"<p>"+(o||a["ERROR.UNKNOWN_ERROR"])+"</p>",title:a["ERROR.POPUP_TITLE"],subTitle:n&&a[n]||void 0,buttons:[{text:"<b>"+a["COMMON.BTN_OK"]+"</b>",type:"button-assertive",onTap:function(e){i(e)}}]})}))})):o.when()}function v(e,n,i){return e?((i=i||{}).cssClass=i.cssClass||"info",i.okText=i.okText||"COMMON.BTN_OK",o((function(o){a([e,"INFO.POPUP_TITLE",i.okText].concat(n?[n]:[])).then((function(a){t.show({template:"<p>"+a[e]+"</p>",title:a["INFO.POPUP_TITLE"],subTitle:n&&a[n]||void 0,cssClass:i.cssClass,buttons:[{text:a[i.okText],type:"button-positive",onTap:function(e){o(e)}}]})}))}))):o.reject("Missing 'message' argument")}function I(t){return t?c((function(){return e.hide()}),t):e.hide()}function O(t){return g?((t=t||{}).template=t.template||g,e.show(t)):a("COMMON.LOADING").then((function(e){return g=e,O(t)}))}function N(){return f.smallscreen.active}function R(e,t,n){return function(t){var i,a=t.target.width,o=t.target.height,r=n?200:640,s=n?200:480,l=document.createElement("canvas");if(n){a>o?(a*=s/o,o=s):(o*=r/a,a=r),l.width=r,l.height=s,i=l.getContext("2d");var c=Math.trunc((r-a)/2+.5),d=Math.trunc((s-o)/2+.5);i.drawImage(t.target,c,d,r+-2*c,s+-2*d)}else a>o?a>r&&(o*=r/a,a=r):o>s&&(a*=s/o,o=s),l.width=a,l.height=o,(i=l.getContext("2d")).drawImage(t.target,0,0,l.width,l.height);var u=l.toDataURL();l.remove(),e(u)}}function A(e,t){var n=o.defer();(t=t||{}).templateUrl=t.templateUrl?t.templateUrl:"templates/common/popover_copy.html",t.scope=t.scope||m,t.scope.popovers=t.scope.popovers||{},t.autoselect=t.autoselect||!1,t.autoremove=!angular.isDefined(t.autoremove)||t.autoremove,t.backdropClickToClose=!angular.isDefined(t.backdropClickToClose)||t.backdropClickToClose,t.focusFirstInput=!!angular.isDefined(t.focusFirstInput)&&t.focusFirstInput;var i=function(i){(i=i||t.scope.popovers[t.templateUrl]).isResolved=!1,i.deferred=n,i.options=t,t.bindings&&angular.merge(i.scope,t.bindings),c((function(){i.show(e).then((function(){var e;t.autoselect?(e=document.querySelectorAll(t.autoselect)[0])&&(l.getSelection&&!l.getSelection().toString()?(e.setSelectionRange(0,e.value.length),e.focus()):e.focus()):t.autofocus&&(e=document.querySelectorAll(t.autofocus)[0])&&e.focus(),i.scope.$parent.$emit("popover.shown"),t.afterShow&&t.afterShow(i)}))}))},a=function(e){(e=e||t.scope.popovers[t.templateUrl])&&(delete t.scope.popovers[t.templateUrl],e.remove().then((function(){angular.element(l.document.querySelectorAll("body")[0]).removeClass("popover-open")})))},r=t.scope.popovers[t.templateUrl];return r?i(r):u.fromTemplateUrl(t.templateUrl,{scope:t.scope,backdropClickToClose:t.backdropClickToClose}).then((function(e){e.isResolved=!1,e.scope.closePopover=function(t){var n=e.options&&e.options.autoremove;e.options&&delete e.options.autoremove,e.hide().then((function(){if(n)return a(e)})).then((function(){e.deferred&&e.deferred.resolve(t),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)})),t.scope.$on("$remove",(function(){e.deferred&&e.deferred.resolve(),a()})),t.scope.popovers[t.templateUrl]=e,i(e)})),n.promise}function S(e,t){var n=N()?100:10,i=".list.{0} .item, .list .{0} .item".format(t,t);return{ionListClass:t,show:function(t){return(t=t||{}).selector=t.selector||i,t.ink=!angular.isDefined(t.ink)||t.ink,t.startVelocity=t.startVelocity||(N()?1100:3e3),c((function(){t.ink&&b.ink(),e(t)}),t.timeout||n)}}}function C(e,t,n,i,a){a=a||"default",qrcode.stringToBytes=qrcode.stringToBytesFuncs[a];var o=qrcode(t||4,n||"M");return o.addData(e,i),o.make(),o}function L(e,t){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOn selector"),!1;c((function(){var t=document.querySelectorAll(e.selector);t&&_.forEach(t,(function(e){e.classList.toggle("on",!0)}))}),t||100)}function D(e,t){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOff selector"),!1;c((function(){var t=document.querySelectorAll(e.selector);t&&_.forEach(t,(function(e){e.classList.toggle("on",!1)}))}),t||900)}return h.motion={enable:!0,default:S(s.ripple,"animate-ripple"),blinds:S(s.blinds,"animate-blinds"),fadeSlideIn:S(s.fadeSlideIn,"animate-fade-slide-in"),fadeSlideInRight:S(s.fadeSlideInRight,"animate-fade-slide-in-right"),panInLeft:S(s.panInLeft,"animate-pan-in-left"),pushDown:S(s.pushDown,"push-down"),ripple:S(s.ripple,"animate-ripple"),slideUp:S(s.slideUp,"slide-up"),fadeIn:S((function(e){L(e)}),"fade-in"),toggleOn:L,toggleOff:D},b={alert:{error:T,info:v,confirm:function(e,n,i){return n=n||"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,n,i.cancelText,i.okText]).then((function(a){return t.confirm({template:a[e],cssClass:i.cssClass,title:a[n],cancelText:a[i.cancelText],cancelType:i.cancelType,okText:a[i.okText],okType:i.okType})}))},notImplemented:function(){return v("INFO.FEATURES_NOT_IMPLEMENTED")},demo:function(){return a(["MODE.DEMO.FEATURE_NOT_AVAILABLE","MODE.DEMO.INSTALL_HELP"]).then((function(e){return v(e["MODE.DEMO.FEATURE_NOT_AVAILABLE"]+"<br/><br/>"+e["MODE.DEMO.INSTALL_HELP"],void 0,{cssClass:"large"})}))}},loading:{show:O,hide:I,update:function(t){return e._getLoader().then((function(e){if(e&&e.isShown)return t&&t.template?a(t&&t.template).then((function(n){return t.template=n,e})):void 0})).then((function(e){if(e&&e.isShown)return O(t)}))}},toast:{show:function(t,n,i){return t?(n=n||"short",i=i||"bottom",a([t]).then((function(i){return"string"==typeof n&&(n="short"==n?2e3:5e3),e.show({template:i[t],noBackdrop:!0,duration:n})}))):o.reject("Missing 'message' argument")}},onError:function(e,t){return function(n){var i,a=e;if(n&&n.message?(a=n.message,i=e):e||(a=n),!t)return"CANCELLED"===a?I(10):(I(10),T(a,i));t(a)}},screen:{isSmall:N,fullscreen:d},ink:r.displayEffect,motion:h.motion,setEffects:function(e){if(b.motion.enable!==e){if(console.debug("[UI] [effects] "+(e?"Enable":"Disable")),b.motion.enable=e,e)n.views.transition("platform"),angular.merge(b.motion,h.motion);else{n.views.transition("none");var t={class:void 0,show:function(){}};angular.merge(b.motion,{enable:!1,default:t,fadeSlideIn:t,fadeSlideInRight:t,panInLeft:t,pushDown:t,ripple:t,slideUp:t,fadeIn:t,toggleOn:L,toggleOff:D}),m.motion=t}i.clearCache()}},qrcode:{svg:function(e,t,n,i,a){return C(e,t,n,i,a).createSvgTag()},img:function(e,t,n,i,a){return C(e,t,n,i,a).createImgTag()}},fab:{show:function(e,t){t||(t=900),c((function(){var t=document.getElementsByClassName("button-fab");_.forEach(t,(function(t){t.id==e&&t.classList.toggle("on",!0)}))}),t)},hide:function(e,t){t||(t=10),c((function(){var t=document.getElementsByClassName("button-fab");_.forEach(t,(function(t){t.id==e&&t.classList.toggle("on",!1)}))}),t)}},popover:{show:A,copy:function(e,t){var n=t&&t.indexOf("\n")>=0?t.split("\n").length:1;return A(e,{templateUrl:"templates/common/popover_copy.html",bindings:{value:t,rows:n},autoselect:".popover-copy "+(n<=1?"input":"textarea")})},share:function(e,t){return(t=t||{}).templateUrl=t.templateUrl?t.templateUrl:"templates/common/popover_share.html",t.autoselect=t.autoselect||".popover-share input",t.bindings=t.bindings||{},t.bindings.value=t.bindings.value||t.bindings.url||p.href(p.current,p.params,{absolute:!0}),t.bindings.postUrl=t.bindings.postUrl||t.bindings.value,t.bindings.postMessage=t.bindings.postMessage||"",t.bindings.titleKey=t.bindings.titleKey||"COMMON.POPOVER_SHARE.TITLE",A(e,t)},helptip:function e(t,n){var i="string"==typeof t&&t?l.document.getElementById(t):t;t||i||!n.selector||(i=l.document.querySelector(n.selector));var a=(n=n||{}).deferred||o.defer();if(i&&!n.timeout)n.preAction&&i[n.preAction](),n.templateUrl=n.templateUrl?n.templateUrl:"templates/common/popover_helptip.html",n.autofocus=n.autofocus||"#helptip-btn-ok",n.bindings=n.bindings||{},n.bindings.icon=n.bindings.icon||{},n.bindings.icon.position=n.bindings.icon.position||!1,n.bindings.icon.glyph=n.bindings.icon.glyph||(n.bindings.icon.position&&n.bindings.icon.position.startsWith("bottom-")?"ion-arrow-down-c":"ion-arrow-up-c"),n.bindings.icon.class=n.bindings.icon.class||"calm icon "+n.bindings.icon.glyph,n.bindings.tour=!!angular.isDefined(n.bindings.tour)&&n.bindings.tour,A(i,n).then((function(e){n.postAction&&i[n.postAction](),a.resolve(e)})).catch((function(e){n.postAction&&i[n.postAction](),a.reject(e)}));else if(n.timeout){var r=n.timeout;n.retryTimeout=n.retryTimeout||r,delete n.timeout,n.deferred=a,c((function(){e(t,n)}),r)}else angular.isDefined(n.retry)&&!n.retry?"continue"===n.onError?c((function(){a.resolve(!0)})):c((function(){a.reject("[helptip] element now found: "+t)})):(n.retry=angular.isUndefined(n.retry)?2:n.retry-1,n.deferred=a,c((function(){e(t,n)}),n.timeout||n.retryTimeout||100));return a.promise}},selection:{select:function e(t){if(t.value||"text"==t.type||"textarea"==t.type)l.getSelection&&!l.getSelection().toString()&&t.setSelectionRange(0,t.value.length);else if(t.childNodes&&t.childNodes.length>0)e(t.childNodes[0]);else{var n=l.document.createRange();n.selectNodeContents(t);var i=l.getSelection();i.removeAllRanges(),i.addRange(n)}},get:function(){var e="";return window.getSelection&&(e=l.getSelection().toString()),e}},image:{resizeFile:function(e,t){var n=document.createElement("img");return o((function(i,a){if(e){var o=new FileReader;o.onload=function(e){n.onload=R(i,0,t),n.src=e.target.result},o.readAsDataURL(e)}else a("no file to resize")})).then((function(e){return n.remove(),e}))},resizeSrc:function(e,t){var n=document.createElement("img");return o((function(i,a){n.onload=R(i,0,t),n.src=e})).then((function(e){return n.remove(),e}))},rotateSrc:function(e,t){var n=document.createElement("img");return o((function(t,i){n.onload=function(e,t){var n=Math.PI/180*90;return function(t){var i=t.target.width,a=t.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 r=o.getContext("2d");r.rotate(n),r.drawImage(t.target,0,-1*o.width);var s=o.toDataURL();o.remove(),e(s)}}(t),n.src=e})).then((function(e){return n.remove(),e}))}},raw:h}}]).factory("$focus",["$timeout","$window",function(e,t){return function(n){e((function(){var e=t.document.getElementById(n);e&&e.focus()}))}}]),angular.module("cesium.cache.services",["angular-cache"]).factory("csCache",["$rootScope","$http","$window","csSettings","CacheFactory",function(e,t,n,i,a){var o={VERY_LONG:54e6,LONG:36e5,MEDIUM:3e5,SHORT:i.defaultSettings.cacheTimeMs},r=l(),s=[];function l(e){return(e=e||i.data)&&e.useLocalStorage&&e.persistCache&&n.localStorage?"localStorage":"memory"}function c(e){return(e=e||{}).storageMode=l(),e.deleteOnExpire="localStorage"===e.storageMode||e.onExpire?"aggressive":"passive",e.cacheFlushInterval="passive"===e.deleteOnExpire?36e5:null,e}function d(e){var t=l(e);t!==r&&(r=t,console.debug("[cache] Updating caches with {storageMode: {0}}".format(r)),_.forEach(_.keys(s),(function(e){var t=a.get(e);t&&t.setOptions(c(),!0)})))}return function(){listeners=[i.api.data.on.changed(e,d,this)]}(),{get:function(e,t,n){var i,r=(e=e||"")+((t=t||o.SHORT)/1e3+"s");if(n&&"function"==typeof n){for(var l=1;a.get(r+l);)l++;r+=l}else i=a.get(r);if(s[r]||(s[r]=!0),i)return i;var d=c({maxAge:t,onExpire:n||null});return console.debug("[cache] Creating cache {{0}} with {storageMode: {1}}...".format(r,d.storageMode)),a.createCache(r,d)},clear:function(e){_.forEach(_.keys(s),(function(t){if(t.startsWith(e)){var n=a.get(t);n&&n.removeAll()}}))},clearAll:function(){console.debug("[cache] Cleaning all caches..."),_.forEach(_.keys(s),(function(e){var t=a.get(e);t&&t.removeAll()}))},constants:o}}]),angular.module("cesium.modal.services",["cesium.utils.services"]).controller("EmptyModalCtrl",(function(){})).controller("AboutModalCtrl",["$scope","csConfig","UIUtils","csHttp","filterTranslations",function(e,t,n,i,a){e.openLink=function(e,t,a){return(a=a||{}).onError=function(){return n.popover.copy(e,t)},i.uri.open(t,a)},e.buildDate=moment(t.build).format(a.DATE_PATTERN||"YYYY-MM-DD HH:mm")}]).factory("ModalUtils",["$ionicModal","$rootScope","$q","$injector","$controller","$timeout","Device",function(e,t,n,i,a,o,r){function s(e,t,i){e.deferred=t||n.defer(),e.resolved=!1,e.openModal=function(){return e.modal.show()},e.hideModal=function(){return e.modal.hide()},e.closeModal=function(t){return e.resolved=!0,e.modal.remove().then((function(){return document.body.classList.remove("modal-open"),e.deferred.resolve(t),t}))},e.setForm=function(t,n){n?e[n]=t:e.form=t},e.getParameters=function(){return i},e.$on("modal.hidden",(function(){e.resolved||(e.resolved=!0,o((function(){return e.deferred.resolve(),e.modal.remove().then((function(){document.body.classList.remove("modal-open")}))}),(e.modal.hideDelay||320)+20))}))}return{show:function(i,o,r,l){var c,d,u,p,m=n.defer();if((l=l||{}).animation=l.animation||"slide-in-up",c=!!angular.isDefined(l.focusFirstInput)&&l.focusFirstInput,l.focusFirstInput=c,o){l.scope=l.scope?l.scope.$new():t.$new(),s.call({},l.scope,m,r);var E={$scope:l.scope,parameters:r},b=(u={isControllerAs:!1,controllerName:"",propName:""},p=((d=o)||"").trim().split(/\s+/),u.isControllerAs=3===p.length&&"as"===(p[1]||"").toLowerCase(),u.isControllerAs?(u.controllerName=p[0],u.propName=p[2]):u.controllerName=d,u),g=a(o,E);b.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 t=e.scope;s.call({},t,m,r),t.modal=e}return e.show()}),(function(e){m.reject(e)})),m.promise}}}]).factory("Modals",["$rootScope","$translate","$ionicPopup","$timeout","ModalUtils","UIUtils",function(e,t,n,i,a,o){function r(e){return a.show("templates/join/modal_join_member.html","JoinModalCtrl",e)}function s(e){return a.show("templates/join/modal_join_wallet.html","JoinModalCtrl",e)}return{showTransfer:function(e){var t=o.screen.isSmall();return a.show("templates/wallet/modal_transfer.html","TransferModalCtrl",e,{focusFirstInput:!t})},showLogin:function(e){return a.show("templates/login/modal_login.html","LoginModalCtrl",e,{focusFirstInput:!0,backdropClickToClose:!1})},showWotLookup:function(e){return a.show("templates/wot/modal_lookup.html","WotLookupModalCtrl",e||{},{focusFirstInput:!0})},showNetworkLookup:function(e){return a.show("templates/network/modal_network.html","NetworkLookupModalCtrl",e,{focusFirstInput:!0})},showAbout:function(e){return a.show("templates/modal_about.html","AboutModalCtrl",e)},showJoin:function(e){return a.show("templates/join/modal_choose_account_type.html","JoinChooseAccountTypeModalCtrl",e).then((function(e){if(e)return"member"==e.accountType?r(e):s(e)}))},showJoinMember:r,showJoinWallet:s,showHelp:function(e){return a.show("templates/help/modal_help.html","HelpModalCtrl",e)},showAccountSecurity:function(e){return a.show("templates/wallet/modal_security.html","WalletSecurityModalCtrl",e)},showLicense:function(e){return a.show("templates/currency/modal_license.html","CurrencyLicenseModalCtrl",e)},showSelectPubkeyIdentity:function(e){return a.show("templates/wot/modal_select_pubkey_identity.html","WotSelectPubkeyIdentityModalCtrl",e)},showSelectWallet:function(e){return a.show("templates/wallet/list/modal_wallets.html","WalletSelectModalCtrl",e)},showPassword:function(i){(i=i||{}).title=i.title||"COMMON.SET_PASSWORD_TITLE",i.subTitle=i.subTitle||"COMMON.SET_PASSWORD_SUBTITLE";var a=i.scope?i.scope.$new():e.$new();return a.formData={password:void 0},a.setForm=function(e){a.form=e},a.submit=function(e){a.form.$submitted=!0,e&&e.preventDefault&&e.preventDefault(),a.form.$valid&&a.formData.password&&i.popup.close(a.formData.password)},a.error=i.error||void 0,t([i.title,i.subTitle,"COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(e){return i.popup=n.show({templateUrl:"templates/common/popup_password.html",title:e[i.title],subTitle:e[i.subTitle],scope:a,buttons:[{text:e["COMMON.BTN_CANCEL"]},{text:e["COMMON.BTN_OK"],type:"button-positive",onTap:a.submit}]}),i.popup}))}}}]).factory("csPopovers",["$rootScope","$translate","$ionicPopup","$timeout","UIUtils","$controller",function(e,t,n,i,a,o){return{showSelectWallet:function(t,n){var i=(n=n||{}).parameters||{};delete n.parameters;var r=n.scope&&n.scope.$new()||e.$new(!0);n.scope=r,n.templateUrl="templates/wallet/list/popover_wallets.html",n.autoremove=!0,angular.extend(this,o("WalletSelectPopoverCtrl",{$scope:n.scope,parameters:i}));var s=n.afterShow;return n.afterShow=function(e){r.closePopover=function(t){e.scope.closePopover(t)},s&&s(e)},a.popover.show(t,n).then((function(e){return r.$destroy(),e}))}}}]),angular.module("cesium.http.services",["cesium.cache.services"]).factory("csHttp",["$http","$q","$timeout","$window","csSettings","csCache","Device",function(e,t,n,i,a,o,r){var s=a.data.timeout,l=[],c={};function d(e,t){return e?e+(t&&80!=t&&443!=t?":"+t:""):null}function u(e,t,n,i){return(443==t||i?"https":"http")+"://"+d(e,t)+(n||"")}function p(e,t,n,i){t&&t.message?e(t):403==i?e({ucode:403,message:"Resource is forbidden"+(n?" ("+n+")":"")}):404==i?e({ucode:404,message:"Resource not found"+(n?" ("+n+")":"")}):n?(console.error("[http] Get HTTP error {status: "+i+"} on ["+n+"]"),e("Error while requesting ["+n+"]")):e("Unknown error from node")}function m(e,t,n,i){var a=[],o={},r=e;return"object"==typeof t&&(a=_.keys(t)),_.forEach(a,(function(e){r===(r=r.replace(":"+e,t[e]))&&(o[e]=t[e])})),n.params=o,i(r,n)}function E(e){var t;e.startsWith("duniter://")&&(t="duniter",e=e.replace("duniter://","http://"));var n=document.createElement("a");n.href=e;var i=n.pathname;i&&i.startsWith("/")&&(i=i.substring(1));var a={protocol:t||n.protocol,hostname:n.hostname,host:n.host,port:n.port,username:n.username,password:n.password,pathname:i,search:n.search,hash:n.hash};return n.remove(),a}function b(e,t){var n=e.split("."),i=t.split(".");function a(e){for(var t=0;t<e.length;++t){if(n=e[t],!/^\d+$/.test(n))return!1;e[t]=parseInt(e[t])}var n;return!0}if(!a(n)||!a(i))return NaN;for(var o=0;o<n.length;++o){if(i.length===o)return 1;if(n[o]!==i[o])return n[o]>i[o]?1:-1}return n.length!=i.length?-1:0}return s||(s=4e3),{get:function(n,i,a,o,r){if(!n)return t.reject("[http] invalid URL from host: "+n);var l=u(n,i,a,o);return function(n){return t((function(t,i){m(l,n,{timeout:r||s,responseType:"json"},(function(n,a){e.get(n,a).success((function(e,n,i,a){t(e)})).error((function(e,t,a,o){p(i,e,n,t)}))}))}))}},getWithCache:function(n,i,a,r,l,d,E,b){var g=u(n,i,a,r);return b=b||"csHttp-",l=l||o.constants.LONG,c[b]=!0,function(n){return t((function(t,i){var a={timeout:E||s,responseType:"json"};a.cache=d?o.get(b,l,(function(t,n,i){console.debug("[http] Refreshing cache for {{0}} ".format(t)),e.get(t,a).success((function(e){a.cache.put(t,e),i&&i(t,e)}))})):o.get(b,l),m(g,n,a,(function(n,a){e.get(n,a).success((function(e){t(e)})).error((function(e,t){p(i,e,n,t)}))}))}))}},post:function(n,i,a,o,r){var l=u(n,i,a,o);return function(n,i){return t((function(t,a){m(l,i,{timeout:r||s,headers:{"Content-Type":"application/json;charset=UTF-8"}},(function(i,o){e.post(i,n,o).success((function(e){t(e)})).error((function(e,t){p(a,e,i,t)}))}))}))}},ws:function(e,i,o,r,s){if(!o)throw console.error("calling csHttp.ws without path argument"),"calling csHttp.ws without path argument";var c=function(e,t,n,i){return(443==t||i?"wss":"ws")+"://"+d(e,t)+(n||"")}(e,i,o,r);function u(e){if(!e.delegate)throw new Error("Websocket {0} was closed!".format(c));return 1==e.delegate.readyState?t.when(e.delegate):3==e.delegate.readyState?t.reject("Unable to connect to websocket ["+e.delegate.url+"]"):(e.waitDuration>=s?(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+"]..."),n((function(){return e.waitDuration+=e.waitRetryDelay,u(e)}),e.waitRetryDelay))}function p(e,t,n){return e.delegate||(e.path=o,e.callbacks=[],e.waitDuration=0,e.waitRetryDelay=200,m(c,n,{},(function(t){e.delegate=new WebSocket(t),e.delegate.onerror=function(t){e.delegate.readyState=3},e.delegate.onmessage=function(t){var n=JSON.parse(t.data);_.forEach(e.callbacks,(function(e){e(n)}))},e.delegate.onopen=function(t){console.debug("[http] Listening on websocket ["+e.path+"]..."),l.push(e),e.delegate.openTime=Date.now()},e.delegate.onclose=function(t){var i=_.findIndex(l,(function(t){return t.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,p(e,null,n)):t&&(console.debug("[http] Unexpected close of websocket [{0}]: error code: ".format(o),t&&t.code||t),e.delegate=null,p(e,null,n))}}))),t&&e.callbacks.push(t),u(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 s=s||a.data.timeout,{open:function(e){return p(this,null,e)},on:function(e,t){return p(this,e,t)},onListener:function(e,t){var n=this;return p(n,e,t),function(){!function(e,t){e.callbacks=_.reject(e.callbacks,(function(e){return e===t})),e.callbacks.length||E(e)}(n,e)}},send:function(e){var t=this;return u(t).then((function(){t.delegate&&t.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:d,uri:{parse:E,open:function(e,t){if(t=t||{},!e.startsWith("http://")&&!e.startsWith("https://")){var n=E(e);if(!n.protocol&&t.type&&(n.protocol="email"==t.type?"mailto:":"phone"==t.type?"tel:":"",e=n.protocol+e),"mailto:"==n.protocol&&r.isDesktop())try{return void(void 0).Shell.openExternal(e)}catch(e){console.error("[http] Failed not open 'mailto:' URI into external tool.")}if("mailto:"!=n.protocol&&"tel:"!=n.protocol||!r.enable)return void(t.onError&&"function"==typeof t.onError&&t.onError(e))}var a,o=t.target||(r.enable?"_system":"_blank");if("_blank"===o||"_system"===o&&r.isDesktop())try{return void(void 0).Shell.openExternal(e)}catch(e){console.error("[http] Failed not open URI into external browser.")}"_blank"===o&&r.isDesktop()&&(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 s=i.open(e,o,a);a&&i.screen&&i.screen.width&&i.screen.height&&(s.moveTo(i.screen.width/2/2,i.screen.height/2/2),s.focus())}},date:{now:function(){return moment().utc().unix()}},version:{compare:b,isCompatible:function(e,t){return console.debug("[http] Checking actual version [{0}] is compatible with min expected version [{1}]".format(t,e)),b(e,t)<=0}},cache:angular.merge({clear:function(e){e=e||"csHttp-",console.debug("[http] Cleaning cache {prefix: '{0}'}...".format(e)),o.clear(e)},clearAll:function(){console.debug("[http] Cleaning all caches..."),_.keys(c).forEach((function(e){o.clear(e)}))}},o.constants)}}]),angular.module("cesium.storage.services",["cesium.config"]).factory("sessionStorage",["$window","$q",function(e,t){var n={storage:e.sessionStorage||{},put:function(e,i){return n.storage[e]=i,t.when()},get:function(e,i){return t.when(n.storage[e]||i)},setObject:function(e,i){return n.storage[e]=JSON.stringify(i),t.when()},getObject:function(e){return t.when(JSON.parse(n.storage[e]||"null"))}};return n}]).factory("localStorage",["$window","$q","$log","sessionStorage",function(e,t,n,i){var a,o=!1,r={standard:{storage:null},secure:{storage:null}};function s(){if(a)return a;var n=Date.now();return(e.localStorage?(console.debug("[storage] Starting {local} storage..."),r.standard.storage=e.localStorage,_.forEach(_.keys(r.standard),(function(e){r[e]=r.standard[e]}))):(console.debug("[storage] Starting {session} storage..."),_.forEach(_.keys(i),(function(e){r[e]=i[e]}))),a=t.when()).then((function(){console.debug("[storage] Started in "+(Date.now()-n)+"ms"),o=!0,a=null}))}return r.standard.put=function(e,n){return angular.isDefined(n)&&null!=n?r.standard.storage[e]=n:r.standard.storage.removeItem(e),t.when()},r.standard.remove=function(e,n){return r.standard.storage.removeItem(e),t.when()},r.standard.get=function(e,n){return t.when(r.standard.storage[e]||n)},r.standard.setObject=function(e,n){return r.standard.storage[e]=JSON.stringify(n),t.when()},r.standard.getObject=function(e){return t.when(JSON.parse(r.standard.storage[e]||"null"))},r.secure.put=function(e,i){return t((function(t,a){null!=i?r.secure.storage.set((function(e){t()}),(function(e){n.error(e),a(e)}),e,i):r.secure.storage.remove((function(){t()}),(function(e){n.error(e),t()}),e)}))},r.secure.get=function(e,i){return t((function(t,a){r.secure.storage.get((function(e){t(!e&&i?i:e)}),(function(e){n.error(e),t()}),e)}))},r.secure.setObject=function(e,i){return n.debug("[storage] Setting object into secure storage, using key="+e),t((function(t,n){r.secure.storage.set(t,n,e,i?JSON.stringify(i):void 0)}))},r.secure.getObject=function(e){return n.debug("[storage] Getting object from secure storage, using key="+e),t((function(t,i){r.secure.storage.get((function(e){t(JSON.parse(e||"null"))}),(function(e){n.error(e),t()}),e)}))},r.isStarted=function(){return o},r.ready=function(){return o?t.when():a||s()},s(),r}]),angular.module("cesium.device.services",["cesium.utils.services","cesium.settings.services"]).factory("Device",["$rootScope","$translate","$ionicPopup","$q","ionicReady",function(e,t,n,i,a){var o,r={enable:!0},s={},l=!1;function c(e){if(!r.enable)return i.reject("Barcode scanner not enable. Please call 'ionicReady()' once before use (e.g in app.js).");var t=i.defer();return cordova.plugins.barcodeScanner.scan((function(e){e.cancelled?(console.debug("[device] barcode scanner scan: CANCELLED"),t.resolve()):(console.debug("[device] barcode scanner scan: "+e.text),t.resolve(e.text))}),(function(e){console.error("[device] Error while using barcode scanner: "+e),t.reject(e)}),e),t.promise}return r.enable=!1,r.clipboard={copy:function(e,t){if(!r.enable)return i.reject("Device disabled");var n=i.defer();return $cordovaClipboard.copy(e).then((function(){t&&t(),n.resolve()}),(function(){n.reject({message:"ERROR.COPY_CLIPBOARD"})})),n.promise}},r.camera={getPicture:function(e){return r.camera.enable?(e&&"string"==typeof e&&(e={sourceType:e}),e=e||{},angular.isUndefined(e.sourceType)?t(["SYSTEM.PICTURE_CHOOSE_TYPE","SYSTEM.BTN_PICTURE_GALLERY","SYSTEM.BTN_PICTURE_CAMERA"]).then((function(t){return n.show({title:t["SYSTEM.PICTURE_CHOOSE_TYPE"],buttons:[{text:t["SYSTEM.BTN_PICTURE_GALLERY"],type:"button",onTap:function(e){return navigator.camera.PictureSourceType.PHOTOLIBRARY}},{text:t["SYSTEM.BTN_PICTURE_CAMERA"],type:"button button-positive",onTap:function(e){return navigator.camera.PictureSourceType.CAMERA}}]}).then((function(t){return console.info("[camera] User select sourceType:"+t),e.sourceType=t,r.camera.getPicture(e)}))})):(e.quality=e.quality||50,e.destinationType=e.destinationType||navigator.camera.DestinationType.DATA_URL,e.encodingType=e.encodingType||navigator.camera.EncodingType.PNG,e.targetWidth=e.targetWidth||400,e.targetHeight=e.targetHeight||400,$cordovaCamera.getPicture(e))):i.reject("Camera not enable. Please call 'ionicReady()' 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"),c(e)}},r.barcode={enable:!1,scan:c},r.keyboard={enable:!1,close:function(){r.keyboard.enable&&cordova.plugins.Keyboard.close()}},r.keyboard.digit={settings:{bindModel:function(t,n,i){t=t||e;var a=function(){return(n||"").split(".").reduce((function(e,t){return e?e[t]:void 0}),t)},o=function(e){var i=(n||"").split("."),a=i.length&&i[i.length-1];i.reduce((function(t,n){if(n!=a)return t[n];t[a]=e}),t)};return(i=i||{}).animation=i.animation||"pop",i.action=i.action||function(e){o((a()||"")+e)},i.decimal&&(i.decimalSeparator=i.decimalSeparator||".",i.leftButton={html:"<span>.</span>",action:function(){var e=a()||"";e.indexOf(i.decimalSeparator)>=0||(e.trim().length||(e="0"),o(e+i.decimalSeparator))}}),i.rightButton=i.rightButton||{html:'<i class="icon ion-backspace-outline"></i>',action:function(){var e=a();e&&e.length&&(e=e.slice(0,-1),o(e))}},i}}},r.isIOS=function(){return!!navigator.userAgent.match(/iPhone | iPad | iPod/i)||ionic.Platform.isIOS()},r.isOSX=function(){return!!navigator.userAgent.match(/Macintosh/i)||ionic.Platform.is("osx")},r.isDesktop=function(){if(!angular.isDefined(s.isDesktop))try{s.isDesktop=(r.enable||process,!1)}catch(e){s.isDesktop=!1}return s.isDesktop},r.isWeb=function(){return!r.enable&&!r.isDesktop()},r.ready=function(){return l?i.when():o||r.start()},r.start=function(){return o=a().then((function(){r.enable=window.cordova&&cordova&&cordova.plugins,r.enable?(r.camera.enable=!!navigator.camera,r.keyboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.Keyboard,r.barcode.enable=cordova&&cordova.plugins&&!!cordova.plugins.barcodeScanner&&!r.isOSX(),r.clipboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.clipboard,r.keyboard.enable&&angular.extend(r.keyboard,cordova.plugins.Keyboard),console.debug("[device] Ionic platform ready, with [camera: {0}] [barcode scanner: {1}] [keyboard: {2}] [clipboard: {3}]".format(r.camera.enable,r.barcode.enable,r.keyboard.enable,r.clipboard.enable)),cordova.InAppBrowser&&console.debug("[device] Enabling InAppBrowser")):console.debug("[device] Ionic platform ready - no device detected."),l=!0,o=null}))},r}]),angular.module("cesium.currency.services",["ngApi","cesium.bma.services"]).factory("csCurrency",["$rootScope","$q","$timeout","BMA","Api","csSettings",function(e,n,i,a,o,r){var s,l,c={WELL_KNOWN_CURRENCIES:{g1:{firstBlockTime:1488987127,medianTimeOffset:3600}}},d={},u=!1,p=new o(this,"csCurrency");function m(){d.name=null,d.parameters=null,d.firstBlockTime=null,d.membersCount=null,d.cache={},d.node=a,d.currentUD=null,d.medianTimeOffset=0,u=!1,s=void 0,p.data.raise.reset(d)}function E(){return n.all([a.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 t=e.currency,c.WELL_KNOWN_CURRENCIES[t]?(angular.merge(d,c.WELL_KNOWN_CURRENCIES[t]),n.when()):a.blockchain.block({block:0}).then((function(e){d.firstBlockTime=e.medianTime})).catch((function(e){if(e&&e.ucode===a.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 t})),a.blockchain.stats.ud().then((function(e){return e.result.blocks.length?function e(t,n){if(!t.result.blocks.length||n<0)return d.currentUD=d.parameters?d.parameters.ud0:-1,d.currentUD;var i=t.result.blocks[n];return a.blockchain.block({block:i}).then((function(e){var t,n;return d.currentUD=(t=e.dividend,(n=e.unitbase)<=0?t:t*Math.pow(10,n)),d.currentUD})).catch((function(a){if(console.error("[currency] Unable to load last block with UD, with number {0}".format(i)),n>0)return console.error("[currency] Retrying to load UD from a previous block..."),e(t,n-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})),p.data.raisePromise.load(d)]).catch((function(e){throw m(),e}))}function b(){return u?n.when(d):s||v()}function g(e){return function(){return u?n.when(d[e]):s||v().then((function(){return d[e]}))}}function f(e){var n=new t(e);n.cleanData(),console.debug("[currency] Received new block {"+n.number+"-"+n.hash+"}"),d.currentBlock=n,d.currentBlock.receivedAt=moment().utc().unix(),d.medianTime=n.medianTime,d.membersCount=n.membersCount,n.dividend&&(d.currentUD=n.dividend),p.data.raise.newBlock(n)}function h(){console.debug("[currency] Stopping..."),_.forEach(l,(function(e){e()})),l=[],m()}function T(){return h(),i(v,200)}function v(t){if(s)return s;if(u)return n.when(d);if(!t)return a.ready().then((function(e){return e?v(e):i(v,500)}));console.debug("[currency] Starting...");var o=Date.now();return s=a.ready().then((function(e){return!!e||i((function(){return v(!0)}),500)})).then(E).then((function(){!function(){l=[a.api.node.on.restart(e,T,this),a.websocket.block().onListener(f)]}(),console.debug("[currency] Started in "+(Date.now()-o)+"ms"),u=!0,s=null,p.data.raise.ready(d)})).then((function(){return d}))}var I=g("currentBlock");function O(e){return I().then((function(t){var n=moment().utc().unix();if(e){if(t&&t.receivedAt&&n-t.receivedAt<60)return t;t||console.warn("[currency] No current block in cache: get it from network. Websocket [/ws/block] may not be started ?")}return a.blockchain.current(!1).catch((function(e){if(e&&e.ucode==a.errorCodes.NO_CURRENT_BLOCK)return{number:0,hash:a.constants.ROOT_BLOCK_HASH,medianTime:n};throw e})).then((function(e){return d.currentBlock=e,d.currentBlock.receivedAt=n,e}))}))}return p.registerEvent("data","ready"),p.registerEvent("data","load"),p.registerEvent("data","reset"),p.registerEvent("data","newBlock"),m(),{ready:function(){return u?n.when(d):s||v()},start:v,stop:h,data:d,get:b,name:g("name"),parameters:g("parameters"),currentUD:g("currentUD"),medianTimeOffset:g("medianTimeOffset"),blockchain:{current:O,lastValid:function(){return r.data.blockValidityWindow<=0?O(!0):O(!0).then((function(e){
var t=e.number-r.data.blockValidityWindow;return t>0?a.blockchain.block({block:t}):e}))}},date:{now:function(){return moment().utc().unix()-(d.medianTimeOffset||c.WELL_KNOWN_CURRENCIES.g1.medianTimeOffset)}},api:p,default:function(){return console.warn("[currency] 'csCurrency.default()' has been DEPRECATED - Please use 'csCurrency.get()' instead."),b()}}}]),angular.module("cesium.bma.services",["ngApi","cesium.http.services","cesium.settings.services"]).factory("BMA",["$q","$window","$rootScope","$timeout","csCrypto","Api","Device","UIUtils","csConfig","csSettings","csCache","csHttp",function(e,t,n,i,a,o,r,s,l,c,d,u){function p(r,p,m,E){var b,g=r?"{0}:{1}".format(r,p||(m?"443":"80")):"default",f="[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",h="SIG\\(("+f+")\\)",T="OBJ\\(([0-9]+)\\)",v="( ([a-z_][a-z0-9-_.ğĞ]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))( (.+))?",I={BMA:"BASIC_MERKLED_API",BMAS:"BMAS",WS2P:"WS2P",BMATOR:"BMATOR",WS2PTOR:"WS2PTOR"},O={USER_ID:"[0-9a-zA-Z-_]+",CURRENCY:"[0-9a-zA-Z-_]+",PUBKEY:f,PUBKEY_WITH_CHECKSUM:"("+f+"):([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3})",COMMENT:"[ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",INVALID_COMMENT_CHARS:"[^ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",URI_WITH_AT:"duniter://(?:([A-Za-z0-9_-]+):)?("+f+"@([a-zA-Z0-9-.]+.[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)",URI_WITH_PATH:"duniter://([a-zA-Z0-9-.]+.[a-zA-Z0-9-_:.]+)/("+f+")(?:/([A-Za-z0-9_-]+))?",BMA_ENDPOINT:I.BMA+v,BMAS_ENDPOINT:I.BMAS+v,WS2P_ENDPOINT:I.WS2P+" ([a-f0-9]{8})"+v,BMATOR_ENDPOINT:I.BMATOR+" ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?",WS2PTOR_ENDPOINT:I.WS2PTOR+" ([a-f0-9]{8}) ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?(?: (.+))?"},N={PROTOCOL_VERSION:10,ROOT_BLOCK_HASH:"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",LIMIT_REQUEST_COUNT:5,LIMIT_REQUEST_DELAY:1e3,regexp:O,api:I},R=this;function A(e,t,n){R.started&&R.stop(),R.alive=!1,c.data&&c.data.node&&(e=e||c.data.node.host,t=t||c.data.node.port,n=angular.isDefined(n)?n:443==t||c.data.node.useSsl||R.forceUseSsl),e&&(R.host=e,R.port=t||80,R.useSsl=angular.isDefined(n)?n:443==R.port||R.forceUseSsl,R.server=u.getServer(e,t),R.url=u.getUrl(e,t,"",n))}function S(e){return new RegExp("^"+e+"$")}function C(e){return new RegExp(e)}function L(){R.raw&&(console.warn("[BMA] Closing all websockets..."),_.keys(R.raw.wsByPath||{}).forEach((function(e){R.raw.wsByPath[e].close()})),R.raw.wsByPath={})}function D(e,t){t=R.useCache&&t||0;var n=e+(t?"#"+t:""),a=function(o){if(!R.started)return R._startPromise||console.warn("[BMA] Trying to get [{0}] before start(). Waiting...".format(e)),R.ready().then((function(){return a(o)}));var r=R.raw.getByPath[n];r||(r=t?u.getWithCache(R.host,R.port,e,R.useSsl,t,null,null,"BMA-"):u.get(R.host,R.port,e,R.useSsl),R.raw.getByPath[n]=r);var l=1;return r(o).catch((function(e){if(e&&e.ucode===M.errorCodes.HTTP_LIMITATION&&l<=M.constants.LIMIT_REQUEST_COUNT)return 1===l&&(console.warn("[BMA] Too many HTTP requests: Will wait then retry..."),s.loading.update({template:"COMMON.LOADING_WAIT"})),i((function(){return l++,r(o)}),M.constants.LIMIT_REQUEST_DELAY);throw e}))};return a}function y(e){var t=function(n,i){if(!R.started)return R._startPromise||console.error("[BMA] Trying to post [{0}] before start()...".format(e)),R.ready().then((function(){return t(n,i)}));var a=R.raw.postByPath[e];return a||(a=u.post(R.host,R.port,e,R.useSsl),R.raw.postByPath[e]=a),a(n,i)};return t}function P(e){return function(){var t=R.raw.wsByPath[e];return t&&!t.isClosed()||((t=u.ws(R.host,R.port,e,R.useSsl)).onclose=function(){delete R.raw.wsByPath[e]},R.raw.wsByPath[e]=t),t}}function k(e){i((function(){M.copy(e.node)}),1e3)}R.raw={getByPath:{},postByPath:{},wsByPath:{}},R.api=new o(this,"BMA-"+g),R.started=!1,R.init=A,R.forceUseSsl=!!("true"===l.httpsMode||!0===l.httpsMode||"force"===l.httpsMode||t.location&&"https:"===t.location.protocol),R.forceUseSsl&&console.debug("[BMA] Enable SSL (forced by config or detected in URL)"),r&&A(r,p,m),R.useCache=!angular.isDefined(E)||E,R.isAlive=function(e){return e=e||R,u.get(e.host,e.port,"/node/summary",e.useSsl)().then((function(e){var t=e&&e.duniter&&e.duniter.software,n=!0;return"duniter"===t&&e.duniter.version?n=u.version.isCompatible(c.data.minVersion,e.duniter.version):console.debug("[BMA] Unknown node software [{0} v{1}]: could not check compatibility.".format(t||"?",e.duniter.version||"?")),n||console.error("[BMA] Incompatible node [{0} v{1}]: expected at least v{2}".format(t,e.duniter.version,c.data.minVersion)),n})).catch((function(){return!1}))},R.isStarted=function(){return R.started},R.ready=function(){return R.started?e.when(R.alive):R._startPromise||R.start()},R.start=function(){if(R._startPromise)return R._startPromise;if(R.started)return e.when(R.alive);if(!R.host)return c.ready().then((function(){return R.init(),R.useCache=!0,R.start()}));console.debug("[BMA] Starting {0} {ssl: {1})...".format(R.server,R.useSsl));var t=Date.now();return R._startPromise=e.all([c.ready(),R.isAlive()]).then((function(e){return R.alive=e[1],R.alive?(b&&b.length||function(){b=[c.api.data.on.changed(n,k,this)]}(),console.debug("[BMA] Started in "+(Date.now()-t)+"ms"),R.api.node.raise.start(),R.started=!0,delete R._startPromise,!0):(console.error("[BMA] Could not start {0} : unreachable".format(R.server)),R.started=!0,delete R._startPromise,!1)})),R._startPromise},R.stop=function(){return R.started||R._startPromise?(console.debug("[BMA] Stopping..."),_.forEach(b,(function(e){e()})),b=[],delete R._startPromise,R.alive?(L(),console.debug("[BMA] Cleaning cache {prefix: '{0}'}...".format("BMA-")),d.clear("BMA-"),R.raw.getByPath={},R.raw.postByPath={},R.raw.wsByPath={},R.alive=!1,R.started=!1,R.api.node.raise.stop()):R.started=!1,e.when()):e.when()},R.restart=function(){return R.stop(),i(R.start,200).then((function(e){return e&&R.api.node.raise.restart(),e}))},R.api.registerEvent("node","start"),R.api.registerEvent("node","stop"),R.api.registerEvent("node","restart");var M={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:N,regexp:{USER_ID:S(O.USER_ID),COMMENT:S(O.COMMENT),PUBKEY:S(O.PUBKEY),PUBKEY_WITH_CHECKSUM:S(O.PUBKEY_WITH_CHECKSUM),CURRENCY:S(O.CURRENCY),URI:S(O.URI),BMA_ENDPOINT:S(O.BMA_ENDPOINT),BMAS_ENDPOINT:S(O.BMAS_ENDPOINT),WS2P_ENDPOINT:S(O.WS2P_ENDPOINT),BMATOR_ENDPOINT:S(O.BMATOR_ENDPOINT),WS2PTOR_ENDPOINT:S(O.WS2PTOR_ENDPOINT),TX_OUTPUT_SIG:S(h),TX_OUTPUT_FUNCTION:C("SIG\\(([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)"),TX_OUTPUT_OBJ_OPERATOR_AND:C(T+"([ ]*&&[ ]*("+T+"))+"),TX_OUTPUT_OBJ_OPERATOR_OR:C(T+"([ ]*\\|\\|[ ]*("+T+"))+"),TX_OUTPUT_OBJ:C(T),TX_OUTPUT_OBJ_OPERATOR:C("OBJ\\(([0-9]+)\\)[ ]*(&&)|(\\|\\|)[ ]*OBJ\\(([0-9]+)\\)"),TX_OUTPUT_OBJ_PARENTHESIS:C("\\(("+T+")\\)"),TX_OUTPUT_FUNCTIONS:C("SIG\\(([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)([ ]*(&&)|(\\|\\|)[ ]*SIG\\(([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\))*")},node:{summary:D("/node/summary",d.constants.LONG),same:function(e){return(e=e||{}).useSsl=angular.isDefined(e.useSsl)?e.useSsl:e.port&&443==e.port,R.host===e.host&&(!R.port&&!e.port2||R.port==e.port2||80)&&R.useSsl===e.useSsl},forceUseSsl:R.forceUseSsl},network:{peering:{self:D("/network/peering"),peers:D("/network/peering/peers")},peers:D("/network/peers"),ws2p:{info:D("/network/ws2p/info"),heads:D("/network/ws2p/heads")}},wot:{lookup:D("/wot/lookup/:search"),certifiedBy:D("/wot/certified-by/:pubkey",d.constants.SHORT),certifiersOf:D("/wot/certifiers-of/:pubkey",d.constants.SHORT),member:{all:D("/wot/members",d.constants.LONG),pending:D("/wot/pending",d.constants.SHORT)},requirements:function(e,t){return!0!==t?M.raw.wot.requirements(e):M.raw.wot.requirementsWithCache(e)},add:y("/wot/add"),certify:y("/wot/certify"),revoke:y("/wot/revoke")},blockchain:{parameters:D("/blockchain/parameters",d.constants.VERY_LONG),block:D("/blockchain/block/:block",d.constants.SHORT),blocksSlice:D("/blockchain/blocks/:count/:from"),current:function(e){return!0!==e?M.raw.blockchain.current():M.raw.blockchain.currentWithCache()},membership:y("/blockchain/membership"),stats:{ud:D("/blockchain/with/ud",d.constants.MEDIUM),tx:D("/blockchain/with/tx"),newcomers:D("/blockchain/with/newcomers",d.constants.MEDIUM),hardship:D("/blockchain/hardship/:pubkey"),difficulties:D("/blockchain/difficulties")}},tx:{sources:D("/tx/sources/:pubkey",d.constants.SHORT),process:y("/tx/process"),history:{all:function(e){return M.raw.tx.history.all(e).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},times:function(e,t){return(!0!==t?M.raw.tx.history.times(e):M.raw.tx.history.timesWithCache(e)).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},blocks:D("/tx/history/:pubkey/blocks/:from/:to",d.constants.LONG),pending:D("/tx/history/:pubkey/pending")}},ud:{history:D("/ud/history/:pubkey")},uri:{},version:{},raw:{blockchain:{currentWithCache:D("/blockchain/current",d.constants.SHORT),current:D("/blockchain/current")},wot:{requirementsWithCache:D("/wot/requirements/:pubkey",d.constants.LONG),requirements:D("/wot/requirements/:pubkey")},tx:{history:{timesWithCache:D("/tx/history/:pubkey/times/:from/:to",d.constants.LONG),times:D("/tx/history/:pubkey/times/:from/:to"),all:D("/tx/history/:pubkey")}}}};M.tx.parseUnlockCondition=function(e){for(var t,n,i,a,o=e,r=[],s={},l=M.regexp.TX_OUTPUT_FUNCTION.exec(o);l;)t={},n="OBJ("+r.length+")",t.type=o.substr(l.index,l[0].indexOf("(")),t.value=l[1]||l[2]||l[3]||l[4],r.push(t),s[t.type]=s[t.type]++||1,o=o.replace(l[0],n),l=M.regexp.TX_OUTPUT_FUNCTION.exec(o);for(var c=!0;c;){for(c=!!(l=M.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o));l;){for(t={},n="OBJ("+r.length+")",t.type="AND",t.children=[],r.push(t),i=l[0],a=M.regexp.TX_OUTPUT_OBJ.exec(i);a;)t.children.push(r[a[1]]),i=i.replace(a[0],""),a=M.regexp.TX_OUTPUT_OBJ.exec(i);o=o.replace(l[0],n),l=M.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(i)}for(l=M.regexp.TX_OUTPUT_OBJ_OPERATOR_OR.exec(o),c=c||!!l;l;){for(t={},n="OBJ("+r.length+")",t.type="OR",t.children=[],r.push(t),i=l[0],a=M.regexp.TX_OUTPUT_OBJ.exec(i);a;)t.children.push(r[a[1]]),i=i.replace(a[0],""),a=M.regexp.TX_OUTPUT_OBJ.exec(i);o=o.replace(l[0],n),l=M.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o)}for(l=M.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o),c=c||!!l;l;)o=o.replace(l[0],l[1]),l=M.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o)}if(0!==(s=_.keys(s)).length)return console.debug("[BMA] Unlock conditions successfully parsed:",t),{unlockFunctions:s,unlockTree:t};console.error("[BMA] Unparseable unlock condition: ",output)},M.node.parseEndPoint=function(e,t){var n=M.regexp.BMA_ENDPOINT.exec(e);return n?{dns:n[2]||"",ipv4:n[4]||"",ipv6:n[6]||"",port:n[8]||80,useSsl:n[8]&&443==n[8],path:n[10],useBma:!0}:(n=M.regexp.BMAS_ENDPOINT.exec(e))?{dns:n[2]||"",ipv4:n[4]||"",ipv6:n[6]||"",port:n[8]||80,useSsl:!0,path:n[10],useBma:!0}:(n=M.regexp.BMATOR_ENDPOINT.exec(e))?{dns:n[1]||"",port:n[2]||80,useSsl:!1,useTor:!0,useBma:!0}:(n=M.regexp.WS2P_ENDPOINT.exec(e))?{ws2pid:n[1]||"",dns:n[3]||"",ipv4:n[5]||"",ipv6:n[7]||"",port:n[9]||80,useSsl:n[9]&&443==n[9],path:n[11]||"",useWs2p:!0}:(n=M.regexp.WS2PTOR_ENDPOINT.exec(e))?{ws2pid:n[1]||"",dns:n[2]||"",port:n[3]||80,path:n[4]||"",useSsl:!1,useTor:!0,useWs2p:!0}:t&&(n=S(t+v).exec(e))?{dns:n[2]||"",ipv4:n[4]||"",ipv6:n[6]||"",port:n[8]||80,useSsl:n[8]&&443==n[8],path:n[10],useBma:!1}:void 0},M.copy=function(e){if(u.getUrl(e.host,e.port,"",e.useSsl)!==R.url){var t=R.started;if(t&&R.stop(),R.init(e.host,e.port,e.useSsl,R.useCache),t)return i((function(){return R.start().then((function(e){return e&&R.api.node.raise.restart(),e}))}),200)}},M.wot.member.uids=function(){return M.wot.member.all().then((function(e){return e.results.reduce((function(e,t){return e[t.pubkey]=t.uid,e}),{})}))},M.wot.member.get=function(e){return M.wot.member.uids().then((function(t){var n=t[e];return{pubkey:e,uid:n||null}}))},M.wot.member.getByUid=function(e){return M.wot.member.all().then((function(t){return _.findWhere(t.results,{uid:e})}))},M.blockchain.blocks=function(e){return M.raw.getHttpRecursive(M.blockchain.block,"block",e)},M.network.peering.peersByLeaves=function(e){return M.raw.getHttpRecursive(M.network.peering.peers,"leaf",e,0,10)},M.raw.getHttpRecursive=function(t,n,a,o,r){return o=angular.isDefined(o)?o:0,r=r||M.constants.LIMIT_REQUEST_COUNT,e((function(s,l){var c=[],d=[];_.each(a.slice(o,o+r),(function(e){var i={};i[n]=e,d.push(t(i).then((function(e){e&&c.push(e)})))})),e.all(d).then((function(){o<a.length-1?i((function(){M.raw.getHttpRecursive(t,n,a,o+r,r).then((function(e){e&&e.length?s(c.concat(e)):s(c)})).catch((function(e){l(e)}))}),M.constants.LIMIT_REQUEST_DELAY):s(c)})).catch((function(e){e&&e.ucode===M.errorCodes.HTTP_LIMITATION?s(c):l(e)}))}))},M.raw.getHttpWithRetryIfLimitation=function(e){return e().catch((function(t){if(t&&t.ucode==M.errorCodes.HTTP_LIMITATION)return i((function(){return M.raw.getHttpWithRetryIfLimitation(e)}),M.constants.LIMIT_REQUEST_DELAY)}))},M.blockchain.lastUd=function(){return M.blockchain.stats.ud().then((function(e){if(!e.result.blocks||!e.result.blocks.length)return null;var t=e.result.blocks[e.result.blocks.length-1];return M.blockchain.block({block:t}).then((function(e){return e.unitbase>0?e.dividend*Math.pow(10,e.unitbase):e.dividend}))}))},M.uri.parse=function(t){return e((function(e,n){var i;if(S(O.PUBKEY).test(t))e({pubkey:t});else if(S(O.PUBKEY_WITH_CHECKSUM).test(t)){console.debug("[BMA.parse] Detecting a pubkey with checksum: "+t);var o=M.regexp.PUBKEY_WITH_CHECKSUM.exec(t);i=o[1];var r=o[2];console.debug("[BMA.parse] Detecting a pubkey {"+i+"} with checksum {"+r+"}");var s=a.util.pkChecksum(i);console.debug("[BMA.parse] Expecting checksum for pubkey is {"+s+"}"),r!=s?n({message:"ERROR.PUBKEY_INVALID_CHECKSUM"}):e({pubkey:i})}else if(t.startsWith("duniter://")){var l,c=u.uri.parse(t),d=-1===c.host.indexOf(".")?c.host:null,p=-1!==c.host.indexOf(".")?c.host:null;if(c.username&&(c.password?(l=c.username,i=c.password):i=c.username),c.pathname){var m=c.pathname.split("/"),E=m?m.length:0,b=0;if(!d&&E>b&&(d=m[b++]),!i&&E>b&&(i=m[b++]),!l&&E>b&&(l=m[b++]),E>b)return void n({message:"Bad Duniter URI format. Invalid path (incomplete or redundant): "+c.pathname})}if(d)return p||e({uid:l,pubkey:i,currency:d}),u.get(p+"/blockchain/parameters")().then((function(t){t.currency===d?e({uid:l,pubkey:i,host:p,currency:d}):n({message:"Node's currency ["+t.currency+"] does not matched URI's currency ["+d+"]."})})).catch((function(e){console.error(e),n({message:"Could not get node parameter. Currency could not be retrieve"})}));if(!p)return void n({message:"Bad Duniter URI format. Missing currency name (or node address)."});u.get(p+"/blockchain/parameters")().then((function(t){e({uid:l,pubkey:i,host:p,currency:t.currency})})).catch((function(e){console.error(e),n({message:"Could not get node parameter. Currency could not be retrieve"})}))}else console.debug("[BMA.parse] Could not parse URI: "+t),n({message:"ERROR.UNKNOWN_URI_FORMAT"})})).then((function(e){if(e){if(e.pubkey&&!S(O.PUBKEY).test(e.pubkey))throw{message:"Invalid pubkey format ["+e.pubkey+"]"};if(e.uid&&!S(O.USER_ID).test(e.uid))throw{message:"Invalid uid format ["+e.uid+"]"};if(e.currency&&!S(O.CURRENCY).test(e.currency))throw{message:"Invalid currency format ["+e.currency+"]"};return e}}))};var w=c.data.duniterLatestReleaseUrl&&u.uri.parse(c.data.duniterLatestReleaseUrl);M.raw.getLatestRelease=w?u.getWithCache(w.host,w.port,"/"+w.pathname,443==+w.port||"https:"===w.protocol||R.forceUseSsl,d.constants.LONG):function(){return e.when()},M.version.latest=function(){return M.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)}))},M.websocket={block:P("/ws/block"),peer:P("/ws/peer"),close:L},angular.merge(R,M)}var m=new p;return m.instance=function(e,t,n,i){return new p(e,t,n,i=!!angular.isDefined(i)&&i)},m.lightInstance=function(e,t,n,i){return{host:e,port:t=t||80,useSsl:n=angular.isDefined(n)?n:443==t,url:u.getUrl(e,t,"",n),node:{summary:u.getWithCache(e,t,"/node/summary",n,d.constants.MEDIUM,!1,i)},network:{peering:{self:u.get(e,t,"/network/peering",n,i)},peers:u.get(e,t,"/network/peers",n,i)},blockchain:{current:u.get(e,t,"/blockchain/current",n,i),stats:{hardship:u.get(e,t,"/blockchain/hardship/:pubkey",n,i)}}}},m}]),angular.module("cesium.wot.services",["ngApi","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.settings.services"]).factory("csWot",["$rootScope","$q","$timeout","BMA","Api","CacheFactory","UIUtils","csConfig","csCurrency","csSettings","csCache",function(e,t,n,i,a,o,r,s,l,c,d){var u=new a(this,"csWot"),p=d.get("csWot-idty-",d.constants.MEDIUM),m=d.get("csWot-requirements-",d.constants.MEDIUM),E=function(e){var t={};return e.reduce((function(e,n){return n.id=n.id||n.uid+"-"+n.pubkey,t[n.id]?e:(t[n.id]=!0,e.concat(n))}),[])},b=function(e,t,n){return t=t||0,e=E(e),e=_.sortBy(e,(function(e){var t=1;return t+=1e6*e.block,-(t+=10*(900-e.uid.toLowerCase().charCodeAt(0)))})),angular.isDefined(n)&&e.length>n&&(e=e.slice(t,t+n)),e},g=function(e){e.requirements={loaded:!1,meta:{},hasSelf:!1,needSelf:!0,needMembership:!0,canMembershipOut:!1,needRenew:!1,pendingMembership:!1,isMember:!1,wasMember:!1,certificationCount:0,needCertifications:!1,needCertificationCount:0,willNeedCertificationCount:0,alternatives:void 0},e.blockUid=null,e.isMember=!1,e.sigDate=null,e.hasSelf=!1},f=function(e,t){if(e.hasSelf=!!e.meta.timestamp,e.needSelf=!e.hasSelf||e.meta.invalid,e.wasMember=!!angular.isDefined(e.wasMember)&&e.wasMember,e.needMembership=!e.revoked&&e.membershipExpiresIn<=0&&e.membershipPendingExpiresIn<=0&&!e.wasMember,e.needRenew=!e.needMembership&&!e.revoked&&e.membershipExpiresIn<=c.data.timeWarningExpireMembership&&e.membershipPendingExpiresIn<=0||e.wasMember&&!e.revoked&&0===e.membershipExpiresIn&&0===e.membershipPendingExpiresIn,e.canMembershipOut=!e.revoked&&e.membershipExpiresIn>0,e.pendingMembership=!e.revoked&&e.membershipExpiresIn<=0&&e.membershipPendingExpiresIn>0,e.isMember=!e.revoked&&e.membershipExpiresIn>0,e.blockUid=e.meta.timestamp,e.certificationCount=(e.isMember||e.wasMember&&!e.expired)&&e.certifications?e.certifications.length:0,e.willExpireCertificationCount=e.certifications?e.certifications.reduce((function(e,t){return e+(t.expiresIn<=c.data.timeWarningExpire?1:0)}),0):0,e.willExpire=e.willExpireCertificationCount>0,e.pendingRevocation=!e.revoked&&!!e.revocation_sig,e.isMember||e.wasMember)e.pendingCertificationCount=angular.isDefined(e.pendingCerts)?e.pendingCerts.length:0;else{var n=_.union(_.pluck(e.pendingCerts||[],"from"),_.pluck(e.certifications||[],"from"));e.pendingCertificationCount=_.size(n)}return e.needCertificationCount=!e.needSelf&&e.certificationCount<t.sigQty?t.sigQty-e.certificationCount:0,e.willNeedCertificationCount=!e.needMembership&&!e.needCertificationCount&&e.certificationCount-e.willExpireCertificationCount<t.sigQty?t.sigQty-e.certificationCount+e.willExpireCertificationCount:0,e.loaded=!0,e},h=function(e){if(!e)return t.when(e);var n=[];return _.forEach(e,(function(e){var t=e.meta.timestamp.split("-",2);e.meta.number=parseInt(t[0]),e.meta.hash=t[1],e.meta.sig=e.meta.sig||e.sig,delete e.sig,n.push(e.meta.number)})),i.blockchain.blocks(_.uniq(n)).then((function(t){return _.forEach(e,(function(e){var n=_.findWhere(t,{number:e.meta.number});e.meta.time=n&&n.medianTime,n&&0!==e.meta.number&&e.meta.hash!==n.hash&&(e.meta.invalid=!0)})),e})).catch((function(t){if(t&&t.ucode==i.errorCodes.BLOCK_NOT_FOUND)return _.forEach(e,(function(e){0===e.number&&(e.meta.time=moment().utc().unix())})),e;throw t}))},T=function(e,a){if(!e||!e.pubkey&&!e.uid)return t.when(e);var o=e.pubkey||e.uid,s=!1!==a?m.get(o):null;if(s)return console.debug("[wot] Requirements "+o+" found in cache"),angular.merge(e,s),t.when(s);s={pubkey:e.pubkey,uid:e.uid},n((function(){s.requirements&&s.requirements.loaded||r.loading.update({template:"COMMON.LOADING_WAIT"})}),2e3);var c=Date.now();return t.all([l.get(),i.wot.requirements({pubkey:s.pubkey||s.uid},!1).then((function(e){return h(e&&e.identities)}))]).then((function(t){var n=t[0],i=t[1];if(i&&i.length)return i.length>1&&(i=_.sortBy(i,(function(e){var t=0;t+=1e12*(s.uid&&e.uid===s.uid?1:0),t+=1e11*(e.meta.invalid?0:1),t+=1e10*(s.blockUid&&e.meta.timestamp&&e.meta.timestamp===s.blockUid?1:0),t+=1e9*(e.membershipExpiresIn>0?1:0),t+=1e8*(e.membershipPendingExpiresIn>0?1:0),t+=1e7*(e.expired?0:1),t+=1e6*(e.outdistanced?0:1),t+=1e5*(e.wasMember?1:0);var n=!e.expired&&e.certifications?e.certifications.length:0;return t+=1*(n||0),-(t+=1*(!n&&e.membershipPendingExpiresIn>0?e.membershipPendingExpiresIn/1e3:0))})),console.debug("[wot] Found {0} identities (in requirements). Will selected the best one".format(i.length))),s.requirements=f(i[0],n.parameters),s.pubkey=s.requirements.pubkey,s.uid=s.requirements.uid,s.isMember=s.requirements.isMember,s.blockUid=s.requirements.meta&&s.requirements.meta.timestamp,s.hasSelf=s.requirements.hasSelf,s.sigDate=s.requirements.meta&&s.requirements.meta.time,!s.requirements.isMember&&!s.requirements.wasMember&&i.length>1&&(s.requirements.alternatives=i.splice(1),_.forEach(s.requirements.alternatives,(function(e){f(e,n.parameters)}))),m.put(o,s),angular.merge(e,s),console.debug("[wot] Requirements for '{0}' loaded in {1}ms".format(s.pubkey&&s.pubkey.substring(0,8)||s.uid,Date.now()-c)),e})).catch((function(t){if(s.requirements={loaded:!0},g(e),t&&(t.ucode==i.errorCodes.NO_MATCHING_MEMBER||t.ucode==i.errorCodes.NO_IDTY_MATCHING_PUB_OR_UID))return e.requirements.loaded=!0,e;throw t}))},v=function(e,t){var n={pubkey:e,uid:t,hasSelf:!1};return i.wot.lookup({search:e||t}).then((function(e){var t=e.results.reduce((function(e,t){return e.concat(t.uids.reduce((function(e,n){var i=n.meta.timestamp.split("-",2),a=parseInt(i[0]);return e.concat({uid:n.uid,pubkey:t.pubkey,meta:{timestamp:n.meta.timestamp,number:a,hash:i[1],sig:n.self},revoked:n.revoked,revoked_on:n.revoked_on})}),[]))}),[]);return h(t).then((function(t){return{identities:t,results:e.results}}))})).then((function(e){var t=e.identities;t.length>1&&(e.identities=_.sortBy(t,(function(e){var t=0;return t+=1e11*(n.uid&&e.uid===n.uid?1:0),t+=1e10*(e.meta.invalid?0:1),t+=1e9*(n.blockUid&&e.meta.timestamp&&e.meta.timestamp===n.blockUid?1:0),t+=1e8*(e.revoked?0:1),-(t+=1*(e.meta.number?e.meta.number:0)/1e3)})),console.debug("[wot] Found {0} identities (in lookup). Will selected the best one".format(t.length))),_.forEach(t,(function(e){e.hasSelf=!!(e.uid&&e.meta.timestamp&&e.meta.sig)})),n.requirements=t[0],n.pubkey=n.requirements.pubkey,n.uid=n.requirements.uid,n.blockUid=n.requirements.meta&&n.requirements.meta.timestamp,n.hasSelf=n.requirements.hasSelf,n.sigDate=n.requirements.meta&&n.requirements.meta.time,t.length>1&&(n.requirements.alternatives=t.splice(1)),n.lookup={};var i={};return n.lookup.certifications=(e.results||[]).reduce((function(e,t){return t.uids.reduce((function(e,t){var n=t.uid+"-"+(t.meta?t.meta.timestamp:"");return e[n]=(t.others||[]).reduce((function(e,t){var a=n+"-"+t.pubkey,o={pubkey:t.pubkey,uid:t.uids[0],cert_time:{block:t.meta&&t.meta.block_number?t.meta.block_number:0,block_hash:t.meta&&t.meta.block_hash?t.meta.block_hash:null},isMember:t.isMember,wasMember:t.wasMember};return i[a]?o.cert_time.block>i[a].cert_time.block?(i[a]=o,e.splice(_.findIndex(e,{pubkey:t.pubkey}),1,o),e):e:(i[a]=o,e.concat(o))}),[]),e}),e)}),{}),i={},n.lookup.givenCertifications=(e.results||[]).reduce((function(e,t){return(t.signed||[]).reduce((function(e,t){var n={pubkey:t.pubkey,uid:t.uid,cert_time:{block:t.cert_time&&t.cert_time.block?t.cert_time.block:0,block_hash:t.cert_time&&t.cert_time.block_hash?t.cert_time.block_hash:null},sigDate:t.meta?t.meta.timestamp:null,isMember:t.isMember,wasMember:t.wasMember};if(i[t.pubkey]){if(!(n.block>i[t.pubkey].block))return e;i[t.pubkey]=n}else i[t.pubkey]=n;return e.concat(n)}),e)}),[]),n})).catch((function(e){if(e&&e.ucode==i.errorCodes.NO_MATCHING_IDENTITY)return g(n),n;throw e}))},I=function(e,t,n,a,o,r){function s(e,t){return e+"-"+t}var d=!0,u=n?n.reduce((function(e,t){var n=s(t.pubkey,t.cert_time?t.cert_time.block:t.sigDate);return t.cert_time||(d=!1),e[n]=t,e}),{}):{};return e({pubkey:t}).then((function(e){return(e&&e.certifications||[]).reduce((function(e,t){var n=!t.written,i=t.cert_time?t.cert_time.medianTime:null,r=i?n?i+a.sigWindow-o:i+a.sigValidity-o:0;r=r<0?0:r;var l=s(t.pubkey,d&&t.cert_time?t.cert_time.block:t.sigDate);return delete u[l],e.concat({pubkey:t.pubkey,uid:t.uid,time:i,isMember:t.isMember,wasMember:t.wasMember,expiresIn:r,willExpire:r&&r<=c.data.timeWarningExpire,pending:n,block:null!==t.written?t.written.number:t.cert_time?t.cert_time.block:null,valid:r>0})}),[])})).catch((function(e){if(e&&e.ucode==i.errorCodes.NO_MATCHING_MEMBER)return[];if(e&&1002==e.ucode)return console.warn("[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... "),[];throw e})).then((function(e){var t=_.values(u);if(!t.length)return e;if(l.data.initPhase)return t.reduce((function(e,t){return e.concat({pubkey:t.pubkey,uid:t.uid,isMember:t.isMember,wasMember:t.wasMember,time:null,expiresIn:a.sigWindow,willExpire:!1,pending:!0,block:0,valid:!0})}),e);var n=t.reduce((function(e,t){var n=d&&t.cert_time?t.cert_time.block:t.sigDate?t.sigDate.split("-")[0]:null;return angular.isDefined(n)&&(e[n]?e[n].push(t):e[n]=[t]),e}),{});return i.blockchain.blocks(_.keys(n)).then((function(t){return e=t.reduce((function(e,t){return e.concat(n[t.number].reduce((function(e,n){var i=t.medianTime,s=Math.max(0,i+a.sigWindow-o),l=!n.cert_time||!n.cert_time.block_hash||n.cert_time.block_hash==t.hash;l||console.debug("[wot] Invalid cert {0}: block hash changed".format(n.pubkey.substring(0,8)));var u=s>0&&(!r||n.isMember)&&l;return e.concat({pubkey:n.pubkey,uid:n.uid,isMember:n.isMember,wasMember:n.wasMember,time:i,expiresIn:s,willExpire:s&&s<=c.data.timeWarningExpire,pending:!0,block:d&&n.cert_time?n.cert_time.block:n.sigDate?n.sigDate.split("-")[0]:null,valid:u})}),[]))}),e)}))})).then((function(e){var t=e.reduce((function(e,t){return!t.pending&&t.valid&&t.expiresIn>=a.sigWindow&&(e[t.pubkey]=!0),e}),{});e=function(e){return _.sortBy(e,(function(e){var t=1;return t+=1e12*(e.expiresIn?e.expiresIn:0),t+=1e7*(e.isMember?1:0),-(t+=10*(e.block?e.block:0))}))}(e);var n=[],i=[];return{valid:e.reduce((function(e,a){return a.pending?(a.valid&&!t[a.pubkey]?n.push(a):a.valid||t[a.pubkey]||i.push(a),e):e.concat(a)}),[]),pending:n,error:i}}))},O=function(e,n,a){var o;if(a=a||{},!e&&n&&!a.force)return i.wot.member.getByUid(n).then((function(t){if(t)return O(t.pubkey,t.uid,i);var i=angular.copy(i||{});return i.force=!0,O(e,n,i)}));if(e){if((o=!1!==a.cache?p.get(e):null)&&(!n||o.uid===n)&&(!a.blockUid||o.blockUid===a.blockUid))return console.debug("[wot] Identity {{0}} found in cache".format(e.substring(0,8))),t.when(o);console.debug("[wot] Loading identity {{0}}...".format(e.substring(0,8))),o={pubkey:e,uid:n}}else console.debug("[wot] Loading identity from uid {{0}}...".format(n)),o={uid:n};a.blockUid&&(o.blockUid=a.blockUid);var r,s,c=Date.now();return t.all([l.parameters().then((function(e){r=e})),l.blockchain.current(!0).then((function(e){s=e.medianTime})).catch((function(e){if(!e||e.ucode!=i.errorCodes.NO_CURRENT_BLOCK)throw e;s=moment.utc().unix()})),T(o,!1!==a.cache),v(e,n)]).then((function(e){var n=e[3];if(!o.requirements.uid)return console.debug("[wot] No requirements found: using data from lookup"),angular.merge(o,n),void delete o.lookup;var a=o.requirements.uid+"-"+o.requirements.meta.timestamp;return t.all([I(i.wot.certifiersOf,o.pubkey,n.lookup?n.lookup.certifications[a]:null,r,s,!0).then((function(e){o.received_cert=e.valid,o.received_cert_pending=e.pending,o.received_cert_error=e.error})),I(i.wot.certifiedBy,o.pubkey,n.lookup?n.lookup.givenCertifications:null,r,s,!1).then((function(e){o.given_cert=e.valid,o.given_cert_pending=e.pending,o.given_cert_error=e.error}))])})).then((function(){return o.requirements.pendingCertificationCount=o.received_cert_pending?o.received_cert_pending.length:o.requirements.pendingCertificationCount,o.requirements.revoked=angular.isDefined(o.requirements.revoked)?o.requirements.revoked:o.revoked,function(e){e.requirements.revoked?(delete e.requirements.meta.invalid,e.requirements.revoked_on?(C(e,{type:"error",message:"ERROR.IDENTITY_REVOKED_WITH_TIME",messageParams:{revocationTime:e.requirements.revoked_on}}),console.debug("[wot] Identity [{0}] has been revoked on {1}".format(e.uid,e.requirements.revoked_on))):(C(e,{type:"error",message:"ERROR.IDENTITY_REVOKED"}),console.debug("[wot] Identity [{0}] has been revoked".format(e.uid)))):e.requirements.pendingRevocation?(delete e.requirements.meta.invalid,C(e,{type:"error",message:"ERROR.IDENTITY_PENDING_REVOCATION"}),console.debug("[wot] Identity [{0}] has pending revocation".format(e.uid))):e.requirements.meta&&e.requirements.meta.invalid?e.isMember||(C(e,{type:"error",message:"ERROR.IDENTITY_INVALID_BLOCK_HASH"}),console.debug("[wot] Invalid membership for uid {0}: block hash changed".format(e.uid))):e.requirements.expired?(C(e,{type:"error",message:"ERROR.IDENTITY_EXPIRED"}),console.debug("[wot] Identity {0} expired (in sandbox)".format(e.uid))):e.requirements.willNeedCertificationCount>0?(C(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))):!e.requirements.needSelf&&e.requirements.needMembership&&(C(e,{type:"error",message:"INFO.IDENTITY_NEED_MEMBERSHIP"}),console.debug("[wot] Identity {0} has a self but no membership".format(e.uid))),!e.isMember&&e.requirements.alternatives&&C(e,{type:"info",message:"INFO.HAS_ALTERNATIVE_IDENTITIES"})}(o),u.data.raisePromise.load(o).catch((function(e){console.debug("Error while loading identity data, on extension point."),console.error(e)}))})).then((function(){if(o.pubkey)return p.put(o.pubkey,o),console.debug("[wot] Identity "+o.pubkey.substring(0,8)+" loaded in "+(Date.now()-c)+"ms"),o}))},N=function(e,n){if(!e||e.trim()!==e)return t.when(void 0);var a=e.replace(/(^|\s)#\w+/g,"");return a=(a=a.replace(/[^a-zA-Z0-9_-\s]+/g,"")).replace(/\s+/g," ").trim(),(n=n||{}).addUniqueId=!angular.isDefined(n.addUniqueId)||n.addUniqueId,n.allowExtension=!angular.isDefined(n.allowExtension)||n.allowExtension,n.excludeRevoked=!!angular.isDefined(n.excludeRevoked)&&n.excludeRevoked,(a?t.all(a.split(" ").reduce((function(e,t){return console.debug("[wot] Will search on: '"+t+"'"),e.concat(i.wot.lookup({search:t}))}),[])).then((function(e){return e.reduce((function(e,t){return e.concat(t.results.reduce((function(e,t){return e.concat(t.uids.reduce((function(e,i){var a=i.meta.timestamp.split("-",2),o=!i.revoked&&i.revocation_sig;return n.excludeRevoked&&o?e:e.concat({uid:i.uid,pubkey:t.pubkey,number:a[0],hash:a[1],revoked:o})}),[]))}),[]))}),[])})).catch((function(e){if(e&&e.ucode==i.errorCodes.NO_MATCHING_IDENTITY)return[];throw e})):t.when([])).then((function(t){if(!n.allowExtension)return n.addUniqueId?E(t):t;var a=t.length;return u.data.raisePromise.search(e,t,"pubkey").then((function(){if(t.length>a&&_.filter(t,(function(e){return!e.uid&&e.pubkey})).length)return i.wot.member.uids().then((function(e){_.forEach(t,(function(t){!t.uid&&t.pubkey&&(t.uid=e[t.pubkey])}))}))})).then((function(){return n.addUniqueId?E(t):t}))}))},R=function(e,a,o,r){return t((function(s,l){var c=[],d=[];_.each(e.slice(a,a+o),(function(e){d.push(i.blockchain.block({block:e}).then((function(e){e&&e.joiners&&_.each(e.joiners,(function(t){var n=t.split(":"),i=n[n.length-1]+"-"+n[0];c.push({id:i,uid:n[n.length-1],pubkey:n[0],memberDate:e.medianTime,block:e.number})}))})))})),t.all(d).then((function(){c.length<r&&a<e.length-1?n((function(){R(e,a+o,o,r-c.length).then((function(e){s(c.concat(e))})).catch((function(e){l(e)}))}),1e3):s(c)})).catch((function(e){e&&e.ucode===i.errorCodes.HTTP_LIMITATION?s(c):l(e)}))}))},A=function(e,a,o){return t((function(r,s){var l=[],c={},d=[];_.each(e.slice(a,a+o),(function(e){d.push(N(e,{addUniqueId:!1,allowExtension:!1}).then((function(e){e&&e.length&&(l=e.reduce((function(e,t){return c[t.pubkey]?e:(c[t.pubkey]=!0,e.concat(t))}),l))})))})),t.all(d).then((function(){a<e.length-1?n((function(){A(e,a+o,o).then((function(e){e&&e.length?r(e.reduce((function(e,t){return c[t.pubkey]?e:(c[t.pubkey]=!0,e.concat(t))}),l)):r(l)})).catch((function(e){s(e)}))}),i.constants.LIMIT_REQUEST_DELAY):r(l)})).catch((function(e){e&&e.ucode===i.errorCodes.HTTP_LIMITATION?r(l):s(e)}))}))},S=function(e,n,a){n=n||"pubkey";var o=[];return a||o.push(i.wot.member.uids()),o.push(u.data.raisePromise.search(null,e,n).catch((function(e){console.debug("Error while search identities, on extension point."),console.error(e)}))),t.all(o).then((function(t){if(!a){var i=t[0];_.forEach(e,(function(e){!e.uid&&e[n]&&(e.uid=i[e[n]],e.uid&&e.uid==e.name&&delete e.name)}))}return e}))},C=function(e,t){(t=t||{}).type=t.type||"info",t.message=t.message||"",t.messageParams=t.messageParams||{},e.events=e.events||[],e.events.push(t)};return u.registerEvent("data","load"),u.registerEvent("data","search"),i.api.node.on.stop(e,(function(){console.debug("[wot] Cleaning cache..."),d.clear("csWot-")}),this),{load:O,loadRequirements:T,search:N,newcomers:function(e,n){var a;return e=e||0,n=n||20,t.all([l.blockchain.current(!0).then((function(e){a=e.membersCount||0})),i.blockchain.stats.newcomers()]).then((function(t){if(!((t=t[1])&&t.result&&t.result.blocks&&t.result.blocks.length))return null;var i=_.sortBy(t.result.blocks,(function(e){return-e}));return R(i,0,5,e+n)})).then((function(t){return t&&t.length?(t=b(t,e,n),S(t,"pubkey",!0)):null})).then((function(e){return{hits:e,total:a}}))},pending:function(e,n){e=e||0,n=n||20;var a=Date.now();return t.all([i.wot.member.uids(),i.wot.member.pending().then((function(e){return e.memberships&&e.memberships.length?e.memberships:void 0}))]).then((function(o){var r=o[0],s=o[1];if(s){var l={},c={};_.forEach(s,(function(e){if("IN"==e.membership&&!r[e.pubkey]){var t={uid:e.uid,pubkey:e.pubkey,block:e.blockNumber,blockHash:e.blockHash},n=c[e.pubkey];if(n&&t.block>n.block)return;c[t.pubkey]=t,l[t.block]?l[t.block].push(t):l[t.block]=[t],n&&(l[n.block]=l[n.block].reduce((function(e,t){return t.pubkey==n.pubkey?e:(e||[]).concat(t)}),null),null===l[n.block]&&delete l[n.block])}}));var d=_.values(c),u=d.length,p=(d=b(d,e,n)).reduce((function(e,t){return e.concat(t.block)}),[]);return t.all([i.blockchain.blocks(_.uniq(p)).then((function(e){_.forEach(e,(function(e){_.forEach(l[e.number],(function(t){t.sigDate=e.medianTime,0!==e.number&&t.blockHash!==e.hash&&(C(t,{type:"error",message:"ERROR.WOT_PENDING_INVALID_BLOCK_HASH"}),console.debug("Invalid membership for uid={0}: block hash changed".format(t.uid)))}))}))})),S(d,"pubkey",!0)]).then((function(){return console.debug("[ES] [wot] Loaded {0}/{1} pending identities in {2} ms".format(d&&d.length||0,u,Date.now()-a)),{hits:d,total:u}}))}}))},all:function(){return A(["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,i.constants.LIMIT_REQUEST_COUNT).then((function(e){return S(e,"pubkey",!0)})).then(E).then((function(){return{hits:idties,total:idties.length}}))},extend:function(e,t,n){return S([e],t,n).then((function(e){return e[0]}))},extendAll:S,api:u}}]),angular.module("cesium.tx.services",["ngApi","cesium.bma.services","cesium.settings.services","cesium.wot.services"]).factory("csTx",["$q","$timeout","$filter","$translate","FileSaver","UIUtils","BMA","Api","csConfig","csSettings","csWot","csCurrency",function(e,t,n,i,a,o,r,s,l,c,d,u){var p=new s(this,"csTx");function m(e,t,n,i,a){t&&t.length&&_.forEach(t,(function(t){if(null!==t.block_number||a){var o,s,l=!1,c=t.issuers.reduce((function(t,n){return l=l||n===e,n!==e?t.concat(n):t}),[]),d=[],u=[],p=t.outputs.reduce((function(n,i,a){var p="string"==typeof i?i.split(":",3):[i.amount,i.base,i.conditions];o=parseInt(p[1]);var m=b(parseInt(p[0]),o),E=p[2],g=r.regexp.TX_OUTPUT_SIG.exec(E);if(g){var f=g[1];if(f===e){if(!l)return n+m;null===t.block_number&&u.push({amount:parseInt(p[0]),base:o,type:"T",identifier:t.hash,noffset:a,consumed:!1,conditions:E})}else if(""===f||_.contains(c,f)||d.push(f),l)return n-m}else if(-1!==E.indexOf("SIG("+e+")")){var h=r.tx.parseUnlockCondition(E);if(h)return u.push(angular.merge({amount:parseInt(p[0]),base:o,type:"T",identifier:t.hash,noffset:a,conditions:E,consumed:!1},h)),h.amount=m,(s=s||[]).push(h),console.debug("[tx] has locked output:",h),n+m}return n}),0),m=p>0?c:d,E=t.time||t.blockstampTime,g=0!==p&&p+":"+t.hash+":"+E;if(g&&!i[g]){i[g]=!0;var f={time:E,amount:p,pubkey:1===m.length?m[0]:void 0,pubkeys:m.length>1?m:void 0,comment:t.comment,isUD:!1,hash:t.hash,locktime:t.locktime,block_number:t.block_number};l&&null===t.block_number&&(f.inputs=t.inputs,f.sources=u),s&&(f.lockedOutputs=s),n.push(f)}}}))}function E(t,n){return e((function(i,a){var o=moment().utc().unix();n=n||o-c.data.walletHistoryTimeSecond;var s={pendings:[],validating:[],history:[],errors:[]},l={},d=[u.blockchain.current(!0),r.tx.history.pending({pubkey:t}).then((function(e){m(t,e.history.sending,s.pendings,l,!0),m(t,e.history.pending,s.pendings,l,!0)}))];if("pending"!==n){var E=function(e){m(t,e.history.sent,s.history,l,!1),m(t,e.history.received,s.history,l,!1)};if(n>0){for(var b=c.data.walletHistorySliceSecond,g=n-=n%b;g-b<o;g+=b)d.push(r.tx.history.times({pubkey:t,from:g,to:g+b-1},!0).then(E));d.push(r.tx.history.times({pubkey:t,from:o-o%b,to:o+999999999},!1).then(E))}else d.push(r.tx.history.all({pubkey:t}).then(E));c.data.showUDHistory&&n>0&&d.push(p.data.raisePromise.loadUDs({pubkey:t,fromTime:n}).then((function(e){e&&e.length&&_.forEach(e,(function(e){s.history.push(e)}))})).catch((function(e){console.debug("Error while loading UDs history, on extension point."),console.error(e)})))}e.all(d).then((function(e){var t=e[0];s.history.sort((function(e,t){return t.time-e.time}));var a=_.findIndex(s.history,(function(e){return e.block_number<=t.number-c.data.blockValidityWindow}));s.validating=a>0?s.history.splice(0,a):[],s.fromTime="pending"!==n&&n||void 0,s.toTime=s.history.length?s.history[0].time:s.fromTime,i(s)})).catch(a)}))}function b(e,t){return t<=0?e:e*Math.pow(10,t)}function g(e,t){_(t).forEach((function(t){!function(e,t,n){var i=e.type+":"+e.identifier+":"+e.noffset;angular.isUndefined(n[i])&&(t.push(e),n[i]=t.length-1)}(t,e.sources,e.sourcesIndexByKey)}))}function f(e){return r.tx.sources({pubkey:e}).then((function(e){var t={sources:[],sourcesIndexByKey:[],balance:0};return e.sources&&e.sources.length&&(_.forEach(e.sources,(function(e){e.consumed=!1,t.balance+=b(e.amount,e.base)})),g(t,e.sources)),t})).catch((function(e){throw console.warn("[tx] Error while getting sources...",e),e}))}function h(n,i){var a,r=Date.now();return t((function(){a||o.loading.update({template:"COMMON.LOADING_WAIT"})}),2e3),e.all([f(n),E(n,i)]).then((function(e){(a=e[0]).tx=e[1];var t=[],n=[],i=a.balance,o=a.balance;function s(e){var i=[],r=!0;e.amount>0?r=!1:(_.find(e.inputs,(function(e){var t=e.split(":").slice(2).join(":"),n=a.sourcesIndexByKey[t];if(!angular.isDefined(n))return r=!1,!0;i.push(a.sources[n])})),e.sources&&g(a,e.sources),delete e.sources,delete e.inputs),r?(o+=e.amount,t.push(e),_.forEach(i,(function(e){e.consumed=!0}))):n.push(e)}for(var l=a.tx.pendings,c=!0;l&&l.length;)_.forEach(l,s),n.length>0&&t.length>0&&c?(l=n,n=[],c=!1):l=null;a.tx=a.tx||{},a.tx.pendings=t.sort((function(e,t){return t.time-e.time})),a.tx.errors=n.sort((function(e,t){return t.time-e.time})),a.balance=o<0?i:o;var u=(a.tx.history||[]).concat(a.tx.validating||[],a.tx.pendings||[],a.tx.errors||[]);return d.extendAll(u,"pubkey").then((function(){return console.debug("[tx] TX and sources loaded in "+(Date.now()-r)+"ms"),a}))})).catch((function(e){throw console.warn("[tx] Error while getting sources and tx...",e),e}))}return p.registerEvent("data","loadUDs"),{load:h,loadSources:function(e){return console.debug("[tx] Loading sources for "+e.substring(0,8)),h(e,"pending")},downloadHistoryFile:function(t,r){return(r=r||{}).fromTime=r.fromTime||-1,console.debug("[tx] Exporting TX history for pubkey [{0}]".format(t.substr(0,8))),e.all([i(["ACCOUNT.HEADERS.TIME","COMMON.UID","COMMON.PUBKEY","COMMON.UNIVERSAL_DIVIDEND","ACCOUNT.HEADERS.AMOUNT","ACCOUNT.HEADERS.COMMENT"]),u.blockchain.current(!0),h(t,r.fromTime)]).then((function(e){var r=e[0],s=e[1],l=s&&s.medianTime||moment().utc().unix(),c=s&&s.currency,d=e[2];return d&&d.tx&&d.tx.history?i("ACCOUNT.FILE_NAME",{currency:c,pubkey:t,currentTime:l}).then((function(e){var t=n("formatDecimal"),i=n("medianDate"),o=n("currencySymbolNoHtml"),s=[r["ACCOUNT.HEADERS.TIME"],r["COMMON.UID"],r["COMMON.PUBKEY"],r["ACCOUNT.HEADERS.AMOUNT"]+" ("+o(c)+")",r["ACCOUNT.HEADERS.COMMENT"]],l=d.tx.history.concat(d.tx.validating).reduce((function(e,n){return e.concat([i(n.time),n.uid,n.pubkey,t(n.amount/100),'"'+(n.isUD?r["COMMON.UNIVERSAL_DIVIDEND"]:n.comment)+'"'].join(";")+"\n")}),[s.join(";")+"\n"]),u=new Blob(l,{type:"text/plain; charset=utf-8"});a.saveAs(u,e)})):o.toast.show("INFO.EMPTY_TX_HISTORY")}))},api: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","$ionicHistory","UIUtils","Api","Idle","localStorage","sessionStorage","Modals","CryptoUtils","csCrypto","BMA","csConfig","csSettings","FileSaver","Blob","csWot","csTx","csCurrency",function(e,t,n,a,o,r,s,l,c,d,u,p,m,E,b,g,f,h,T,v,I,O){var N,R=b;function A(b,A){var S,C,L,D,y,P,k=(A=A||R).constants.PROTOCOL_VERSION,M=A.constants.PROTOCOL_VERSION,w=A.constants.PROTOCOL_VERSION,U=A.constants.PROTOCOL_VERSION,x=A.constants.PROTOCOL_VERSION,B={},H=!1,F=new l(this,"csWallet-"+b),W=function(e){B.loaded=!1,B.pubkey=null,B.qrcode=null,B.uid=null,B.localName=null,B.isNew=null,B.sourcesIndexByKey=null,B.medianTime=null,B.requirements={},B.blockUid=null,B.sigDate=null,B.sigStock=null,B.isMember=!1,B.events=[],B.children=[],B.encryptedData=null,V(),G(),D=!1,y=void 0,e?F.data.raise.init(B):(Y()&&C&&!C.useLocalStorage&&f.reset(),F.data.raise.reset(B))},V=function(){B.keypair={signSk:null,signPk:null}},G=function(){B.sources=void 0,B.sourcesIndexByKey=void 0,B.balance=0,B.tx=B.tx||{},B.tx.history=[],B.tx.pendings=[],B.tx.validating=[],B.tx.errors=[],delete B.tx.fromTime,delete B.tx.toTime},Y=function(){return"default"===b},$=function(){return B.encryptedData&&B.encryptedData.nonce&&B.encryptedData.content},K=function(e){B.sources=B.sources||[],B.sourcesIndexByKey=B.sourcesIndexByKey||{},_(e).forEach((function(e){!function(e,t,n){var i=e.type+":"+e.identifier+":"+e.noffset;angular.isUndefined(n[i])&&(e.conditions||console.warn("Trying to add a source without output condition !",e),t.push(e),n[i]=t.length-1)}(e,B.sources,B.sourcesIndexByKey)}))},j=function(t){if(!D)return(y||Ve()).then((function(){return j(t)}));var i=!q(),a=t&&(t.auth&&!J()||t.forceAuth);if(!i&&!a)return ee(t)?e.when(B):Ee(t);var o,r=f.data.keepAuthIdle>0;return(t&&t.authData?e.when(t.authData):p.showLogin(t)).then((function(e){if(!e||!e.pubkey||!i&&e.pubkey!==B.pubkey||a&&(!e.keypair||!e.keypair.signPk||!e.keypair.signSk))throw"CANCELLED";if(o=e,B.pubkey=o.pubkey,B.uid=o.uid||B.uid,B.isNew=t&&angular.isDefined(t.isNew)?t.isNew:B.isNew,r&&(B.keypair=o.keypair||{signSk:null,signPk:null}),i)return F.data.raisePromise.loginCheck(B).catch((function(e){throw W(),e})).then((function(){if(i)return F.data.raisePromise.login(B).catch((function(e){console.warn("Error during extension call [wallet.api.data.on.login]",e)}))}))})).then((function(){return i?se():a?we():void 0})).then((function(){if(i&&ie(),a||J())return Ue(!0),F.data.raisePromise.auth(r?B:o)})).then((function(){var e=!i&&t&&t.minData?{minData:!0}:void 0;if(!ee(e))return Ee(e)})).then((function(){return t&&t.silent?s.loading.hide(10):s.loading.hide(1e3),r?B:angular.merge({},B,o)})).catch((function(e){if(!("RETRY"!==e||t&&t.authData))return n((function(){return j(t)}),300);throw e}))},z=function(){var t=J();return e((function(e,n){var i=B.pubkey;W(),ae(i),F.data.raise.logout(),t&&F.data.raise.unauth(),Ue(!1),r.clearCache(),e()}))},q=function(){return!!B.pubkey},X=function(t){return D?g.readonly||g.demo?s.alert.demo().then((function(){throw"CANCELLED"})):!J()||t&&t.forceAuth?((t=t||{}).expectedPubkey=q()&&B.pubkey,t.auth=!0,j(t)):e.when(B):(y||Ve()).then((function(){return X(t)}))},Q=function(){return e((function(e,t){V(),ie(),F.data.raise.unauth(),Ue(!1),r.clearCache(),e()}))},J=function(){return B.pubkey&&B.keypair&&B.keypair.signSk&&!0},Z=function(t){return D?J()?e.when(B.keypair):((t=t||{}).silent=!angular.isDefined(t.silent)||t.silent,X(t).then((function(){return B.keypair}))):(y||Ve()).then((function(){return Z(t)}))},ee=function(e){if(e){if(e.minData&&!e.sources)return B.loaded&&!0;if(e.requirements&&!B.requirements.loaded)return!1;if(e.tx&&e.tx.enable&&(!B.tx.fromTime||"pending"===B.tx.fromTime))return!1;if(e.sigStock&&!B.sigStock)return!1}return B.loaded&&B.sources&&!0},te=function(){if(B.loaded)return!B.pubkey||!(B.isMember||B.requirements.pendingMembership||B.requirements.revoked||!B.requirements.needSelf||B.requirements.wasMember||B.sources&&B.sources.length>0||B.tx.history.length>0||B.tx.validating.length>0||B.tx.pendings.length>0||B.localName||B.name||B.avatar)},ne=function(){return!!B.isNew},ie=function(t){if(t=t&&"string"==typeof t?t:B.pubkey,C&&C.useLocalStorage){if(q()&&C.rememberMe){var n=Date.now();console.debug("[wallet] Storing...");var i=[];return C.keepAuthIdle==f.constants.KEEP_AUTH_IDLE_SESSION&&J()?i.push(u.put("seckey",m.util.encode_base58(B.keypair.signSk))):i.push(u.put("seckey",null)),i.push(d.put("pubkey",B.pubkey)),B.uid?i.push(d.put("uid",B.uid)):i.push(d.put("uid",null)),e.all(i).then((function(){console.debug("[wallet] Stored in "+(Date.now()-n)+"ms")}))}return e.all([u.put("seckey",null),d.put("pubkey",null),d.put("uid",null),t?u.put("data-"+t,null):e.when()])}return e.all([u.put("seckey",null),d.put("pubkey",null),d.put("uid",null),t?u.put("data-"+t,null):e.when(),t?d.put("data-"+t,null):e.when()])},ae=function(t){return console.debug("[wallet] Resetting stored pubkey (and uid) in local storage..."),u.put("seckey",null),d.put("pubkey",null),d.put("uid",null),C&&C.useLocalStorage?t?u.put("data-"+t,null):e.when():(console.debug("[wallet] Resetting stored data in local storage..."),e.all([t?u.put("data-"+t,null):e.when(),t?d.put("data-"+t,null):e.when()]))},oe=function(){if(!q())throw{message:"ERROR.NEED_LOGIN_FIRST"};var t,n,i=C&&C.useLocalStorageEncryption,a="data-"+B.pubkey;B.notifications&&B.notifications.time&&((t=t||{}).notifications={time:B.notifications.time}),B.invitations&&B.invitations.time&&((t=t||{}).invitations={time:B.invitations.time}),B.children&&B.children.length&&((t=t||{}).childrenCount=B.children.length,(n=n||{}).children=_.map(B.children,(function(e){return{pubkey:e.data.pubkey,uid:e.data.uid,localName:e.data.localName}})));var o=(t||n)&&JSON.stringify(angular.merge({},t||{},n||{}));return i&&n?J()?e.all([m.util.random_nonce(),m.box.keypair.fromSignKeypair(B.keypair),u.put(a,o||null)]).then((function(e){var i=e[0],o=e[1];return m.box.pack(JSON.stringify(n),i,o.boxPk,o.boxSk).then((function(e){return t=angular.merge(t||{},{encryptedData:{nonce:m.util.encode_base58(i),content:e}}),d.put(a,JSON.stringify(t))}))})):u.put(a,o||null):e.all([u.put(a,null),d.put(a,o||null)])},re=function(){return e.all([u.get("seckey"),d.get("pubkey"),d.get("uid")]).then((function(e){var t=e[0],n=e[1],i=e[2];if(n&&"null"!=n){var a;if(console.debug("[wallet] Restore {"+n.substring(0,8)+"} from local storage"),t&&t.length&&"null"!=t)try{a={signPk:m.util.decode_base58(n),signSk:m.util.decode_base58(t)}}catch(e){console.warn("[wallet] Secret key restoration failed: ",e),a=void 0}return B.pubkey=n,B.uid=i&&"null"!=i?i:void 0,B.keypair=a||{signPk:void 0,signSk:void 0},se()}})).then((function(){return J()?e.all([F.data.raisePromise.login(B),Ue(!0),F.data.raisePromise.auth(B)]).catch((function(e){console.warn("Error during extension call [wallet.api.data.on.auth]",e)})):q()?F.data.raisePromise.login(B).catch((function(e){console.warn("Error during extension call [wallet.api.data.on.login]",e)})):void 0})).then((function(){return B}))},se=function(){if(!q())throw{message:"ERROR.NEED_LOGIN_FIRST"};return ne()?e.when(B):e.all([u.getObject("data-"+B.pubkey),d.getObject("data-"+B.pubkey)]).then((function(e){var t=e[0],n=e[1];return t&&t.children&&t.children.length===n.childrenCount?le(t).catch((function(e){return console.error("[wallet] Failed to restore from the session storage ! Retrying from the local storage...",e),le(n)})):le(n)}))},le=function(t){if(!t)return e.when();if(t.children){var n=B.childrenCount,i=ye({stop:!1,store:!1});try{var a={};_.forEach(t.children,(function(e){if(!a[e.pubkey]){a[e.pubkey]=!0;var t=ke();t.data.pubkey=e.pubkey,t.data.localName=e.localName,t.data.uid=e.uid,De(t,{store:!1})}})),delete t.children,delete B.childrenCount}catch(t){return console.error("[wallet] Failed to restore children wallet.",t),B.childrenCount=n,B.children=i,e.reject({message:"ERROR.RESTORE_WALLET_LIST_FAILED"})}_.forEach(i||[],(function(e){e.stop()}))}return delete t.pubkey,delete t.uid,angular.merge(B,t),$()&&J()?we({store:!1}).then((function(){return B})):e.when(B)},ce=function(e,t){return Le("requirements"),v.loadRequirements(B,e).catch((function(n){if(!t)return console.error("[wallet] Unable to load requirements (first try): {0}. Retrying once...".format(n&&n.message||n),n),s.loading.update({template:"COMMON.LOADING_WAIT"}),ce(e,!0);throw console.error("[wallet] Unable to load requirements (after a second try): {0}".format(n&&n.message||n),n),n}))},de=function(e){return I.load(B.pubkey,e).then((function(e){G(),angular.merge(B,e)})).catch((function(e){throw G(),e}))},ue=function(){B.requirements.revoked?(delete B.requirements.meta.invalid,Ae({type:"info",message:"ERROR.WALLET_REVOKED",context:"requirements"})):B.requirements.pendingRevocation?(delete B.requirements.meta.invalid,Ae({type:"pending",message:"INFO.REVOCATION_SENT_WAITING_PROCESS",context:"requirements"})):(!B.isMember&&B.requirements.meta&&B.requirements.meta.invalid?(Ae({type:"error",message:"ERROR.WALLET_INVALID_BLOCK_HASH",context:"requirements"}),console.debug("Invalid membership for uid={0}: block hash changed".format(B.uid))):!B.isMember&&B.requirements.expired?(Ae({type:"error",message:"ERROR.WALLET_IDENTITY_EXPIRED",context:"requirements"}),console.debug("Identity expired for uid={0}.".format(B.uid))):B.requirements.pendingMembership?(Ae({type:"pending",message:"ACCOUNT.WAITING_MEMBERSHIP",context:"requirements"}),!B.requirements.needCertificationCount&&B.requirements.outdistanced&&Ae({type:"warn",message:"ACCOUNT.OUT_DISTANCED",context:"requirements"})):!B.requirements.needSelf&&B.requirements.needMembership&&Ae({type:"warn",message:"ACCOUNT.NO_WAITING_MEMBERSHIP",context:"requirements"}),B.requirements.needRenew?B.isMember&&B.requirements.membershipExpiresIn>0?Ae({type:"warn",message:"ACCOUNT.WILL_NEED_RENEW_MEMBERSHIP",messageParams:B.requirements,context:"requirements"}):!B.isMember&&B.requirements.membershipExpiresIn>0&&B.requirements.needCertificationCount>0?Ae({type:"warn",message:"ACCOUNT.NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED",messageParams:B.requirements,context:"requirements"}):Ae({type:"warn",message:"ACCOUNT.NEED_RENEW_MEMBERSHIP",messageParams:B.requirements,context:"requirements"}):(B.requirements.needCertificationCount>0&&(Ae({type:"info",message:"ACCOUNT.WAITING_CERTIFICATIONS",messageParams:B.requirements,context:"requirements"}),B.requirements.wasMember||Ae({type:"help",message:"ACCOUNT.WAITING_CERTIFICATIONS_HELP",messageParams:B.requirements,context:"requirements"})),B.requirements.willNeedCertificationCount>0&&Ae({type:"warn",message:"ACCOUNT.WILL_MISSING_CERTIFICATIONS",messageParams:B.requirements,context:"requirements"}),B.requirements.wasMember&&B.requirements.needMembership&&Ae({type:"warn",message:"ACCOUNT.NEED_RENEW_MEMBERSHIP",messageParams:B.requirements,context:"requirements"}),B.requirements.needCertificationCount||B.requirements.willNeedCertificationCount||!B.requirements.outdistanced||Ae({type:"warn",message:"ACCOUNT.OUT_DISTANCED",context:"requirements"})))},pe=function(){return A.wot.certifiedBy({pubkey:B.pubkey}).then((function(e){B.sigStock=e.certifications?e.certifications.reduce((function(e,t){return null===t.written?e:e+1}),0):0})).catch((function(e){if(e&&e.ucode==A.errorCodes.NO_MATCHING_MEMBER)B.sigStock=0;else{if(!e||1002!=e.ucode)throw e;console.warn("[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... "),B.sigStock=0}}))},me=function(){return!B.pubkey||B.qrcode?e.when(B.qrcode):(console.debug("[wallet] Creating SVG QRCode..."),n((function(){return B.qrcode=s.qrcode.svg(B.pubkey),B.qrcode})))},Ee=function(t){var n=!O.data.initPhase&&(!f.data.wallet||f.data.wallet.alertIfUnusedWallet)&&!B.loaded&&(!t||!t.minData||!t.silent);return P?P.then((function(){return ee(t)?B:fe(t)})):(P=t&&t.minData?ge(t):t||B.loaded?fe(t):be(),e.all([P,me()]).then((function(){var e=te();return!(n&&!ne()&&!0===e)||s.loading.hide().then((function(){return s.alert.confirm("CONFIRM.LOGIN_UNUSED_WALLET","CONFIRM.LOGIN_UNUSED_WALLET_TITLE",{cancelText:"COMMON.BTN_CONTINUE",okText:"COMMON.BTN_RETRY"})})).then((function(e){return e?z().then((function(){throw"RETRY"})):(f.data.wallet.alertIfUnusedWallet&&(f.data.wallet.alertIfUnusedWallet=!1,f.store()),!0)}))})).then((function(e){if(P=null,e)return B;throw"CANCELLED"})))},be=function(t){B.loaded=!1;var n=Date.now();return console.debug("[wallet] Loading {{0}} full data...".format(B.pubkey&&B.pubkey.substr(0,8))),e.all([ce(!0).then((function(e){if(e.requirements&&(e.requirements.isMember||e.requirements.wasMember))return pe();e.sigStock=0})),de(t||"pending")]).then((function(){return ue(),F.data.raisePromise.load(B).catch((function(e){console.error("[wallet] Error during load API extension point. Try to continue",e)}))})).then((function(){return B.loaded=!0,console.debug("[wallet] Loaded {{0}} full data in {1}ms".format(B.pubkey&&B.pubkey.substr(0,8),Date.now()-n)),s.loading.hide(1e3),B})).catch((function(e){throw B.loaded=!1,e}))},ge=function(t){return(t=t||{}).requirements=angular.isDefined(t.requirements)?t.requirements:!B.requirements.loaded||angular.isUndefined(B.requirements.needSelf),t.requirements?fe(t).then((function(e){return e.loaded=!0,e})):e.when(B)},fe=function(t){(t=t||{requirements:!0,sources:!0,tx:{enable:!0,fromTime:B.tx&&"pending"!==B.tx.fromTime?B.tx.fromTime:void 0},sigStock:!0,api:!0}).requirements=angular.isDefined(t.requirements)?t.requirements:!B.requirements.loaded,angular.isUndefined(t.sources)&&t.tx&&t.tx.enable&&(t.sources=!0);var n=[],i=Date.now();return console.debug("[wallet] {0} {{1}} data, with options: ".format(B.loaded?"Refreshing":"Loading",B.pubkey.substr(0,8)),t),t.requirements&&(Le("requirements"),n.push(ce(!0).then(ue))),!t.sources||t.tx&&!t.tx.enable?t.sources&&t.tx&&!t.tx.enable&&n.push(de("pending")):n.push(de(t.tx?t.tx.fromTime:void 0)),t.sigStock&&n.push(pe()),(n.length?e.all(n):e.when()).then((function(){return angular.isDefined(t.api)&&!t.api?B:F.data.raisePromise.load(B).then((function(){return console.debug("[wallet] {0} {{1}} data in {2}ms".format(B.loaded?"Refreshed":"Loaded",B.pubkey.substr(0,8),Date.now()-i)),B.loaded||(B.loaded=B.requirements.loaded&&B.sources&&!0),B}))})).catch((function(e){throw console.error("[wallet] Error while {0} data: {1}".format(B.loaded?"Refreshing":"Loading",e&&e.message||e),e),B.loaded=B.requirements.loaded&&B.sources&&!0,e}))},_e=function(t,n){return B.uid!=t||n&&B.blockUid!=n?B.loaded?(B.uid=t,B.blockUid=n,fe({requirements:!0,sigStock:!0}).then((function(){return ie({skipData:!0})}))):P?P.then((function(){return _e(t,n)})):e.when():e.when()},he=function(e,t){var n=Math.pow(10,t);return e<n?0:Math.trunc(e/n)*n},Te=function(e,t){return t<=0?e:e*Math.pow(10,t)},ve=function(e,t,n){angular.isUndefined(n)&&(n=t);var i=0,a=[],o=n,r=n;if(_.find(B.sources||[],(function(t){return!t.consumed&&t.base===n&&A.regexp.TX_OUTPUT_SIG.exec(t.conditions)&&(i+=Te(t.amount,t.base),a.push(t)),i>=e})),i<e&&n>0){var s=ve(e-i,t,n-=1);s.amount>0&&(o=s.minBase,i+=s.amount,[].push.apply(a,s.sources))}return{minBase:o,maxBase:r,amount:i,sources:a}},Ie=function(t,i,r,l,c,d){return e.all([Z(),O.get(),d&&e.when(d)||O.blockchain.current(!0)]).then((function(e){var u=e[0],p=e[1];if(d=e[2],!A.regexp.PUBKEY.test(t))throw{message:"ERROR.INVALID_PUBKEY"};if(!A.regexp.COMMENT.test(r))throw{message:"ERROR.INVALID_COMMENT"};if(!q())throw{message:"ERROR.NEED_LOGIN_FIRST"};if(t===B.pubkey)throw{message:"ERROR.SAME_TX_RECIPIENT"};if(!i)throw{message:"ERROR.AMOUNT_REQUIRED"};if(i<=0)throw{message:"ERROR.AMOUNT_NEGATIVE"};i=Math.floor(i);var m={amount:0,minBase:d.unitbase,maxBase:d.unitbase+1,sources:[]},E=[];E.push("[wallet] amount="+i);for(var b=0;m.amount<i&&b<=d.unitbase;)(m=ve(i,d.unitbase)).amount<i&&++b<=d.unitbase&&(i=he(i,b),E.push("[wallet] inputs not found. Retrying with amount ="+i+" be compatible with amountBase="+b));if(m.amount<i){if(B.balance<i)throw{message:"ERROR.NOT_ENOUGH_CREDIT"};if(0===m.amount)throw{message:"ERROR.ALL_SOURCES_USED"};return a("COMMON.UD").then((function(e){var t;return t=l?{amount:o("formatDecimal")(m.amount/p.currentUD),unit:e,subUnit:o("abbreviate")(p.name)}:{amount:o("formatDecimal")(m.amount/100),unit:o("abbreviate")(p.name),subUnit:""},a("ERROR.NOT_ENOUGH_SOURCES",t).then((function(e){throw{message:e}}))}))}return b<m.minBase&&!function(e,t){if(!t)return!0;if(e<Math.pow(10,t))return!1;var n="00000000"+e;return 0===parseInt(n.substring(n.length-t))}(i,m.minBase)?(i=function(e,t){var n=Math.pow(10,t);return e<n?n:Math.trunc(e/n)*n}(i,m.minBase),console.debug("[wallet] Amount has been truncate to "+i),E.push("[wallet] Amount has been truncate to "+i)):b>0&&(console.debug("[wallet] Amount has been truncate to "+i),E.push("[wallet] Will use amount truncated to "+i+" (amountBase="+b+")")),Oe(p,d,u,t,i,m,r,c||B.pubkey,E).then((function(e){B.balance-=e.amount,B.balance<0&&(B.balance=0),_.forEach(m.sources,(function(e){e.consumed=!0})),e&&e.sources.length&&(console.debug("[wallet-service] New sources to be add after the TX: ",e.sources),K(e.sources));var n={time:O.date.now(),amount:-i,pubkey:t,comment:r,isUD:!1,hash:e.hash,locktime:0,block_number:null};return v.extendAll([n],"pubkey").then((function(){return B.tx.pendings.unshift(n),F.data.raise.balanceChanged(B),F.data.raise.newTx(B),{hash:e.hash}}))})).catch((function(e){if(e&&e.ucode===A.errorCodes.SOURCE_ALREADY_CONSUMED)return console.debug("[wallet] TX rejected by node with error [{0}]. Reloading sources then retry...".format(e.message||"Source already consumed")),n(de,500).then((function(){return Ie(t,i,r,l,c,d)}));if(e&&e.ucode===A.errorCodes.TX_INPUTS_OUTPUTS_NOT_EQUAL&&f.data.plugins&&f.data.plugins.es&&f.data.plugins.es.enable)return s.loading.hide(),s.alert.confirm("CONFIRM.ISSUE_524_SEND_LOG","ERROR.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_OK",cancelText:"COMMON.BTN_NO"}).then((function(e){if(e)return F.error.raise.send({title:"Issue #524 logs",content:"App version: "+g.version+"\nApp build: "+g.build+"\nLogs:\n\n"+E.join("\n")}),n((function(){throw{message:"ERROR.ISSUE_524_TX_FAILED"}}),1500);throw{message:"ERROR.SEND_TX_FAILED"}}));throw e}))}))},Oe=function(e,t,n,a,o,r,s,l,c){if(r.sources.length>40){console.debug("[Wallet] TX has to many sources. Will chain TX...");var d={minBase:t.unitbase,maxBase:0,amount:0,sources:r.sources.slice(0,40)};return _.forEach(d.sources,(function(e){e.base<d.minBase&&(d.minBase=e.base),e.base>d.maxBase&&(d.maxBase=e.base),d.amount+=Te(e.amount,e.base)})),Oe(e,t,n,B.pubkey,d.amount,d,void 0,B.pubkey,c).then((function(i){_.forEach(d.sources,(function(e){e.consumed=!0})),K(i.sources);var u={minBase:t.unitbase,maxBase:0,amount:0,sources:r.sources.slice(40).concat(i.sources)};return _.forEach(u.sources,(function(e){e.base<u.minBase&&(u.minBase=e.base),e.base>u.maxBase&&(u.maxBase=e.base),u.amount+=Te(e.amount,e.base)})),Oe(e,t,n,a,o,u,s,l,c)}))}var u="Version: "+k+"\nType: Transaction\nCurrency: "+e.name+"\nBlockstamp: "+t.number+"-"+t.hash+"\nLocktime: 0\nIssuers:\n"+B.pubkey+"\nInputs:\n";for(_.forEach(r.sources,(function(e){u+=[e.amount,e.base,e.type,e.identifier,e.noffset].join(":")+"\n"})),u+="Unlocks:\n",i=0;i<r.sources.length;i++)u+=i+":SIG(0)\n";u+="Outputs:\n";var p,E=o,b=r.maxBase,g=0,f=[];if(a!==B.pubkey){for(;E>0;)E-=p=he(E,b),p>0&&(p=0===b?p:p/Math.pow(10,b),u+=p+":"+b+":SIG("+a+")\n",g++),b--;E=r.amount-o,b=r.maxBase}for(;E>0;)E-=p=he(E,b),p>0&&(p=0===b?p:p/Math.pow(10,b),u+=p+":"+b+":SIG("+l+")\n",B.pubkey===l&&f.push({type:"T",noffset:g,amount:p,base:b,conditions:"SIG("+l+")",consumed:!1}),g++),b--;return u+="Comment: "+(s||"")+"\n",c&&(a==B.pubkey?c.push("[wallet] Creating new TX, using inputs:\n - minBase: "+r.minBase+"\n - maxBase: "+r.maxBase):c.push("[wallet] Creating new TX, using inputs:\n - minBase: "+r.minBase+"\n - maxBase: "+r.maxBase+"\n - sources (=TX inputs):"),_.forEach(r.sources,(function(e){c.push([e.amount,e.base,e.type,e.identifier,e.noffset].join(":"))})),c.push("\n[wallet] generated TX document (without signature) :\n------ START ------\n"+u+"------ END ------\n")),m.sign(u,n).then((function(e){var t=u+e+"\n";return A.tx.process({transaction:t}).catch((function(e){if(!e||e.ucode!==A.errorCodes.TX_ALREADY_PROCESSED)throw e})).then((function(){return m.util.hash(t)})).then((function(e){return _.forEach(f,(function(t){t.identifier=e,t.consumed=!1,t.pending=!0})),{amount:B.pubkey===a?0:B.pubkey===l?o:r.amount,tx:t,hash:e,sources:f}}))}))},Ne=function(e,t,n,i){if(n=n||B.uid,i=i||B.blockUid,!n||!i)throw{message:"ERROR.WALLET_HAS_NO_SELF"};if(B.requirements.expired)throw{message:"ERROR.WALLET_IDENTITY_EXPIRED"};var a="Version: "+M+"\nType: Identity\nCurrency: "+e.name+"\nIssuer: "+B.pubkey+"\nUniqueID: "+n+"\nTimestamp: "+i+"\n";return m.sign(a,t).then((function(e){return a+=e+"\n",console.debug("Has generate an identity document:\n----\n"+a+"----"),a}))},Re=function(t){return function(){var i;return e.all([Z(),O.blockchain.lastValid()]).then((function(e){var n=e[0],a=e[1];return i="Version: "+w+"\nType: Membership\nCurrency: "+a.currency+"\nIssuer: "+B.pubkey+"\nBlock: "+a.number+"-"+a.hash+"\nMembership: "+(t?"IN":"OUT")+"\nUserID: "+B.uid+"\nCertTS: "+B.blockUid+"\n",m.sign(i,n)})).then((function(e){var t=i+e+"\n";return A.blockchain.membership({membership:t})})).then((function(){return n((function(){return ce(!1)}),1e3)})).then(ue)}},Ae=function(e,t){(e=e||{}).type=e.type||"info",e.message=e.message||"",e.messageParams=e.messageParams||{},e.context=e.context||"undefined",e.message.trim().length?t?B.events.splice(0,0,e):B.events.push(e):console.debug("Event without message. Skipping this event")},Se=function(e){var t=Math.round(e.answer.length/2),n=e.answer.substr(0,t),i=e.answer.substr(t);return m.scryptKeypair(n,i).then((function(t){return e.pubkey=m.util.encode_base58(t.signPk),e.keypair=t,e}))},Ce=function(){return e.all([Z(),O.get()]).then((function(e){var t=e[0],n=e[1];return Ne(n,t).then((function(e){var i=e.trim().split("\n"),a=i[i.length-1],o="Version: "+x+"\nType: Revocation\nCurrency: "+n.name+"\nIssuer: "+B.pubkey+"\nIdtyUniqueID: "+B.uid+"\nIdtyTimestamp: "+B.blockUid+"\nIdtySignature: "+a+"\n";return m.sign(o,t).then((function(e){return o+=e+"\n",console.debug("Has generate an revocation document:\n----\n"+o+"----"),o}))}))}))},Le=function(e){B.events=B.events.reduce((function(t,n){return n.context&&n.context==e?t:t.concat(n)}),[])},De=function(t,n){return t.children.setParent(S),B.children=B.children||[],B.children.push(t),!n||angular.isUndefined(n.store)||n.store?oe():e.when()},ye=function(e){e&&!e.stop||_.forEach(B.children||[],(function(e){e.stop()}));var t=B.children.splice(0,B.children.length);return!e||angular.isUndefined(e.store)||e.store?oe():t},Pe=function(e){return _.find(B.children||[],(function(t){return t.isUserPubkey(e)}))},ke=function(){var e=(B.children||[]).reduce((function(e,t){return Math.max(e,t.id)}),0)+1;return N.instance(e,A)},Me=function(){return we().then((function(){return B.children}))},we=function(t){return $()?J()?m.box.keypair.fromSignKeypair(B.keypair).then((function(e){var t=m.util.decode_base58(B.encryptedData.nonce);return m.box.open(B.encryptedData.content,t,e.boxPk,e.boxSk)})).then((function(e){B.encryptedData=null;var n=le(JSON.parse(e));return(!t||angular.isUndefined(t.store)||t.store)&&n.then((function(){return oe()})),n})):X().then(we):e.when()},Ue=function(e){var t=(e=angular.isDefined(e)?e:J())&&C&&C.keepAuthIdle>0&&C.keepAuthIdle!=f.constants.KEEP_AUTH_IDLE_SESSION,n=H!=t;n?(t?(console.debug("[wallet] Start idle (delay: {0}s)".format(C.keepAuthIdle)),c.setIdle(C.keepAuthIdle),c.watch()):H&&(console.debug("[wallet] Stop idle"),c.unwatch()),H=t):t&&c.getIdle()!==C.keepAuthIdle&&(console.debug("[idle] Updating auth idle (delay: {0}s)".format(C.keepAuthIdle)),c.setIdle(C.keepAuthIdle)),e&&C&&C.keepAuthIdle==f.constants.KEEP_AUTH_IDLE_SESSION?u.put("seckey",m.util.encode_base58(B.keypair.signSk)):n&&u.put("seckey",null)};function xe(e){return e&&{useLocalStorage:e.useLocalStorage,useLocalStorageEncryption:e.useLocalStorageEncryption,rememberMe:e.rememberMe,keepAuthIdle:e.keepAuthIdle}}function Be(e){var t=xe(e);if(!angular.equals(C,t)&&C){var n=!angular.equals(C.useLocalStorageEncryption,t.useLocalStorageEncryption),i=!angular.equals(C.useLocalStorage,t.useLocalStorage)||n,a=!angular.equals(C.keepAuthIdle,t.keepAuthIdle);if(C=t,a&&Ue(),i){if(C.useLocalStorage)return ie().then((function(){if(B.childrenCount>0&&n&&C.useLocalStorageEncryption)return X({minData:!0,silent:!0}).catch((function(e){if("CANCELLED"===e)return f.apply({useLocalStorageEncryption:!1}),f.store();throw e}))})).then(oe);ae(B.pubkey)}}}function He(){_.forEach(L,(function(e){e()})),L=[]}function Fe(){console.debug("[wallet] Stopping..."),He(),W()}function We(){return Fe(),n(Ve,200)}function Ve(n){(n=n||{}).restore=angular.isDefined(n.restore)?n.restore:"default"===b,console.debug("[wallet] Starting...");var i=Date.now();return y=e.all([f.ready().then((function(){C=xe(f.data)})),O.ready(),A.ready()]),n.restore&&(y=y.then(re)),y.then((function(){!function(){L=[f.api.data.on.changed(t,Be,this),A.api.node.on.restart(t,We,this)],t.$on("IdleStart",Q)}(),console.debug("[wallet] Started in "+(Date.now()-i)+"ms"),D=!0,y=null})).then((function(){return B})),y}return F.registerEvent("data","init"),F.registerEvent("data","loginCheck"),F.registerEvent("data","login"),F.registerEvent("data","auth"),F.registerEvent("data","unauth"),F.registerEvent("data","load"),F.registerEvent("data","logout"),F.registerEvent("data","reset"),F.registerEvent("data","store"),F.registerEvent("error","send"),F.registerEvent("data","balanceChanged"),F.registerEvent("data","newTx"),F.registerEvent("action","certify"),W(!0),"default"!==b&&(ie=e.when,re=e.when,se=e.when),S={id:b,data:B,ready:function(){return D?e.when():y||Ve()},start:Ve,stop:Fe,login:j,logout:z,auth:X,unauth:Q,isLogin:q,isAuth:J,getKeypair:Z,hasSelf:function(){return!!B.pubkey&&!B.requirements.needSelf},setSelf:_e,isMember:function(){return B.isMember},isDataLoaded:ee,isDefault:Y,isNeverUsed:te,isNew:ne,isUserPubkey:function(e){return q()&&B.pubkey===e},getData:function(){return B},loadData:Ee,refreshData:fe,loadQrCode:me,internal:{addListener:function(e){(L=L||[]).push(e)},removeListeners:He},store:ie,storeData:oe,transfer:Ie,transferAll:function(t,n,i,a,o){return q()?o&&t!=o?O.blockchain.lastValid().then((function(e){return console.debug("[wallet] Using last valid block as TX reference (to avoid network fork): ",e),Ie(t,n,i,a,o,e).then((function(){if(B.balance>0&&o)return console.debug("[wallet] Wallet has some more money: transfering fund to [{0}]".format(o.substring(0,8))),Ie(o,B.balance,void 0,!1,o,e)}))})):e.reject({message:"Could not have same pubkey for 'destPub' and 'restPub'"}):e.reject({message:"ERROR.NEED_LOGIN_FIRST"})},self:function(t,n){return A.regexp.USER_ID.test(t)?e.all([Z(),O.get(),O.blockchain.lastValid()]).then((function(e){var n=e[0],a=e[1];return i=e[2],Ne(a,n,t,i.number+"-"+i.hash)})).then((function(e){return A.wot.add({identity:e})})).then((function(){if(n)return ce(!1).then(ue);B.uid=t,B.blockUid=i.number+"-"+i.hash})).catch((function(e){if(e&&e.ucode===A.errorCodes.IDENTITY_SANDBOX_FULL)throw{ucode:A.errorCodes.IDENTITY_SANDBOX_FULL,message:"ERROR.IDENTITY_SANDBOX_FULL"};throw e})):e.reject({message:"ERROR.INVALID_USER_ID"});var i},revoke:function(){return Le("revocation"),Ce().then((function(e){return A.wot.revoke({revocation:e})})).then((function(){return n((function(){return ce(!1)}),1e3)})).then(ue).catch((function(e){if(!e||e.ucode!=A.errorCodes.REVOCATION_ALREADY_REGISTERED)throw e;Ae({type:"pending",message:"INFO.REVOCATION_SENT_WAITING_PROCESS",context:"requirements"},!0)}))},revokeWithFile:function(t){return e.all([A.wot.revoke({revocation:t})]).then((function(e){if(q())return n((function(){return ce(!1)}),1e3).then(ue).catch((function(e){if(!e||e.ucode!=A.errorCodes.REVOCATION_ALREADY_REGISTERED)throw e;Ae({type:"pending",message:"INFO.REVOCATION_SENT_WAITING_PROCESS",context:"requirements"},!0)}));Ae({type:"pending",message:"INFO.REVOCATION_SENT_WAITING_PROCESS",context:"requirements"},!0)}))},certify:function(t,n,i,a,o,r){return e.all([Z(),O.get(),O.blockchain.lastValid()]).then((function(e){var s=e[0],l=e[1],c=e[2];if(!B.isMember&&!g.initPhase)throw{message:"ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION"};var d="Version: "+U+"\nType: Certification\nCurrency: "+l.name+"\nIssuer: "+B.pubkey+"\nIdtyIssuer: "+n+"\nIdtyUniqueID: "+t+"\nIdtyTimestamp: "+i+"\nIdtySignature: "+a+"\nCertTimestamp: "+c.number+"-"+c.hash+"\n";return m.sign(d,s).then((function(e){var t=d+e+"\n";return A.wot.certify({cert:t})})).then((function(){var e={pubkey:n,uid:t,time:c.medianTime,isMember:o,wasMember:r,expiresIn:l.parameters.sigWindow,pending:!0,block:c.number,valid:!0};return F.action.raise.certify(e),e}))}))},downloadSaveId:function(e){return function(e){var t="Version: 10 \nType: SaveID\nQuestions: \n"+e.questions+"Issuer: "+B.pubkey+"\nCrypted-Nonce: "+e.nonce+"\nCrypted-Pubkey: "+e.pubkey+"\nCrypted-Salt: "+e.salt+"\nCrypted-Pwd: "+e.pwd+"\n";return m.sign(t,B.keypair).then((function(e){return t+=e+"\n",console.debug("Has generate an SaveID document:\n----\n"+t+"----"),t}))}(e).then((function(e){var t=new T([e],{type:"text/plain; charset=utf-8"});h.saveAs(t,"{0}-recover_ID.txt".format(B.pubkey.substring(0,8)))}))},getCryptedId:function(t){return Se(t).then(m.util.random_nonce).then((function(n){return t.nonce=m.util.encode_base58(n),e.all([m.box.pack(t.salt,n,t.keypair.boxPk,t.keypair.boxSk),m.box.pack(t.pwd,n,t.keypair.boxPk,t.keypair.boxSk)])})).then((function(e){return t.salt=e[0],t.pwd=e[1],t}))},recoverId:function(e){if(!(e&&e.cypherNonce&&e.cypherSalt&&e.cypherPwd))throw{message:"ERROR.INVALID_FILE_FORMAT"};var t=m.util.decode_base58(e.cypherNonce);return Se(e).then((function(e){return m.box.open(e.cypherSalt,t,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.salt=n,m.box.open(e.cypherPwd,t,e.keypair.boxPk,e.keypair.boxSk)})).then((function(t){return e.pwd=t,e})).catch((function(e){throw console.warn("Incorrect answers: unable to recover identifiers",e),new Error("Incorrect answers: unable to recover identifiers")}))},downloadRevocation:function(){return e.all([O.get(),Ce()]).then((function(e){var t=e[0],n=e[1],i=new T([n],{type:"text/plain; charset=utf-8"});return a("ACCOUNT.SECURITY.REVOCATION_FILENAME",{uid:B.uid,currency:t.name,pubkey:B.pubkey}).then((function(e){h.saveAs(i,e)}))}))},downloadKeyFile:function(t){return J()?e.all([O.get(),E.keyfile.generateContent(B.keypair,{type:t,password:function(){return s.loading.hide(),p.showPassword({title:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE",subTitle:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP"}).then((function(e){return s.loading.show(10).then((function(){return e}))}))}})]).then((function(e){var n=e[0],i=e[1];return a("ACCOUNT.SECURITY.KEYFILE_FILENAME",{currency:n.name,pubkey:B.pubkey,format:t}).then((function(e){var t=new T([i],{type:"text/plain; charset=utf-8"});h.saveAs(t,e)}))})):e.reject("user not authenticated")},pubkeys:function(){if(!B.pubkey)throw new Error("User not login!");return(B.children||[]).reduce((function(e,t){return t.data.pubkey?e.concat(t.data.pubkey):e}),[B.pubkey])},getByPubkey:function(e){if(!e)throw new Error("Missing 'pubkey' argument !");if(!B.pubkey)throw new Error("User not login!");return B.pubkey===e?S:Pe(e)},membership:{inside:Re(!0),out:Re(!1)},events:{add:Ae,cleanByContext:Le},children:{create:function(e){var t=ke();return De(t,e),t},add:De,remove:function(t,n){B.children=B.children||[];var i=_.findIndex(B.children,(function(e){return e.id===t}));if(-1===i)throw console.warn("[wallet] Unable to remove child wallet {{0}} (not found)".format(t)),new Error("Wallet with id {{0}} not found".format(t));return B.children.splice(i,1)[0].stop(),n&&!1===n.store?e.when():oe()},get:function(e){return"default"!==e&&_.find(B.children||[],(function(t){return t.id===+e}))||void 0},getByPubkey:Pe,all:Me,setParent:function(n){var i;L=L||[],_.forEach(["load","reset"],(function(a){i=F.data.on[a](t,(function(t,i){return i=i||e.defer(),n.api.data.raisePromise[a](t).then(i.resolve).catch(i.reject),i.promise}),this),L.push(i)})),i=n.api.data.on.unauth(t,(function(){J()&&Q()}),this),L.push(i)},count:function(){return angular.isDefined(B.childrenCount)?B.childrenCount:B.children&&B.children.length||0},hasPubkey:function(e){return!!Pe(e)},instance:ke,downloadFile:function(){return e.all([Me(),O.get()]).then((function(e){var t=e[0],n=e[1],i=(t||[]).reduce((function(e,t){return e+[t.data.pubkey,t.data.uid,t.data.localName||t.data.name].join("\t")+"\n"}),""),o=new T([i],{type:"text/plain; charset=utf-8"});return a("ACCOUNT.WALLET_LIST.EXPORT_FILENAME",{pubkey:B.pubkey,currency:n.name}).then((function(e){h.saveAs(o,e)}))}))}},api:F}}return(N=A("default",b)).instance=A,N}]),angular.module("cesium.help.services",[]).constant("csHelpConstants",{wallet:{stepCount:4}}).factory("csHelp",["$rootScope","csSettings","UIUtils","csHelpConstants","$controller",function(e,t,n,i,a){function o(o,r){if(o=angular.isDefined(o)?o:t.data.helptip.wallet,r=!!angular.isDefined(r)&&r,!(o<0||o>=i.wallet.stepCount)){var s=function(i,o){if(i||!e.tour&&t.data.helptip.enable&&!n.screen.isSmall()){var r=e.$new();return a("HelpTipCtrl",{$scope:r}),r}}(r);if(s)return s.tour=r,s.startWalletTour(o,!1).then((function(e){s.$destroy(),r||(t.data.helptip.wallet=e,t.store())}))}}return{wallet:{tour:function(){return o(0,!0)},helptip:o}}}]),angular.module("cesium.plugin.services",[]).provider("PluginService",(function(){var e=[],t={};this.registerEagerLoadingService=function(t){return e.push(t),this},this.extendState=function(e,n){return angular.isDefined(e)&&angular.isDefined(n)&&(t[e]||(t[e]=[]),t[e].push(n)),this},this.extendStates=function(e,t){var n=this;return e.forEach((function(e){n.extendState(e,t)})),this},this.$get=["$injector","$state",function(n,i){var a;return{start:function(){e.length>0&&_.forEach(e,(function(e){n.get(e)}))},extensions:{points:{getActivesByName:function(e){return _.keys(t).reduce((function(e,n){return i.includes(n)?e.concat(t[n]):e}),[]).reduce((function(t,n){return n.points&&n.points[e]?t.concat(n.points[e]):t}),[])},current:{get:function(){return a},set:function(e){a=e}}}}}}]})),angular.module("cesium.desktop.services",["cesium.device.services","cesium.settings.services"]).factory("csDesktop",["$rootScope","Device",function(e,t){t.isDesktop()&&console.info("Starting desktop mode...")}]),angular.module("cesium.services",["cesium.desktop.services","cesium.settings.services","cesium.http.services","cesium.network.services","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.modal.services","cesium.storage.services","cesium.device.services","cesium.currency.services","cesium.wot.services","cesium.tx.services","cesium.wallet.services","cesium.help.services","cesium.plugin.services"]),e.prototype.regexp={BMA:/^BASIC_MERKLED_API[ ]?/,BMAS:/^BMAS[ ]?/,WS2P:/^WS2P[ ]?/,BMA_REGEXP:/^BASIC_MERKLED_API([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,BMAS_REGEXP:/^BMAS([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,WS2P_REGEXP:/^WS2P[ ]+([a-z0-9]+)([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))([ ]+([a-z0-9/.&#!]+))?$/,LOCAL_IP_ADDRESS:/^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/},e.prototype.regex=e.prototype.regexp,e.prototype.keyID=function(){var e=this.bma||this.getBMA();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("-")},e.prototype.copyValues=function(e){var t=this;["version","currency","pub","endpoints","hash","status","block","signature"].forEach((function(n){e[n]=t[n]}))},e.prototype.copyValuesFrom=function(e){var t=this;["version","currency","pub","endpoints","block","signature"].forEach((function(n){t[n]=e[n]}))},e.prototype.json=function(){var e=this,t={};return["version","currency","endpoints","status","block","signature"].forEach((function(n){t[n]=e[n]})),t.raw=this.raw&&this.getRaw(),t.pubkey=this.pubkey,t},e.prototype.getBMA=function(){if(this.bma)return this.bma;var e=null,t=this.regexp.BMA_REGEXP,n=this.regexp.BMAS_REGEXP;return this.endpoints.forEach((function(i){var a=!e&&t.exec(i);a&&(e={dns:a[2]||"",ipv4:a[4]||"",ipv6:a[6]||"",port:a[8]||80,useSsl:443==a[8],useBma:!0}),(a=!e&&n.exec(i))&&(e={dns:a[2]||"",ipv4:a[4]||"",ipv6:a[6]||"",port:a[8]||80,useSsl:!0,useBma:!0})})),e||{}},e.prototype.getEndpoints=function(e){return e?this.endpoints.reduce((function(t,n){return n.match(e)?t.concat(n):t}),[]):this.endpoints},e.prototype.hasEndpoint=function(e){var t=this.regexp[e]||new RegExp("^"+e);return!!this.getEndpoints(t).length},e.prototype.getDns=function(){var e=this.bma||this.getBMA();return e.dns?e.dns:null},e.prototype.getIPv4=function(){var e=this.bma||this.getBMA();return e.ipv4?e.ipv4:null},e.prototype.getIPv6=function(){var e=this.bma||this.getBMA();return e.ipv6?e.ipv6:null},e.prototype.getPort=function(){var e=this.bma||this.getBMA();return e.port?e.port:null},e.prototype.getHost=function(e){return bma=e||this.bma||this.getBMA(),(443==bma.port||bma.useSsl)&&bma.dns?bma.dns:this.hasValid4(bma)?bma.ipv4:bma.dns?bma.dns:bma.ipv6?"["+bma.ipv6+"]":""},e.prototype.getURL=function(e){e=e||this.bma||this.getBMA();var t=this.getHost(e);return(443==e.port||e.useSsl?"https":"http")+"://"+t+(e.port?":"+e.port:"")},e.prototype.getServer=function(e){e=e||this.bma||this.getBMA();var t=this.getHost(e);return t+(t&&e.port?":"+e.port:"")},e.prototype.hasValid4=function(e){return!(!e.ipv4||e.ipv4.match(this.regexp.LOCAL_IP_ADDRESS))},e.prototype.isReachable=function(){return!!this.getServer()},e.prototype.isSsl=function(){return(this.bma||this.getBMA()).useSsl},e.prototype.isTor=function(){return(this.bma||this.getBMA()).useTor},e.prototype.isWs2p=function(){return(this.bma||this.getBMA()).useWs2p},e.prototype.isBma=function(){var e=this.bma||this.getBMA();return!e.useWs2p&&!e.useTor},e.prototype.hasBma=function(){return this.hasEndpoint("(BASIC_MERKLE_API|BMAS|BMATOR)")},t.prototype.isEmpty=function(){"use strict";return!(this.transactionsCount||this.certificationsCount||this.joinersCount||this.dividend||this.activesCount||this.identitiesCount||this.leaversCount||this.excludedCount||this.revokedCount)},t.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},t.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},t.prototype.parseArrayValues=function(e,t){return e&&e.length?e.reduce((function(e,n){var i=n.split(":");if(i.length!=t.length)return console.debug("[block] Bad format for '{0}': [{1}]. Expected {1} parts. Skipping".format(arrayProperty,n,t.length)),e;for(var a={},o=0;o<t.length;o++)a[t[o]]=i[o];return e.concat(a)}),[]):[]},t.prototype.regexp={TX_OUTPUT_SIG:("SIG\\(([0-9a-zA-Z]{43,44})\\)",new RegExp("^SIG\\(([0-9a-zA-Z]{43,44})\\)$"))},t.prototype.parseTransactions=function(e){return e&&e.length?e.reduce((function(e,n){var i={issuers:n.issuers,time:n.time};return i.outputs=n.outputs.reduce((function(e,i){var a=i.split(":");if(3!=a.length)return console.debug("[block] Bad format a 'transactions': [{0}]. Expected 3 parts. Skipping".format(i)),e;var o=a[0],r=a[1],s=a[2],l=t.prototype.regexp.TX_OUTPUT_SIG.exec(a[2]);if(l){var c=l[1];return n.issuers&&-1==n.issuers.indexOf(c)?e.concat({amount:r<=0?o:o*Math.pow(10,r),unitbase:r,pubkey:c}):e}return e.concat({amount:r<=0?o:o*Math.pow(10,r),unitbase:r,unlockCondition:s})}),[]),i.error||i.outputs.length||(i.toHimself=!0),e.concat(i)}),[]):[]},n.prototype.regexp={WS2P_PREFIX:/^WS2P(?:O([CT][SAM]))?(?:I([CT]))?$/},o.$inject=["$scope","$rootScope","$state","$ionicSideMenuDelegate","$q","$timeout","$ionicHistory","$controller","$window","csPlatform","csSettings","CryptoUtils","csCrypto","UIUtils","BMA","csWallet","Device","Modals","csConfig","csHttp"],r.$inject=["$scope","$state","$timeout","$ionicHistory","$translate","$http","UIUtils","csConfig","csCache","csPlatform","csCurrency","csSettings"],a.$inject=["$scope","PluginService"],angular.module("cesium.app.controllers",["cesium.platform","cesium.services"]).config(["$stateProvider","$urlRouterProvider",function(e,t){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"}}}).state("app.lock",{cache:!1,url:"/lock",views:{menuContent:{templateUrl:"templates/common/view_passcode.html",controller:"PassCodeCtrl"}}}),t.otherwise("/app/home")}]).controller("AppCtrl",o).controller("HomeCtrl",r).controller("PluginExtensionPointCtrl",a),s.$inject=["$scope","$timeout","$controller","Modals","csWallet"],l.$inject=["$scope","$state","Modals","UIUtils","csConfig","csCurrency"],c.$inject=["$scope","$state","$interval","$q","$timeout","Device","UIUtils","CryptoUtils","csSettings","Modals","csWallet","BMA","parameters"],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",s).controller("JoinChooseAccountTypeModalCtrl",l).controller("JoinModalCtrl",c),d.$inject=["$scope","$timeout","$controller","csWallet"],u.$inject=["$scope","$timeout","$q","$ionicPopover","$window","CryptoUtils","csCrypto","ionicReady","UIUtils","BMA","Modals","csConfig","csSettings","Device","parameters"],p.$inject=["$scope","$controller","csConfig"],angular.module("cesium.login.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.login",{url:"/login",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"LoginCtrl"}}})}]).controller("LoginCtrl",d).controller("LoginModalCtrl",u).controller("AuthCtrl",p),m.$inject=["$scope","$state","$timeout","$anchorScroll","csSettings"],E.$inject=["$scope","$timeout","$anchorScroll","csSettings","parameters"],b.$inject=["$scope","$state","$window","$ionicSideMenuDelegate","$timeout","$q","$anchorScroll","UIUtils","csConfig","csSettings","csCurrency","csHelpConstants","Device","csWallet"],g.$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",m).controller("HelpModalCtrl",E).controller("HelpTipCtrl",b).controller("HelpTourCtrl",g),f.$inject=["$scope","$rootScope","$q","$ionicPopup","$timeout","$state","$translate","$ionicPopover","$location","UIUtils","ModalUtils","Modals","csPopovers","BMA","csConfig","csSettings","csWallet","csHelp"],h.$inject=["$scope","$ionicPopover","$state","$timeout","$location","UIUtils","Modals","csPopovers","BMA","csHttp","csSettings","csCurrency","csWallet","csTx"],T.$inject=["$scope","UIUtils","csSettings","csWallet"],v.$inject=["$scope","UIUtils","csConfig","csWallet","$translate","parameters"],angular.module("cesium.wallet.controllers",["cesium.services","cesium.currency.controllers"]).config(["$stateProvider",function(e){e.state("app.view_wallet",{url:"/account?refresh",views:{menuContent:{templateUrl:"templates/wallet/view_wallet.html",controller:"WalletCtrl"}},data:{login:!0,silentLocationChange:!0}}).state("app.view_wallet_tx",{url:"/history/account?refresh",views:{menuContent:{templateUrl:"templates/wallet/view_wallet_tx.html",controller:"WalletTxCtrl"}},data:{login:!0,silentLocationChange:!0}}).state("app.view_wallet_tx_errors",{url:"/history/account/errors",views:{menuContent:{templateUrl:"templates/wallet/view_wallet_tx_error.html",controller:"WalletTxErrorCtrl"}},data:{login:!0}})}]).controller("WalletCtrl",f).controller("WalletTxCtrl",h).controller("WalletTxErrorCtrl",T).controller("WalletSecurityModalCtrl",v),I.$inject=["$scope","$q","$timeout","UIUtils","filterTranslations","csSettings","csCurrency","csWallet"],N.$inject=["$scope","$controller","$state","$timeout","$q","$translate","$ionicPopover","$ionicPopup","ModalUtils","UIUtils","Modals","csCurrency","csSettings","csWallet"],O.$inject=["$scope","$controller","parameters"],A.$inject=["$scope","$timeout","BMA","csWallet"],R.$inject=["$scope","$controller","UIUtils","parameters"],angular.module("cesium.wallets.controllers",["cesium.services","cesium.currency.controllers"]).config(["$stateProvider",function(e){e.state("app.view_wallets",{url:"/wallets",views:{menuContent:{templateUrl:"templates/wallet/list/view_wallets.html",controller:"WalletListViewCtrl"}},data:{login:!0}}).state("app.view_wallet_by_id",{url:"/wallets/:id?refresh",views:{menuContent:{templateUrl:"templates/wallet/view_wallet.html",controller:"WalletCtrl"}},data:{login:!0,silentLocationChange:!0}}).state("app.view_wallet_tx_by_id",{url:"/history/wallets/:id?refresh",views:{menuContent:{templateUrl:"templates/wallet/view_wallet_tx.html",controller:"WalletTxCtrl"}},data:{login:!0,silentLocationChange:!0}}).state("app.view_wallet_tx_errors_by_id",{url:"/history/wallets/:id/errors",views:{menuContent:{templateUrl:"templates/wallet/view_wallet_tx_error.html",controller:"WalletTxErrorCtrl"}},data:{login:!0}})}]).controller("WalletListAbstractCtrl",I).controller("WalletListViewCtrl",N).controller("WalletSelectModalCtrl",O).controller("WalletListImportModalCtrl",A).controller("WalletSelectPopoverCtrl",R),S.$inject=["$scope","$state","$q","$timeout","$focus","$location","$ionicPopover","$ionicHistory","UIUtils","csConfig","csCurrency","csSettings","Device","BMA","csWallet","csWot"],C.$inject=["$scope","$controller","$focus","csWallet","parameters"],D.$inject=["$scope","$rootScope","$state","$translate","$ionicHistory","$q","UIUtils","Modals","csConfig","csSettings","csCurrency","csWot","csWallet"],y.$inject=["$scope","$rootScope","$controller","$timeout","$state","UIUtils","Modals","csWallet"],P.$inject=["$scope","$timeout","$q","BMA","csSettings","csWot","csTx","UIUtils"],k.$inject=["$scope","$rootScope","$controller","csSettings","csWallet","UIUtils"],M.$inject=["$scope","$q","csWot","parameters"],angular.module("cesium.wot.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.wot_lookup",{url:"/wot",abstract:!0,enableBack:!1,views:{menuContent:{templateUrl:"templates/wot/lookup.html"}}}).state("app.wot_lookup.tab_search",{url:"/search?q&type&hash",views:{tab:{templateUrl:"templates/wot/tabs/tab_lookup.html",controller:"WotLookupCtrl"}},data:{silentLocationChange:!0,large:"app.wot_lookup_lg"}}).state("app.wot_lookup_lg",{url:"/wot/lg?q&type&hash",views:{menuContent:{templateUrl:"templates/wot/lookup_lg.html",controller:"WotLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.wot_identity",{url:"/wot/:pubkey/:uid?action&block",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"}}}).state("app.wot_identity_tx_uid",{url:"/wot/tx/:pubkey/:uid?action",views:{menuContent:{templateUrl:"templates/wot/view_identity_tx.html",controller:"WotIdentityTxViewCtrl"}}}).state("app.wot_cert",{url:"/wot/:pubkey/:uid/:type?block",views:{menuContent:{templateUrl:"templates/wot/view_certifications.html",controller:"WotCertificationsViewCtrl"}},data:{large:"app.wot_cert_lg"}}).state("app.wot_cert_lg",{url:"/wot/cert/lg/:pubkey/:uid?block",views:{menuContent:{templateUrl:"templates/wot/view_certifications.html",controller:"WotCertificationsViewCtrl"}}}).state("app.wallet_cert",{url:"/account/cert/:type",views:{menuContent:{templateUrl:"templates/wot/view_certifications.html",controller:"WotCertificationsViewCtrl"}},data:{large:"app.wallet_cert_lg"}}).state("app.wallet_cert_lg",{url:"/account/cert/lg",views:{menuContent:{templateUrl:"templates/wot/view_certifications.html",controller:"WotCertificationsViewCtrl"}}}).state("app.wallet_cert_by_id",{url:"/wallets/:id/cert/:type",views:{menuContent:{templateUrl:"templates/wot/view_certifications.html",controller:"WotCertificationsViewCtrl"}},data:{large:"app.wallet_cert_lg_by_id"}}).state("app.wallet_cert_lg_by_id",{url:"/wallets/:id/cert/lg",views:{menuContent:{templateUrl:"templates/wot/view_certifications.html",controller:"WotCertificationsViewCtrl"}}})}]).controller("WotLookupCtrl",S).controller("WotLookupModalCtrl",C).controller("WotIdentityAbstractCtrl",D).controller("WotIdentityViewCtrl",y).controller("WotIdentityTxViewCtrl",P).controller("WotCertificationsViewCtrl",k).controller("WotSelectPubkeyIdentityModalCtrl",M),w.$inject=["$scope","$state","$location","$ionicPopover","$window","$translate","BMA","UIUtils","csConfig","csSettings","csCurrency","csNetwork","csWot"],H.$inject=["$scope","$q","$window","$state","UIUtils","csWot","BMA"],U.$inject=["$scope","$controller","parameters"],x.$inject=["$scope","$controller"],B.$inject=["$scope","$q","csSettings","csCurrency","csHttp","BMA"],angular.module("cesium.network.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.network",{url:"/network?type&expert",cache:!1,views:{menuContent:{templateUrl:"templates/network/view_network.html",controller:"NetworkLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.view_peer",{url:"/network/peer/:server?ssl&tor",cache:!1,views:{menuContent:{templateUrl:"templates/network/view_peer.html",controller:"PeerViewCtrl"}},data:{preferHttp:!0}})}]).controller("NetworkLookupCtrl",w).controller("PeerViewCtrl",H).controller("NetworkLookupModalCtrl",U).controller("NetworkLookupPopoverCtrl",x).controller("PeerInfoPopoverCtrl",B),F.$inject=["$scope","$q","$timeout","$ionicPopover","Modals","BMA","UIUtils","csSettings","csCurrency","csNetwork","ModalUtils"],W.$inject=["$scope","$http","UIUtils","csSettings","FileSaver"],angular.module("cesium.currency.controllers",["ngFileSaver","cesium.services"]).config(["$stateProvider",function(e){e.state("app.currency",{url:"/currency",views:{menuContent:{templateUrl:"templates/currency/view_currency.html",controller:"CurrencyViewCtrl"}},data:{large:"app.currency_lg"}}).state("app.currency.tab_parameters",{url:"/parameters",views:{"tab-parameters":{templateUrl:"templates/currency/tabs/tab_parameters.html"}}}).state("app.currency.tab_wot",{url:"/community",views:{"tab-wot":{templateUrl:"templates/currency/tabs/tab_wot.html"}}}).state("app.currency.tab_network",{url:"/network",views:{"tab-network":{templateUrl:"templates/currency/tabs/tab_network.html",controller:"NetworkLookupCtrl"}}}).state("app.currency.tab_blocks",{url:"/blocks",views:{"tab-blocks":{templateUrl:"templates/currency/tabs/tab_blocks.html",controller:"BlockLookupCtrl"}}}).state("app.currency_lg",{url:"/currency/lg",cache:!1,views:{menuContent:{templateUrl:"templates/currency/view_currency_lg.html",controller:"CurrencyViewCtrl"}}})}]).controller("CurrencyViewCtrl",F).controller("CurrencyLicenseModalCtrl",W),V.$inject=["$scope","$controller","UIUtils"],G.$inject=["$scope","$q","$translate","$timeout","$filter","$focus","Device","BMA","UIUtils","Modals","csWallet","csWot","csCurrency","csSettings","parameters"],angular.module("cesium.transfer.controllers",["cesium.services","cesium.currency.controllers"]).config(["$stateProvider",function(e){e.state("app.new_transfer",{cache:!1,url:"/transfer?amount&udAmount&comment&restPub&all&wallet",views:{menuContent:{templateUrl:"templates/wallet/new_transfer.html",controller:"TransferCtrl"}}}).state("app.new_transfer_pubkey_uid",{cache:!1,url:"/transfer/:pubkey/:uid?amount&udAmount&comment&restPub&all&wallet",views:{menuContent:{templateUrl:"templates/wallet/new_transfer.html",controller:"TransferCtrl"}}}).state("app.new_transfer_pubkey",{cache:!1,url:"/transfer/:pubkey?amount&udAmount&comment&restPub&all&wallet",views:{menuContent:{templateUrl:"templates/wallet/new_transfer.html",controller:"TransferCtrl"}}})}]).controller("TransferCtrl",V).controller("TransferModalCtrl",G),Y.$inject=["$scope","$q","$window","$ionicHistory","$ionicPopup","$timeout","$translate","$ionicPopover","UIUtils","Modals","BMA","csHttp","csConfig","csCurrency","csSettings","csPlatform"],angular.module("cesium.settings.controllers",["cesium.services","cesium.currency.controllers"]).config(["$stateProvider",function(e){e.state("app.settings",{url:"/settings",views:{menuContent:{templateUrl:"templates/settings/settings.html",controller:"SettingsCtrl"}}})}]).controller("SettingsCtrl",Y),$.$inject=["$scope","$timeout","$focus","$filter","$state","$anchorScroll","UIUtils","BMA","csCurrency","csWot","csSettings"],K.$inject=["$scope","$ionicPopover","$state","UIUtils","BMA","csCurrency","csWot"],angular.module("cesium.blockchain.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.blockchain",{url:"/blockchain",views:{menuContent:{templateUrl:"templates/blockchain/lookup.html",controller:"BlockLookupCtrl"}},data:{large:"app.blockchain_lg"}}).state("app.blockchain_lg",{url:"/blockchain/lg",views:{menuContent:{templateUrl:"templates/blockchain/lookup_lg.html",controller:"BlockLookupCtrl"}}}).state("app.server_blockchain",{url:"/network/peer/:server/blockchain?ssl&tor",views:{menuContent:{templateUrl:"templates/blockchain/lookup.html",controller:"BlockLookupCtrl"}},data:{large:"app.server_blockchain_lg"}}).state("app.server_blockchain_lg",{url:"/network/peer/:server/blockchain/lg?ssl&tor",views:{menuContent:{templateUrl:"templates/blockchain/lookup_lg.html",controller:"BlockLookupCtrl"}}}).state("app.view_block",{url:"/block/:number",views:{menuContent:{templateUrl:"templates/blockchain/view_block.html",controller:"BlockViewCtrl"}}}).state("app.view_block_hash",{url:"/block/:number/:hash",views:{menuContent:{templateUrl:"templates/blockchain/view_block.html",controller:"BlockViewCtrl"}}}).state("app.view_server_block_hash",{url:"/network/peer/:server/block/:number/:hash?ssl&tor",views:{menuContent:{templateUrl:"templates/blockchain/view_block.html",controller:"BlockViewCtrl"}}})}]).controller("BlockLookupCtrl",$).controller("BlockViewCtrl",K),angular.module("cesium.controllers",["cesium.app.controllers","cesium.join.controllers","cesium.login.controllers","cesium.help.controllers","cesium.wallet.controllers","cesium.wallets.controllers","cesium.currency.controllers","cesium.wot.controllers","cesium.transfer.controllers","cesium.settings.controllers","cesium.network.controllers","cesium.blockchain.controllers"]),angular.module("cesium.templates",[]).run(["$templateCache",function(e){e.put("templates/api/doc.html",'<h2 class="padding" translate>API.DOC.TRANSFER.TITLE</h2><div class="list padding no-padding-xs no-padding-top"><div class="item item-divider no-border"><p translate>API.DOC.DESCRIPTION_DIVIDER</p></div><div class="item item-text-wrap"><p translate>API.DOC.TRANSFER.DESCRIPTION</p></div><div class="item item-divider no-border"><p translate>API.DOC.URL_DIVIDER</p></div><div class="item item-text-wrap"><p class="gray text-right">{{$root.rootPath}}#/v1/payment/:pubkey?amount=<span class="text-italic" translate>API.DOC.TRANSFER.PARAM_AMOUNT</span></p></div><div class="item item-divider no-border"><p translate>API.DOC.PARAMETERS_DIVIDER</p></div><div class="item item-text-wrap"><p translate>API.DOC.AVAILABLE_PARAMETERS</p><div class="row"><div class="col col-20 text-italic">pubkey</div><div class="col gray" translate>API.DOC.TRANSFER.PARAM_PUBKEY_HELP</div></div><div class="row stable-bg"><div class="col col-20 text-italic dark">amount</div><div class="col gray" translate>API.DOC.TRANSFER.PARAM_AMOUNT_HELP</div></div><div class="row"><div class="col col-20 text-italic">comment</div><div class="col gray" translate>API.DOC.TRANSFER.PARAM_COMMENT_HELP</div></div><div class="row stable-bg"><div class="col col-20 text-italic dark">name</div><div class="col gray" translate>API.DOC.TRANSFER.PARAM_NAME_HELP</div></div><div class="row"><div class="col col-20 text-italic">preferred_node</div><div class="col gray" translate>API.DOC.TRANSFER.PARAM_PREFERRED_NODE_HELP</div></div><div class="row stable-bg"><div class="col col-20 text-italic dark">redirect_url</div><div class="col gray" translate>API.DOC.TRANSFER.PARAM_REDIRECT_URL_HELP</div></div><div class="row"><div class="col col-20 text-italic">cancel_url</div><div class="col gray" translate>API.DOC.TRANSFER.PARAM_CANCEL_URL_HELP</div></div></div><div class="item item-divider no-border"><p translate>API.DOC.DEMO_DIVIDER</p></div><div class="item item-button-right item-text-wrap padding-bottom"><p class="item-icon-right-padding" translate>API.DOC.DEMO_HELP</p><span class="badge" ng-if="loading"><ion-spinner class="icon" icon="android"></ion-spinner></span><a ng-if="!loading" href="{{transferDemoUrl}}" class="button button-raised button-positive icon ion-play"></a></div><div class="item item-text-wrap" ng-if="result.type === \'payment\' && !result.cancelled"><h2 class="text-right balanced" translate>API.DOC.DEMO_SUCCEED</h2><h4 class="gray" translate>API.DOC.DEMO_RESULT</h4><p class="balanced-100-bg padding dark text-keep-lines">{{result.content}}</p><h4 class="gray"><span translate>API.DOC.DEMO_RESULT_PEER</span> <b>{{result.node}}</b></h4></div><div class="item item-text-wrap" ng-if="result.type === \'payment\' && result.cancelled"><h2 class="text-right assertive" translate>API.DOC.DEMO_CANCELLED</h2></div><div class="item item-divider no-border"><p translate>API.DOC.INTEGRATE_DIVIDER</p></div><div class="item item-text-wrap"><p translate>API.DOC.TRANSFER.EXAMPLES_HELP</p><div class="row responsive-sm"><div class="col col-20 text-italic"><span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON</span></div><div class="col gray no-border"><p><i class="icon ion-code"></i> <span translate>API.DOC.INTEGRATE_CODE</span></p><div class="item item-input"><textarea class="gray" select-on-click rows="5" ng-model="transferButton.html" ng-model-options="{ debounce: 650 }"></textarea></div><p class="padding-top"><i class="icon ion-eye"></i> <span translate>API.DOC.INTEGRATE_RESULT</span></p><div class="padding-left" bind-notifier="{ notifierKey:watchedExpression }"><ng-bind-html ng-bind-html="transferButton.html|trustAsHtml"></ng-bind-html></div></div></div><div class="row responsive-sm"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col gray no-border"><p class="padding-top"><a class="positive" ng-click="transferButton.showParameters=!transferButton.showParameters"><i class="icon ion-wrench"></i> <span translate>API.DOC.INTEGRATE_PARAMETERS</span> <i class="icon" ng-class="{\'ion-arrow-down-b\': !transferButton.showParameters, \'ion-arrow-up-b\': transferButton.showParameters}"></i></a></p><div ng-if="transferButton.showParameters" class="padding-left"><form id="transferForm" class="stable-bg padding"><p class="padding-top"><i class="icon ion-key"></i> {{\'API.DOC.TRANSFER.PARAM_PUBKEY\' | translate}} :</p><label class="item item-input"><input type="text" autocomplete="off" ng-model="transferData.pubkey" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.PARAM_PUBKEY_HELP\'|translate}}"></label><p class="padding-top"><i class="icon ion-pricetag"></i> {{\'API.DOC.TRANSFER.PARAM_AMOUNT\' | translate}} :</p><label class="item item-input"><input type="text" autocomplete="off" ng-model="transferData.amount" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.PARAM_AMOUNT_HELP\'|translate}}"></label><p class="padding-top"><i class="icon ion-flag"></i> {{\'API.DOC.TRANSFER.PARAM_COMMENT\' | translate}} :</p><label class="item item-input"><input type="text" autocomplete="off" ng-model="transferData.comment" placeholder="{{\'API.DOC.TRANSFER.PARAM_COMMENT\'|translate}}"></label><p class="padding-top"><i class="icon ion-ios-world-outline"></i> {{\'API.DOC.TRANSFER.PARAM_NAME\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferData.name" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.PARAM_NAME\'|translate}}"></label><p class="padding-top"><i class="icon ion-key"></i> {{\'API.DOC.TRANSFER.PARAM_PREFERRED_NODE\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferData.preferred_node" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.PARAM_PREFERRED_NODE_HELP\'|translate}}"></label><p class="padding-top"><i class="icon ion-arrow-return-left"></i> {{\'API.DOC.TRANSFER.PARAM_REDIRECT_URL\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferData.redirect_url" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.PARAM_REDIRECT_URL\'|translate}}"></label><p class="padding-top"><i class="icon ion-backspace"></i> {{\'API.DOC.TRANSFER.PARAM_CANCEL_URL\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferData.cancel_url" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.PARAM_CANCEL_URL\'|translate}}"></label><p class="padding-top"><a class="positive" ng-click="transferButton.style.enable=!transferButton.style.enable"><i class="icon" ng-class="{\'ion-android-checkbox-outline\': transferButton.style.enable, \'ion-android-checkbox-outline-blank\': !transferButton.style.enable}"></i> <span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_STYLE</span></a></p><div ng-if="transferButton.style.enable"><p class="padding-top"><i class="icon ion-image"></i> {{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_ICON\' | translate}} :</p><label class="item item-input item-select"><select class="stable-bg dark" ng-model="transferButton.style.icon" style="width: 100%; max-width: 100%;" ng-options="l as (l.label | translate) for l in transferButton.icons track by l.filename"></select></label><p class="padding-top"><i class="icon ion-quote"></i> {{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferButton.style.text" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP\'|translate}}"></label><p class="padding-top"><i class="icon ion-paintbucket"></i> {{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_BG_COLOR\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferButton.style.bgColor" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_BG_COLOR_HELP\'|translate}}"></label><p class="padding-top"><i class="icon ion-paintbrush"></i> {{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_FONT_COLOR\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferButton.style.fontColor" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_FONT_COLOR_HELP\'|translate}}"></label><p class="padding-top"><i class="icon ion-ios-crop-strong"></i> {{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH\' | translate}} :</p><label class="item item-input"><input type="text" ng-model="transferButton.style.width" ng-model-options="{ debounce: 650 }" placeholder="{{\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH_HELP\'|translate}}"></label></div></form></div></div></div></div></div>'),e.put("templates/api/home.html",'<ion-view class="circle-bg-dark"><ion-nav-title><span class="title visible-xs visible-sm" translate>API.HOME.TITLE</span></ion-nav-title><ion-nav-buttons side="right"><button class="button button-clear hidden-xs hidden-sm flag" ng-click="showLocalesPopover($event)" style="align-content: center"><i class="flag-image" ng-if="$root.settings.locale" style="background-image: url(../img/flag-{{$root.settings.locale.flag}}.png);"></i> <b class="ion-arrow-down-b gray"></b></button></ion-nav-buttons><ion-content class="no-padding-xs no-padding-sm positive-900-bg"><br class="hidden-xs"><div class="light text-center"><h4 class="hidden-xs" translate>API.HOME.MESSAGE</h4><h4 class="visible-xs padding" translate>API.HOME.MESSAGE_SHORT</h4></div><br class="hidden-xs"><div class="row no-padding-xs"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col"><div class="light-bg no-padding"><ng-include src="::\'templates/api/doc.html\'"></ng-include></div></div><div class="col col-20 hidden-xs hidden-sm text-center" id="home"><div style="display: block; width: 100%;"><div class="logo"></div><small class="gray padding-top">v{{$root.config.version}}</small></div></div></div><p class="visible-xs visible-sm light padding-top text-center">{{\'COMMON.APP_NAME\'|translate}} API - <a href="#" ng-click="showAboutModal($event)">v{{$root.config.version}}</a></p><p class="hidden-xs hidden-sm gray padding-top text-center">{{\'COMMON.APP_NAME\'|translate}} API v{{$root.config.version}} - <a href="#" ng-click="showAboutModal($event)" title="{{\'HOME.BTN_ABOUT\'|translate}}">{{\'HOME.BTN_ABOUT\'|translate}}</a> - <a href="../" title="{{\'API.COMMON.LINK_STANDARD_APP_HELP\'|translate}}">{{\'API.COMMON.LINK_STANDARD_APP\'|translate}}</a></p></ion-content></ion-view>'),e.put("templates/api/menu.html",'<ion-nav-bar class="bar-dark" title-align="left"><ion-nav-back-button class="no-text"></ion-nav-back-button><ion-nav-buttons side="left"></ion-nav-buttons><ion-nav-buttons side="right"></ion-nav-buttons></ion-nav-bar><ion-nav-view name="menuContent"></ion-nav-view>'),e.put("templates/api/popover_locales.html",'<ion-popover-view class="fit popover-locales" style="height: {{locales.length*48}}px;"><ion-content scroll="false"><div class="list item-text-wrap block"><a ng-repeat="l in locales track by l.id" class="item item-icon-left ink" ng-click="changeLanguage(l.id)"><i class="item-image avatar" style="background-image: url(../img/flag-{{l.flag}}.png)"></i> {{l.label | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/api/transfer.html",'<ion-view class="circle-bg-dark"><ion-nav-buttons side="left"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button></ion-nav-buttons><ion-nav-title><span class="title visible-xs" translate>API.TRANSFER.TITLE_SHORT</span></ion-nav-title><ion-nav-buttons side="right"><button class="button button-clear hidden-xs hidden-sm gray" ng-click="showLocalesPopover($event)" style="align-content: center"><img ng-hide="!$root.settings.locale.country" ng-src="https://www.countryflags.io/{{$root.settings.locale.country}}/shiny/32.png"> <span ng-hide="$root.settings.locale.country">{{$root.settings.locale.label}}&nbsp;</span> <small class="ion-arrow-down-b"></small></button> <button class="button button-positive button-icon button-clear icon ion-android-send visible-xs" ng-click="doLogin()"></button></ion-nav-buttons><ion-content class="no-padding-xs positive-900-bg"><br class="hidden-xs"><div class="row no-padding-xs"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col no-padding-xs"><div class="light-bg"><h2 class="padding-top text-center hidden-xs" translate>API.TRANSFER.TITLE</h2><div class="no-padding energized-100-bg" ng-if="demo"><div class="item item-icon-left item-text-wrap no-border"><i class="icon ion-information-circled positive"></i><p translate>API.TRANSFER.DEMO.HELP</p></div></div><div class="no-padding energized-100-bg" ng-if="$root.config.demo"><div class="item item-icon-left item-text-wrap no-border"><i class="icon ion-android-alert assertive"></i><p translate>MODE.DEMO.INSTALL_HELP</p></div></div><ng-include src="::\'templates/login/form_login.html\'"></ng-include></div><br class="hidden-xs"><br class="hidden-xs"><div class="list padding no-padding-xs light-bg"><div class="item"><p translate>API.TRANSFER.SUMMARY</p></div><div class="item item-icon-left-padding item-tx no-border" ng-if="!transferData.amounts" style="min-height: 56px;"><h2 translate>API.TRANSFER.AMOUNT</h2><ion-spinner class="badge item-note" icon="android" ng-show="loading"></ion-spinner><div class="badge badge-calm ng-hide" ng-show="!loading" ng-bind-html="transferData.amount|formatAmount:{useRelative: false, currency: currency.name}"></div><div class="badge badge-secondary ng-hide" ng-show="!loading" ng-bind-html="transferData.amount|formatAmount:{useRelative: true, currency: currency.name, currentUD: currency.currentUD}"></div></div><label ng-if="transferData.amounts" style="min-height: 58px;" class="item item-icon-left-padding item-input item-select item-tx no-border" ng-class="{ \'item-input-error\': form.$submitted && !transferData.amount}"><div class="input-label"><span translate>API.TRANSFER.AMOUNT</span><h4 class="assertive hidden-xs hidden-sm" ng-if="!transferData.amount"><span translate>API.TRANSFER.AMOUNTS_HELP</span></h4></div><select ng-model="transferData.amount" required="true" ng-options="(amount |formatAmount:{useRelative: false, currency: currency.name}) for amount in transferData.amounts"></select> <span class="badge badge-secondary ng-hide" ng-show="transferData.amount" ng-bind-html="transferData.amount|formatAmount:{useRelative: true, currency: currency.name, currentUD: currency.currentUD}"></span></label><div class="form-errors" ng-if="form.$submitted && !transferData.amount"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-icon-left-padding"><h2 translate>API.TRANSFER.NAME</h2><div class="badge item-note">{{transferData.name}}</div></div><div class="item item-icon-left-padding item-text-wrap"><h2 translate>API.TRANSFER.PUBKEY</h2><div class="badge"><span class="hidden-xs"><br class="visible-sm visible-md"><i class="icon ion-key"></i>{{transferData.pubkey}}</span> <span class="visible-xs" copy-on-click="{{transferData.pubkey}}"><br class="visible-xs"><i class="icon ion-key"></i> {{transferData.pubkey|formatPubkey}}</span></div></div><div class="item item-icon-left-padding"><h2 translate>API.TRANSFER.COMMENT</h2><div class="badge item-note"><span class="hidden-xs"><br class="visible-sm visible-md">{{::transferData.comment}}</span> <span class="visible-xs" copy-on-click="{{transferData.comment}}"><br>{{::transferData.comment}}</span></div></div><div class="item item-icon-left-padding" ng-hide="error"><h2 translate>API.TRANSFER.NODE</h2><div class="badge item-note" ng-if="!loading"><br class="visible-sm visible-md"><i class="icon ion-locked" ng-if="node.useSsl"></i>&nbsp;{{node.server}}</div></div><div class="center padding animate-fade-in animate-show-hide ng-hide" ng-show="!loading && error"><div class="card card-item padding"><p class="item-content item-text-wrap"><i class="icon ion-android-alert assertive"></i> <span class="dark" trust-as-html="\'API.COMMON.CONNECTION_ERROR\'|translate:node"></span></p><button type="button" class="button button-positive icon icon-left ion-refresh ink" ng-click="start()">{{\'COMMON.BTN_REFRESH\'|translate}}</button></div></div><div class="padding-bottom visible-xs">&nbsp;</div></div></div><div class="col col-20 hidden-xs hidden-sm text-center" id="home"><div style="display: block; width: 100%;"><div class="logo text-center"></div><small class="gray padding-top">v{{$root.config.version}}</small></div></div></div><p class="visible-xs visible-sm light padding-top text-center">{{\'COMMON.APP_NAME\'|translate}} - <a href="#" ng-click="showAboutModal($event)">v{{$root.config.version}}</a></p><p class="hidden-xs hidden-sm gray padding-top text-center">{{\'COMMON.APP_NAME\'|translate}} API v{{$root.config.version}} - <a href="#" ng-click="showAboutModal($event)" title="{{\'HOME.BTN_ABOUT\'|translate}}">{{\'HOME.BTN_ABOUT\'|translate}}</a> - <a ui-sref="app.home" target="_system" title="{{\'API.COMMON.LINK_DOC_HELP\'|translate}}">{{\'API.COMMON.LINK_DOC\'|translate}}</a> - <a href="../" title="{{\'API.COMMON.LINK_STANDARD_APP_HELP\'|translate}}">{{\'API.COMMON.LINK_STANDARD_APP\'|translate}}</a></p></ion-content></ion-view>'),e.put("templates/blockchain/item_block_empty_lg.html",'<a name="block-{{::block.number}}"></a><div id="block-{{::block.number}}" class="item item-block item-icon-left item-block-empty" ng-class=":rebind:{\'compacted\': block.compacted && compactMode}" ng-click="selectBlock(block)"><div class="row no-padding" ng-if=":rebind:!block.compacted || !compactMode"><div class="col"><h3 class="gray"><i class="ion-clock"></i> {{:rebind:block.medianTime|medianDate}}</h3></div><div class="col"><h3><span class="gray" ng-if=":rebind:expertMode"><i class="ion-key"></i> {{:rebind:block.issuer|formatPubkey}} </span><span class="positive"><i class="ion-person"></i> {{:rebind:block.name||block.uid}}</span></h3></div><div class="col col-20"></div><div class="col col-20"><span class="badge" ng-class="{\'badge-balanced\': !$index && search.type==\'last\'}">{{block.number|formatInteger}}</span></div></div></div>'),e.put("templates/blockchain/item_block_lg.html",'<ion-item id="block-{{::block.number}}" class="item item-block item-icon-left ink {{::ionItemClass}}" ng-class="{{::ionItemClass}}" ng-click="selectBlock(block)"><i class="icon ion-cube stable" ng-if=":rebind:!block.avatar"></i> <i class="avatar" ng-if=":rebind:!block.empty && block.avatar" style="background-image: url(\'{{:rebind:block.avatar.src}}\')"></i><div class="row no-padding"><div class="col"><h3 class="dark"><i class="ion-clock"></i> {{:rebind:block.medianTime|medianDate}}</h3><h4 class="gray">{{:rebind:\'BLOCKCHAIN.HASH\'|translate}} {{:rebind:block.hash|formatHash}}</h4></div><div class="col"><h3><span class="gray" ng-if=":rebind:expertMode"><i class="ion-key"></i> {{:rebind:block.issuer|formatPubkey}} </span><span class="positive"><i class="ion-person"></i> {{:rebind:block.name||block.uid}}</span></h3></div><div class="col col-20"><small><ng-if ng-if=":rebind:block.joinersCount||(block.excludedCount-block.revokedCount)"><i class="ion-person"></i> <span ng-if=":rebind:block.joinersCount">+{{:rebind:block.joinersCount}}</span> <span ng-if=":rebind:block.excludedCount">-{{:rebind:block.excludedCount-block.revokedCount}}</span> &nbsp;&nbsp;</ng-if><span ng-if=":rebind:block.revokedCount" class="assertive"><i class="ion-minus-circled"></i> -{{:rebind:block.revokedCount}}&nbsp;&nbsp;</span> <span ng-if=":rebind:block.activesCount"><i class="ion-refresh"></i> {{:rebind:block.activesCount}}&nbsp;&nbsp;</span> <span ng-if=":rebind:block.certificationsCount"><i class="ion-ribbon-a"></i> {{:rebind:block.certificationsCount}}&nbsp;&nbsp;</span> <span ng-if=":rebind:block.dividend"><i class="gray ion-arrow-up-c"></i> {{:rebind:\'COMMON.UD\'|translate}}&nbsp;&nbsp;</span> <span ng-if=":rebind:block.transactionsCount"><i class="ion-card">{{:rebind:block.transactionsCount}}</i>&nbsp;&nbsp;</span></small></div><div class="col col-20"><span class="badge" ng-class="{\'badge-balanced\': !$index && search.type==\'last\', \'badge-calm\': ($index || search.type!=\'last\')&& !block.compacted && !block.empty}">{{:rebind:block.number}}</span></div></div></ion-item>'),
e.put("templates/blockchain/item_block.html",'<a name="block-{{::block.number}}"></a><ion-item id="block-{{::block.number}}" class="item item-icon-left item-block {{::ionItemClass}}" ng-class=":rebind:{\'ink\': !block.empty||!block.compacted, \'item-block-empty\': block.empty, \'compacted\': block.compacted && compactMode}" ng-click="selectBlock(block)"><i class="icon ion-cube stable" ng-if="(!block.empty && !block.avatar)"></i> <i class="avatar" ng-if="!block.empty && block.avatar" style="background-image: url(\'{{block.avatar.src}}\')"></i><div class="row no-padding" ng-if=":rebind:!block.compacted || !compactMode"><div class="col" style="min-width: 110px; max-width: 130px;"><h4 ng-class=":rebind:{\'gray\': block.compacted, \'dark\': !block.compacted}"><i class="ion-clock"></i> {{:rebind:block.medianTime|medianDate}}</h4><h4 ng-if=":rebind:!block.empty"><ng-if ng-if=":rebind:block.joinersCount||(block.excludedCount-block.revokedCount)"><i class="dark ion-person"></i> <span class="dark" ng-if=":rebind:block.joinersCount">+{{:rebind:block.joinersCount}}</span> <span class="dark" ng-if=":rebind:block.excludedCount">-{{:rebind:block.excludedCount-block.revokedCount}}</span></ng-if><span class="dark" ng-if=":rebind:block.revokedCount" class="assertive"><i class="ion-minus-circled"></i> {{:rebind:block.revokedCount}}&nbsp;&nbsp;</span> <span class="dark" ng-if=":rebind:block.activesCount" class="gray"><i class="gray ion-refresh"></i> {{:rebind:block.activesCount}}&nbsp;&nbsp;</span> <span class="dark" ng-if=":rebind:block.certificationsCount"><i class="ion-ribbon-a"></i> {{:rebind:block.certificationsCount}}&nbsp;&nbsp;</span> <span class="dark" ng-if=":rebind:block.dividend" class="gray"><i class="gray ion-arrow-up-c"></i> {{\'COMMON.UD\'|translate}}&nbsp;&nbsp;</span> <span class="dark" ng-if=":rebind:block.transactionsCount"><i class="ion-card">{{:rebind:block.transactionsCount}}</i></span></h4></div><div class="col positive hidden-md"><h4><i class="ion-person"></i> {{:rebind:block.name||block.uid}}</h4></div><div class="col col-20"><span class="badge" ng-class=":rebind:{\'badge-balanced\': !$index , \'badge-calm\': $index && !block.compacted && !block.empty}">{{::block.number|formatInteger}}</span></div></div></ion-item>'),e.put("templates/blockchain/items_blocks.html",'<div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><ion-list class="animate-ripple padding padding-xs"><div class="padding gray" ng-if="!search.loading && !search.results.length" translate>BLOCKCHAIN.LOOKUP.NO_BLOCK</div><ng-repeat ng-repeat="block in search.results track by block.number" ng-include="::\'templates/blockchain/item_block.html\'"></ng-repeat></ion-list><ion-infinite-scroll ng-if="search.hasMore" icon="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("templates/blockchain/link_identity.html",'<a ui-sref="app.wot_identity({pubkey: identity.pubkey, uid: identity.uid})"><span class="positive" ng-if="identity.uid"><i class="icon ion-person"></i> {{::identity.uid}}&nbsp;</span> <span class="gray" ng-class="{\'hidden-xs hidden-sm\': identity.uid}"><i class="icon ion-key"></i>&nbsp;{{::identity.pubkey|formatPubkey}}</span></a>'),e.put("templates/blockchain/list_blocks_lg.html",'<div class="padding padding-xs" style="display: block; height: 100px;"><h4 translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><div class="pull-right"><a class="button button-text button-small ink" ng-class="{\'button-text-positive\': compactMode, \'button-text-stable\': !compactMode}" ng-click="toggleCompactMode()"><i class="icon ion-navicon"></i> <b class="ion-arrow-down-b" style="position: absolute; top: -2px; left: 4px; font-size: 8px;"></b> <b class="ion-arrow-up-b" style="position: absolute; top: 10px; left: 4px; font-size: 8px;"></b> <span>{{:locale:\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\'|translate}}</span></a></div></div><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><ion-list class="padding padding-xs list-blocks {{::motion.ionListClass}}"><div class="padding gray" ng-if="!search.loading && !search.results.length">{{:locale:\'BLOCKCHAIN.LOOKUP.NO_BLOCK\'|translate}}</div><ng-repeat ng-repeat="block in search.results track by block.id" ng-include="!block.empty ? \'templates/blockchain/item_block_lg.html\' : \'templates/blockchain/item_block_empty_lg.html\'"></ng-repeat></ion-list><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("templates/blockchain/list_blocks.html",'<div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><ion-list class="padding padding-xs list-blocks {{::motion.ionListClass}}"><div class="padding gray" ng-if="!search.loading && !search.results.length" translate>BLOCKCHAIN.LOOKUP.NO_BLOCK</div><ng-repeat ng-repeat="block in search.results track by block.number" ng-include="::\'templates/blockchain/item_block.html\'"></ng-repeat></ion-list><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("templates/blockchain/lookup_lg.html",'<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ng-include src="::\'templates/blockchain/list_blocks_lg.html\'"></ng-include></ion-content></ion-view>'),e.put("templates/blockchain/lookup.html",'<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-content class="padding no-padding-xs" scroll="true"><ng-include src="::\'templates/blockchain/list_blocks.html\'"></ng-include></ion-content></ion-view>'),e.put("templates/blockchain/unlock_condition_popover.html",'<ion-popover-view class="fit"><ion-header-bar><h1 class="title" translate>BLOCKCHAIN.VIEW.TX_OUTPUT_UNLOCK_CONDITIONS</h1></ion-header-bar><ion-content scroll="true"><div class="row" ng-repeat="condition in popoverData.unlockConditions track by $index" ng-style="::condition.style"><span class="gray" ng-if="::condition.operator">{{::\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\'+condition.operator|translate}}&nbsp;</span><div ng-if="::condition.type==\'SIG\'"><i class="icon ion-key dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.SIG\' | translate"></span> <a ng-click="goState(\'app.wot_identity\', {pubkey:condition.value})" style="text-decoration: none;" class="positive">{{condition.value|formatPubkey}}</a></div><div ng-if="::condition.type==\'XHX\'"><i class="icon ion-lock-combination dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.XHX\' | translate"></span> <a copy-on-click="{{::condition.value}}" class="positive">{{::condition.value|formatPubkey}}...</a></div><div ng-if="condition.type==\'CSV\'"><i class="icon ion-clock dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CSV\' | translate"></span> {{::condition.value|formatDuration}}</div><div ng-if="condition.type==\'CLTV\'"><i class="icon ion-clock dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CLTV\' | translate"></span> {{::condition.value|medianDate}}</div></div></ion-content></ion-popover-view>'),e.put("templates/blockchain/view_block.html",'<ion-view><ion-nav-title><span class="title visible-xs visible-sm" ng-if="number==\'current\'">{{\'BLOCKCHAIN.VIEW.TITLE_CURRENT\'|translate}}</span> <span class="title visible-xs visible-sm" ng-if="number!=\'current\'">{{\'BLOCKCHAIN.VIEW.TITLE\'|translate:formData}}</span></ion-nav-title><ion-content class="no-padding-xs no-padding-sm" scroll="true"><div class="row no-padding"><div class="col col-15 hidden-xs hidden-sm">&nbsp;</div><div class="col no-padding"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="list item-text-wrap no-padding-xs" ng-if="!loading"><div class="item item-text-wrap"><h1 class="padding-top hidden-xs hidden-sm"><span ng-if="number!=\'current\'">{{\'BLOCKCHAIN.VIEW.TITLE\'|translate:formData}}</span> <span ng-if="number==\'current\'">{{\'BLOCKCHAIN.VIEW.TITLE_CURRENT\'|translate}}</span></h1><h3><span class="dark"><i class="icon ion-clock"></i> {{formData.medianTime | medianFromNowAndDate}}</span></h3><h3><span class="dark"><i class="icon ion-lock-combination"></i> {{\'BLOCKCHAIN.VIEW.COMPUTED_BY\'|translate}} </span><a class="positive" ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.uid})"><i class="icon ion-person positive"></i> {{issuer.name||issuer.uid}} <span class="gray" ng-if="issuer.name">({{issuer.uid}})</span></a></h3><h3><a ng-click="openRawBlock($event)"><i class="icon ion-share"></i> {{\'BLOCKCHAIN.VIEW.SHOW_RAW\'|translate}}</a></h3></div><div class="item hidden-xs hidden-sm padding text-center"><div class="pull-right"><a class="button button-text button-small ink" ng-class="{\'button-text-positive\': compactMode, \'button-text-stable\': !compactMode}" ng-click="toggleCompactMode()"><i class="icon ion-navicon"></i> <b class="ion-arrow-down-b" style="position: absolute; top: -2px; left: 4px; font-size: 8px;"></b> <b class="ion-arrow-up-b" style="position: absolute; top: 10px; left: 4px; font-size: 8px;"></b> <span>{{\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\'|translate}}</span></a></div><cs-extension-point name="buttons"></cs-extension-point></div><span class="item item-divider">{{\'BLOCKCHAIN.VIEW.TECHNICAL_DIVIDER\' | translate}}</span><ion-item class="item-icon-left item-text-wrap" ng-if="!compactMode || $root.settings.expertMode"><i class="icon ion-gear-b"></i> {{\'BLOCKCHAIN.VIEW.VERSION\'|translate}} <span class="badge badge-stable">{{::formData.version}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="!compactMode || $root.settings.expertMode" copy-on-click="{{::formData.powMin}}"><i class="icon ion-lock-combination"></i> {{\'BLOCKCHAIN.VIEW.POW_MIN\'|translate}}<h4 class="gray">{{\'BLOCKCHAIN.VIEW.POW_MIN_HELP\'|translate}}</h4><span class="badge badge-stable">{{::formData.powMin}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" copy-on-click="{{::formData.hash}}"><i class="icon ion-pound"></i> {{\'BLOCKCHAIN.VIEW.HASH\'|translate}} <span class="item-note hidden-xs hidden-sm dark">{{::formData.hash}}</span><h5 class="visible-xs visible-sm dark">{{::formData.hash}}</h5></ion-item><ion-item class="hidden-sm hidden-xs"></ion-item><span class="item item-divider">{{\'BLOCKCHAIN.VIEW.DATA_DIVIDER\' | translate}}</span><ion-item ng-if="compactMode && formData.empty" class="item-icon-left item-text-wrap">{{\'BLOCKCHAIN.VIEW.EMPTY\'|translate}}</ion-item><ion-item ng-if="!compactMode || formData.dividend" class="item-icon-left item-text-wrap" copy-on-click="{{::formData.dividend/100}}"><i class="icon ion-arrow-up-c"></i><div class="col col-60">{{\'COMMON.UNIVERSAL_DIVIDEND\'|translate}}<h4 class="gray">{{\'BLOCKCHAIN.VIEW.UNIVERSAL_DIVIDEND_HELP\'|translate: {membersCount: formData.membersCount} }}</h4></div><span class="badge badge-balanced" ng-if="formData.dividend">+1 <span ng-bind-html="formData.currency|currencySymbol: {useRelative: true} "></span> / {{\'COMMON.MEMBER\'|translate|lowercase}} </span><span class="badge badge-stable" ng-if="!formData.dividend">0</span> <span class="badge badge-secondary" ng-if="formData.dividend">+ {{formData.dividend| formatAmount: {currency: formData.currency, useRelative: false} }} / {{\'COMMON.MEMBER\'|translate|lowercase}}</span></ion-item><ng-if ng-if="!compactMode || formData.identitiesCount"><ion-item class="item-icon-left"><i class="icon ion-person"></i> <b class="ion-clock" style="position: absolute; top: 16px; left: 39px; font-size: 12px;"></b> {{\'BLOCKCHAIN.VIEW.IDENTITIES_COUNT\'|translate}} <span class="badge badge-balanced" ng-if="formData.identitiesCount">+{{::formData.identitiesCount}}</span> <span class="badge badge-stable" ng-if="!formData.identitiesCount">0</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.identitiesCount"><ion-item ng-repeat="identity in ::formData.identities" class="item-border-large item-small-height" ng-include="::\'templates/blockchain/link_identity.html\'"></ion-item></div></ng-if><ng-if ng-if="!compactMode || formData.joinersCount"><ion-item class="item-icon-left"><i class="icon ion-person-add"></i> {{\'BLOCKCHAIN.VIEW.JOINERS_COUNT\'|translate}} <span class="badge badge-balanced" ng-if="formData.joinersCount">+{{::formData.joinersCount}}</span> <span class="badge badge-stable" ng-if="!formData.joinersCount">0</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.joinersCount"><ion-item ng-repeat="identity in ::formData.joiners" class="item-border-large item-small-height" ng-include="::\'templates/blockchain/link_identity.html\'"></ion-item></div></ng-if><ng-if ng-if="!compactMode || formData.activesCount"><ion-item class="item-icon-left"><i class="icon ion-person"></i> <b class="ion-refresh" style="position: absolute; top: 25px; left: 39px; font-size: 12px;"></b> {{\'BLOCKCHAIN.VIEW.ACTIVES_COUNT\'|translate}}<h4 class="gray">{{\'BLOCKCHAIN.VIEW.ACTIVES_COUNT_HELP\'|translate}}</h4><span class="badge badge-balanced" ng-if="formData.activesCount">{{::formData.activesCount}}</span> <span class="badge badge-stable" ng-if="!formData.activesCount">0</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.activesCount"><ion-item ng-repeat="identity in ::formData.actives" class="item-border-large item-small-height" ng-include="::\'templates/blockchain/link_identity.html\'"></ion-item></div></ng-if><ng-if ng-if="!compactMode || (formData.excludedCount-formData.revokedCount)"><ion-item class="item-icon-left"><i class="icon ion-person"></i> <b class="ion-close dark" style="position: absolute; top: 25px; left: 39px; font-size: 12px;"></b> {{\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT\'|translate}}<h4 class="gray">{{\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT_HELP\'|translate}}</h4><span class="badge badge-assertive" ng-if="formData.excludedCount-formData.revokedCount">-{{::formData.excludedCount-formData.revokedCount}}</span> <span class="badge badge-stable" ng-if="!(formData.excludedCount-formData.revokedCount)">0</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.excludedCount"><ion-item ng-repeat="identity in ::formData.excluded" class="item-border-large item-small-height" ng-include="::\'templates/blockchain/link_identity.html\'"></ion-item></div></ng-if><ng-if ng-if="!compactMode || formData.leaversCount"><ion-item class="item-icon-left" ng-if="!compactMode || formData.leaversCount"><i class="icon ion-person"></i> <b class="ion-minus" style="position: absolute; top: 25px; left: 39px; font-size: 12px;"></b> {{\'BLOCKCHAIN.VIEW.LEAVERS_COUNT\'|translate}}<h4 class="gray">{{\'BLOCKCHAIN.VIEW.LEAVERS_COUNT_HELP\'|translate}}</h4><span class="badge badge-assertive" ng-if="formData.leaversCount">-{{::formData.leaversCount}}</span> <span class="badge badge-stable" ng-if="!formData.leaversCount">0</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.leaversCount"><ion-item ng-repeat="identity in ::formData.leavers" class="item-border-large item-small-height" ng-include="::\'templates/blockchain/link_identity.html\'"></ion-item></div></ng-if><ng-if ng-if="!compactMode || formData.revokedCount"><ion-item class="item-icon-left"><i class="icon ion-person"></i> <b class="ion-minus-circled assertive" style="position: absolute; top: 25px; left: 39px; font-size: 12px;"></b> {{\'BLOCKCHAIN.VIEW.REVOKED_COUNT\'|translate}}<h4 class="gray">{{\'BLOCKCHAIN.VIEW.REVOKED_COUNT_HELP\'|translate}}</h4><span class="badge badge-balanced" ng-if="formData.revokedCount">-{{::formData.revokedCount}}</span> <span class="badge badge-stable" ng-if="!formData.revokedCount">0</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.revokedCount"><ion-item ng-repeat="identity in ::formData.revoked" class="item-border-large item-small-height" ng-include="::\'templates/blockchain/link_identity.html\'"></ion-item></div></ng-if><ng-if ng-if="!compactMode || formData.certificationsCount"><ion-item class="item-icon-left"><i class="icon ion-ribbon-a"></i> {{\'BLOCKCHAIN.VIEW.CERT_COUNT\'|translate}} <span class="badge badge-stable" ng-class="{\'badge-positive\':formData.certificationsCount}">{{::formData.certificationsCount}}</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding no-padding-xs" ng-if="formData.certificationsCount"><div ng-repeat="(key, certs) in formData.certifications" class="item item-border-large item-small-height"><div class="row no-padding"><div class="col col-center no-padding"><ng-repeat ng-repeat="cert in certs"><ng-include src="::\'templates/blockchain/link_identity.html\'" onload="identity=cert.from"></ng-include><br></ng-repeat></div><div class="col col-10 col-center gray text-center no-padding"><h2><i class="icon ion-arrow-right-a"></i></h2></div><div class="col col-40 col-center no-padding" ng-include="::\'templates/blockchain/link_identity.html\'" onload="identity=certs[0].to"></div></div></div></div></ng-if><ng-if ng-if="!compactMode || formData.transactionsCount"><ion-item class="item-icon-left"><i class="icon ion-card"></i> {{\'BLOCKCHAIN.VIEW.TX_COUNT\'|translate}} <span class="badge badge-stable" ng-class="{\'badge-positive\':formData.transactionsCount}">{{::formData.transactionsCount}}</span></ion-item><div class="padding-bottom item-icon-left-padding item-icon-right-padding no-padding-xs" ng-if="formData.transactionsCount"><div ng-repeat="tx in ::formData.transactions" class="item item-small-height item-border-large"><div class="row no-padding" style="padding-top: 3px;"><div class="col col-40 col-center no-padding list no-margin"><div ng-repeat="identity in ::tx.issuers" class="item no-padding item-small-height"><ng-include src="\'templates/blockchain/link_identity.html\'"></ng-include></div></div><div class="col col-10 col-center gray text-center no-padding"><h2><i class="icon ion-arrow-right-a"></i></h2></div><div class="col no-padding padding-right no-padding-xs col-text-wrap list no-margin"><span class="gray" class="gray" ng-if="tx.toHimself" translate>BLOCKCHAIN.VIEW.TX_TO_HIMSELF</span><div ng-repeat="output in ::tx.outputs" class="item no-padding item-small-height"><ng-include ng-if="::output.pubkey" src="\'templates/blockchain/link_identity.html\'" onload="identity=output"></ng-include><span ng-if="::!output.pubkey && output.unlockFunctions"><i class="icon ion-locked"></i> (<a ng-click="showUnlockConditionPopover(output, $event)"> <i ng-repeat="unlockFunction in ::output.unlockFunctions" ng-class="::{\'ion-key\': (unlockFunction==\'SIG\'), \'ion-clock\': (unlockFunction==\'CSV\' || unlockFunction==\'CLTV\'), \'ion-lock-combination\': (unlockFunction==\'XHX\') }" class="icon"></i> </a>) </span><span class="badge badge-balanced" ng-bind-html="::output.amount | formatAmount:{currency: formData.currency, useRelative: false} "></span></div></div></div></div></div></ng-if></div></div><div class="col col-15 hidden-sm hidden-xs"></div></div></ion-content></ion-view>'),e.put("templates/common/badge_certification_count.html",'<span ng-attr-id="{{$ctrl.csId}}" class="badge badge-balanced" ng-class="{\'badge-energized\': $ctrl.requirements.willNeedCertificationCount || ($ctrl.requirements.needCertificationCount + $ctrl.requirements.pendingCertificationCount >= $ctrl.parameters.sigQty),\n \'badge-assertive\': ($ctrl.requirements.needCertificationCount + $ctrl.requirements.pendingCertificationCount < $ctrl.parameters.sigQty)}"><span ng-if="$ctrl.requirements.certificationCount || !$ctrl.requirements.pendingCertificationCount"><i ng-if="!$ctrl.requirements.needCertificationCount" class="ion-android-done"></i> {{$ctrl.requirements.certificationCount}} <i ng-if="$ctrl.requirements.willNeedCertificationCount" class="ion-android-warning"></i> </span><span ng-if="$ctrl.requirements.pendingCertificationCount"><ng-if ng-if="$ctrl.requirements.certificationCount">+</ng-if><i class="ion-clock"></i> {{$ctrl.requirements.pendingCertificationCount}}</span></span>'),e.put("templates/common/badge_given_certification_count.html",'<div ng-attr-id="{{$ctrl.csId}}" class="badge badge-calm" ng-class="{\'badge-assertive\': $ctrl.identity.given_cert.length >= $ctrl.parameters.sigStock}"><span><i ng-if="$ctrl.identity.given_cert.length" class="ion-android-done"></i> {{$ctrl.identity.given_cert.length}} </span><span ng-if="$ctrl.identity.given_cert_pending.length">(<ng-if ng-if="$ctrl.identity.given_cert.length">+</ng-if><i class="ion-clock"></i> {{$ctrl.identity.given_cert_pending.length}}) </span><small>/ {{$ctrl.parameters.sigStock}}</small></div>'),e.put("templates/common/form_error_messages.html",'<div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG"></span></div><div class="form-error" ng-message="pattern"><span translate="ERROR.FIELD_ACCENT"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div>'),e.put("templates/common/note_feature_not_available.html",'<h4 class="assertive"><b class="ion-android-close"></b> <span translate>MODE.DEMO.FEATURE_NOT_AVAILABLE</span></h4>'),e.put("templates/common/popover_copy.html",'<ion-popover-view class="popover-copy" style="height: {{(!rows || rows &lt;= 1) ? 50 : rows*22}}px"><ion-content scroll="false"><div class="list"><div class="item item-input"><input type="text" autocomplete="off" ng-if="!rows || rows &lt;= 1" ng-model="value"> <textarea ng-if="rows && rows > 1" ng-model="value" rows="{{rows}}" cols="10">\n </textarea></div></div></ion-content></ion-popover-view>'),e.put("templates/common/popover_helptip.html",'<ion-popover-view class="popover-helptip"><ion-content scroll="false" class="list"><p><i ng-if="icon.position && !icon.position.startsWith(\'bottom-\')" class="{{icon.class}} icon-{{icon.position}} hidden-xs" style="{{icon.style}}"></i><a ng-click="closePopover()" class="pull-right button-close" ng-class="{\'pull-left\': icon.position === \'right\', \'pull-right\': icon.position !== \'right\'}"><i class="ion-close"></i> </a><span>&nbsp;</span></p><p class="padding light"><ng-bind-html ng-bind-html="content | translate:contentParams"></ng-bind-html><ng-bind-html ng-bind-html="trustContent"></ng-bind-html></p><div class="text-center" ng-if="!tour"><button class="button button-small button-stable" ng-if="!hasNext" ng-click="closePopover(true)" translate>COMMON.BTN_UNDERSTOOD</button> <button class="button button-small button-stable" id="helptip-btn-ok" ng-if="hasNext" ng-click="closePopover(false)" translate>COMMON.BTN_UNDERSTOOD</button> <button id="helptip-btn-ok" class="button button-small button-positive icon-right ink" ng-if="hasNext" ng-click="closePopover(true)"><i class="icon ion-chevron-right"></i></button></div><div class="text-center" ng-if="tour"><button class="button button-small button-positive" id="helptip-btn-ok" ng-if="!hasNext" ng-click="closePopover(false)" translate>COMMON.BTN_CLOSE</button> <button id="helptip-btn-ok" class="button button-small button-positive icon-right ink" ng-if="hasNext" ng-click="closePopover(true)">{{\'COMMON.BTN_CONTINUE\'|translate}} <i class="icon ion-chevron-right"></i></button></div><p><i ng-if="icon.position && icon.position.startsWith(\'bottom-\')" class="{{icon.class}} icon-{{icon.position}} hidden-xs"></i></p></ion-content></ion-popover-view>'),e.put("templates/common/popover_locales.html",'<ion-popover-view class="fit popover-locales" style="height: {{locales.length*48}}px;"><ion-content scroll="false"><div class="list item-text-wrap block"><a ng-repeat="l in locales track by l.id" class="item item-icon-left ink" ng-click="changeLanguage(l.id)"><i class="item-image avatar" style="background-image: url(./img/flag-{{l.flag}}.png)"></i> {{l.label | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/common/popover_profile.html",'<ion-popover-view class="fit has-header popover-profile hidden-xs hidden-sm"><ion-content scroll="false"><div class="row"><div class="col col-33"><i class="avatar avatar-member" ng-if="!walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}"></i> <i class="avatar" ng-if="walletData.avatar" style="background-image: url(\'{{walletData.avatar.src}}\')"></i></div><div class="col col-66" ng-if="login"><h4>{{walletData.name||walletData.uid}}</h4><h4 class="gray" ng-if="!walletData.name && !walletData.uid" copy-on-click="{{walletData.pubkey}}"><i class="icon ion-key"></i> {{walletData.pubkey|formatPubkey}}</h4><span class="gray" ng-if="walletData.name||walletData.uid" copy-on-click="{{walletData.pubkey}}"><i class="icon ion-key"></i> {{walletData.pubkey|formatPubkey}}</span></div></div><div class="row" ng-show="login"><div class="col col-66 col-offset-33"><button ng-show="!auth" class="button button-assertive button-small ink" ng-click="doAuth()">{{\'AUTH.BTN_AUTH\' | translate}}</button><cs-extension-point name="profile-popover-user"></cs-extension-point></div></div><div class="row" ng-show="!login"><div class="col col-66 col-offset-33"><div class="text-center no-padding gray">{{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}<br class="visible-xs"><b><button class="button button-calm button-small ink" ng-click="showJoinModal()">{{\'LOGIN.CREATE_ACCOUNT\'|translate}}</button></b></div></div></div></ion-content><ion-footer-bar class="stable-bg row"><div class="col"><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"><i class="icon ion-android-settings"></i> {{\'MENU.SETTINGS\' | translate}}</button></div><div class="col"><button class="button button-raised button-block button-stable ink ink-dark" ng-show="login" ng-click="logout()" translate>COMMON.BTN_LOGOUT</button> <button class="button button-raised button-block button-positive ink" ng-show="!login" ng-click="loginAndGo(\'app.view_wallet\')" translate>COMMON.BTN_LOGIN</button></div></ion-footer-bar></ion-popover-view>'),e.put("templates/common/popover_share.html",'<ion-popover-view class="popover-share"><ion-content scroll="false"><div class="bar bar-header"><h1 class="title">{{titleKey|translate:titleValues}}</h1><span class="gray pull-right">{{time|formatDate}}</span></div><div class="list no-margin no-padding has-header has-footer block"><div class="item item-input"><input type="text" autocomplete="off" ng-model="value"></div></div><div class="bar bar-footer"><div class="button-bar"><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}}"></a> <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}}"></a> <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}}"></a> <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}}"></a> <a class="button-close" title="{{\'COMMON.BTN_CLOSE\'|translate}}" ng-click="closePopover()"><i class="icon ion-close"></i></a></div></div></ion-content></ion-popover-view>'),e.put("templates/common/popup_password.html",'<form name="pwdForm" ng-submit="submit($event)"><div class="list" ng-init="setForm(pwdForm)"><label class="item item-input" ng-class="{\'item-input-error\': pwdForm.$submitted && pwdForm.password.$invalid}"><input name="password" type="password" placeholder="{{\'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-minlength="1" required></label><div class="form-errors" ng-if="pwdForm.$submitted && pwdForm.pseudo.$error" ng-messages="pwdForm.password.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div><div class="form-errors" ng-if="error"><div class="form-error">{{error|translate}}</div></div></div></form>'),e.put("templates/common/qrcode.html",'<a ng-attr-id="{{ qrcodeId }}" ng-show="!loading" class="qrcode fade-in pull-right" ng-class="{\'active\': toggleQRCode}" ng-click="toggleQRCode = !toggleQRCode"><div class="content"></div><div class="footer item item-icon-left item-text-wrap ink" on-hold="copy(formData.pubkey)" copy-on-click="{{:rebind:formData.pubkey}}" ng-click="$event.stopPropagation()"><i class="icon ion-key"></i> <span>{{:locale:\'COMMON.PUBKEY\'|translate}}</span><h4 id="pubkey" class="dark">{{:rebind:formData.pubkey}}</h4></div></a>'),e.put("templates/common/view_passcode.html",'<ion-view left-buttons="leftButtons"><ion-nav-title><span class="visible-xs visible-sm" translate>COMMON.PASSCODE.TITLE</span></ion-nav-title><ion-content scroll="false"></ion-content></ion-view>'),e.put("templates/currency/items_network.html",'<ion-item id="helptip-network-blockchain" class="item-icon-left item-text-wrap"><i class="icon ion-clock"></i> <span class="col col-60" translate>CURRENCY.VIEW.MEDIAN_TIME</span> <span class="badge badge-stable">{{formData.medianTime | medianDate}}</span></ion-item><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-lock-combination"></i> <span class="col col-75" translate>CURRENCY.VIEW.POW_MIN</span> <span class="badge badge-stable">{{formData.difficulty | formatInteger}}</span></ion-item><cs-extension-point name="network-actual"></cs-extension-point><div class="item item-divider"><span translate>CURRENCY.VIEW.NETWORK_RULES_DIVIDER</span></div><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-clock" style="position: absolute; font-size: 20px; left: 16px; margin-top: 11px"></i> <b class="icon-secondary ion-lock-combination" style="left: 14px; margin-top: -4px;"></b> <b class="icon-secondary ion-arrow-right-c" style="font-size: 12px; left: 28px; margin-top: -4px;"></b> <b class="icon-secondary ion-lock-combination" style="left: 38px; margin-top: -4px;"></b> <span class="col col-75" translate>CURRENCY.VIEW.AVG_GEN_TIME</span> <span class="badge badge-stable">{{formData.avgGenTime | formatDuration}}</span></ion-item><div id="helptip-network-peers" class="item item-divider"><div class="pull-left"><span ng-if="search.type==\'member\'" translate>PEER.MEMBERS</span> <span ng-if="search.type==\'mirror\'" translate>PEER.MIRRORS</span> <span ng-if="search.type==\'offline\'" translate>PEER.OFFLINE</span> <span ng-if="!search.type" translate>PEER.PEERS</span> <span ng-if="!search.loading">({{search.results.length}})</span></div><div class="buttons pull-right"><ion-spinner class="icon" icon="android" ng-if="search.loading"></ion-spinner><a class="button button-icon button-small-padding icon ion-loop gray hidden-xs hidden-sm ink" ng-if="!search.loading" ng-click="refresh()"></a> <a class="button button-icon button-small-padding icon ion-android-more-vertical gray hidden-xs hidden-sm ink" ng-if="!search.loading" ng-click="showActionsPopover($event)"></a></div></div><ng-include src="::\'templates/network/items_peers.html\'"></ng-include>'),e.put("templates/currency/items_parameters.html",'<div bind-notifier="{ rebind:formData.useRelative }"><ion-item class="item-icon-left item-text-wrap visible-xs visible-sm"><i class="icon ion-android-bookmark"></i> <span translate>CURRENCY.VIEW.CURRENCY_NAME</span><div class="item-note dark" ng-if="!loading">{{formData.currency}} (<span ng-bind-html=":rebind:formData.currency | currencySymbol:formData.useRelative"></span>)</div></ion-item><ion-item id="helptip-currency-mass-member" class="item-icon-left item-text-wrap"><i class="icon ion-pie-graph"></i><div class="col col-60"><span translate>CURRENCY.VIEW.SHARE</span> <span class="gray">(M<sub>t</sub>/N<sub>t</sub>)</span></div><span id="helptip-currency-mass-member-unit" ng-if="!loading" class="badge badge-calm" ng-bind-html=":rebind:formData.MoverN | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}"></span></ion-item><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-record"></i><div class="col col-60"><span translate>CURRENCY.VIEW.MASS</span> <span class="gray">(M<sub>t</sub>)</span></div><span class="badge badge-energized" ng-if="!loading" ng-bind-html=":rebind:formData.M | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}"></span></ion-item><cs-extension-point name="parameters-actual"></cs-extension-point><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-arrow-graph-up-right"></i><div class="col col-60"><span translate>CURRENCY.VIEW.C_ACTUAL</span> <span class="gray">(c<sub>{{\'CURRENCY.VIEW.CURRENT\'|translate}}</sub>)</span></div><span class="badge badge-stable">{{formData.cactual | formatNumeral: \'0,0.00\'}} %&nbsp;/&nbsp;{{formData.dt | formatPeriod}}</span></ion-item><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-load-c"></i><div class="col col-60"><span translate>CURRENCY.VIEW.UD</span> <span class="gray">({{\'COMMON.UD\'|translate}}<sub>t</sub>)</span></div><div class="badge badge-royal" ng-if="!loading"><span ng-if="formData.useRelative">1<ng-bind-html ng-bind-html=":rebind:formData.currency| currencySymbol:true"></ng-bind-html></span><span ng-if="!formData.useRelative" ng-bind-html=":rebind:formData.currentUD | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}"></span> &nbsp;/&nbsp;{{formData.dt | formatPeriod}}</div></ion-item><div class="item item-toggle dark"><div class="item-label text-right gray" translate>COMMON.BTN_RELATIVE_UNIT</div><label class="toggle toggle-royal" id="helptip-currency-change-unit"><input type="checkbox" ng-model="formData.useRelative"><div class="track"><div class="handle"></div></div></label></div><a name="helptip-currency-rules-anchor"></a><div class="item item-divider" id="helptip-currency-rules"><span translate>CURRENCY.VIEW.MONEY_RULES_DIVIDER</span></div><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-arrow-graph-up-right"></i><div class="col col-60"><span translate>CURRENCY.VIEW.C_RULE</span> <span class="gray">(c)</span></div><span class="item-note dark" ng-if="!loading && !formData.udReevalTime0">{{formData.c*100 | formatNumeral: \'0,0.00\'}} %&nbsp;/&nbsp;{{formData.dt | formatPeriod}}</span><span class="badge badge-stable" ng-if="!loading && formData.udReevalTime0">{{formData.c*100 | formatNumeral: \'0,0.00\'}} %&nbsp;/&nbsp;{{formData.dtReeval | formatDuration}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.udReevalTime0 && formData.allRules"><i class="icon ion-load-c"></i> <b class="ion-clock icon-secondary" style="font-size: 18px; left: 36px; top: -12px;"></b><div class="col col-60"><span translate>CURRENCY.VIEW.DT_REEVAL</span> <span class="gray">(dt<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub>)</span></div><span class="item-note dark" ng-if="!loading" translate="CURRENCY.VIEW.DT_REEVAL_VALUE" translate-values="formData"></span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.udReevalTime0 && formData.allRules"><i class="icon ion-load-c"></i> <b class="ion-calendar icon-secondary" style="font-size: 18px; left: 36px; top: -12px;"></b><div class="col col-60"><span translate>CURRENCY.VIEW.UD_REEVAL_TIME0</span> <span class="gray">(t0<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub>)</span></div><span class="item-note dark" ng-if="!loading">{{formData.udReevalTime0|medianDate}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allRules"><i class="icon ion-load-c"></i> <b class="ion-calculator icon-secondary" style="font-size: 18px; left: 36px; top: -12px;"></b><div class="col col-60"><span translate>CURRENCY.VIEW.UD_RULE</span> <span class="gray" ng-if="formData.udReevalTime0">- {{\'COMMON.UD\'|translate}}<sub>{{formData.dt|formatPeriod}}</sub>(t<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub>)</span></div><span class="item-note dark" ng-if="!loading && !formData.udReevalTime0">{{\'COMMON.UD\'|translate}}<sub>t-1</sub> + c<sup>2</sup> * M<sub>t-1</sub>/N<sub>t-1</sub></span><span class="item-note dark" ng-if="!loading && formData.udReevalTime0">{{\'COMMON.UD\'|translate}}<sub>{{formData.dt|formatPeriod}}</sub>(t<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub> - dt<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub>)+ c<sup>2</sup> * (M/N)(t<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub> - dt<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub>) / dt<sub>{{\'CURRENCY.VIEW.REEVAL_SYMBOL\'|translate}}</sub></span></ion-item><div class="item item-toggle dark"><div class="item-label text-right gray" translate>CURRENCY.VIEW.DISPLAY_ALL_RULES</div><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.allRules"><div class="track"><div class="handle"></div></div></label></div></div>'),e.put("templates/currency/items_wot.html",'<div bind-notifier="{ rebind:formData.useRelative }"><a name="helptip-currency-newcomers-anchor"></a><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-person-stalker"></i><div class="col col-60"><span translate>CURRENCY.VIEW.MEMBERS</span> <span class="gray">(N<sub>{{\'CURRENCY.VIEW.CURRENT\'|translate}}</sub>)</span></div><span class="badge badge-calm" ng-if="!loading">{{formData.N | formatInteger}}</span></ion-item><ion-item id="helptip-currency-newcomers" class="item-icon-left item-text-wrap"><i class="icon ion-arrow-graph-up-right"></i><div class="col col-75"><span translate="CURRENCY.VIEW.MEMBERS_VARIATION" translate-values="{duration: formData.durationFromLastUD}"></span> <span class="gray">(&#916;N)</span></div><div class="badge" ng-if="!loading" ng-class="{\'badge-balanced\': (formData.N>formData.Nprev), \'badge-stable\': (formData.N==formData.Nprev) ,\'badge-assertive\': (formData.Nprev>formData.N)}">{{formData.N > formData.Nprev ? \'+\' : \'\'}}{{formData.N - formData.Nprev}}</div></ion-item><cs-extension-point name="wot-actual"></cs-extension-point><div class="item item-divider"><span translate>CURRENCY.VIEW.WOT_RULES_DIVIDER</span></div><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-ribbon-b"></i> <span class="col col-75" translate>CURRENCY.VIEW.SIG_QTY_RULE</span> <span class="badge badge-balanced" ng-if="!loading">{{formData.sigQty}}</span></ion-item><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-person"></i> <b class="ion-clock icon-secondary" style="font-size: 18px; left: 33px; top: -12px;"></b> <span class="col col-60" translate>CURRENCY.VIEW.MS_WINDOW</span> <span class="badge badge-assertive" ng-if="!loading">{{formData.msWindow | formatDuration}}</span></ion-item><ion-item class="item-icon-left item-text-wrap"><i class="icon ion-person"></i> <b class="ion-calendar icon-secondary" style="font-size: 18px; left: 33px; top: -12px;"></b> <span class="col col-60" translate>CURRENCY.VIEW.MS_VALIDITY</span> <span class="badge badge-balanced" ng-if="!loading">{{formData.msValidity | formatDuration}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-ribbon-b"></i> <b class="ion-clock icon-secondary" style="font-size: 18px; left: 33px; top: -12px;"></b> <span class="col col-60" translate>CURRENCY.VIEW.SIG_WINDOW</span> <span class="badge badge-stable" ng-if="!loading">{{formData.sigWindow | formatDuration}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-ribbon-b"></i> <b class="ion-calendar icon-secondary" style="font-size: 18px; left: 33px; top: -12px;"></b> <span class="col col-60" translate>CURRENCY.VIEW.SIG_VALIDITY</span> <span class="badge badge-balanced" ng-if="!loading">{{formData.sigValidity | formatDuration}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-ribbon-a"></i> <span class="col col-75" translate>CURRENCY.VIEW.SIG_STOCK</span> <span class="badge badge-stable" ng-if="!loading">{{formData.sigStock}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-clock" style="position: absolute; font-size: 20px; left: 16px;"></i> <b class="ion-ribbon-a icon-secondary" style="left: 16px; top: -15px;"></b> <b class="ion-arrow-right-c icon-secondary" style="left: 28px; top: -15px;"></b> <b class="ion-ribbon-a icon-secondary" style="left: 40px; top: -15px;"></b> <span class="col col-75" translate>CURRENCY.VIEW.SIG_PERIOD</span> <span class="badge badge-stable" ng-if="!loading">{{formData.sigPeriod | formatDuration}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-steam"></i> <b class="ion-person icon-secondary" style="left: 38px; top: -17px"></b><div class="col col-75"><span ng-bind-html="\'CURRENCY.VIEW.STEP_MAX\'|translate"></span> <span class="gray">(stepMax)</span></div><span class="badge badge-assertive" ng-if="!loading">{{formData.stepMax}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-ribbon-b"></i> <b class="ion-star icon-secondary" style="color: yellow; font-size: 16px; left: 25px; top: -7px;"></b> <span class="col col-75" translate>CURRENCY.VIEW.SENTRIES</span> <span class="badge badge-stable" ng-if="!loading">{{formData.sentries}}</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-ribbon-b"></i> <b class="ion-star icon-secondary" style="color: yellow; font-size: 16px; left: 25px; top: -7px;"></b> <span class="col col-75" translate>CURRENCY.VIEW.SENTRIES_FORMULA</span> <span class="item-note dark" ng-if="!loading">{{\'CURRENCY.VIEW.MATH_CEILING\'| translate}}( N<sub>t</sub><sup>^ (1 / stepMax)</sup>)</span></ion-item><ion-item class="item-icon-left item-text-wrap" ng-if="formData.allWotRules"><i class="icon ion-pull-request"></i> <span class="col col-75" translate>CURRENCY.VIEW.XPERCENT</span> <span class="badge badge-stable" ng-if="!loading">{{formData.xpercent*100| formatNumeral: \'0,0\'}} %</span></ion-item><div class="item item-toggle dark"><div class="item-label text-right gray" translate>CURRENCY.VIEW.DISPLAY_ALL_RULES</div><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.allWotRules"><div class="track"><div class="handle"></div></div></label></div></div>'),e.put("templates/currency/lookup_form.html",'<ion-list><div class="item center" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div ng-repeat="currency in search.results" ng-class="{ selected: selectedCurrency == currency }"><a class="item card card-item stable-bg padding ink" ng-click="selectCurrency(currency)" ng-class="{ selected: selectedCurrency && selectedCurrency.name == currency.name }"><h2>{{currency.name}}</h2><h4 class="gray">{{currency.peer.server}}</h4><span class="badge badge-royal">{{\'CURRENCY.SELECT.MEMBERS_COUNT\'|translate:currency}}</span></a></div></ion-list>'),e.put("templates/currency/lookup.html",'<ion-view view-title="{{\'CURRENCY.SELECT.TITLE\' | translate}}"><ion-content class="padding no-padding-xs no-padding-sm"><h4 class="content double-padding-x" translate>CURRENCY.SELECT.CURRENCIES</h4><ng-include src="::\'templates/currency/lookup_form.html\'"></ion-content></ion-view>'),e.put("templates/currency/modal_license.html",'<ion-modal-view class="modal-full-height modal-license"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>CURRENCY.LICENSE.TITLE</h1><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doTransfer()"></button></ion-header-bar><ion-content scroll="false" style="bottom: 0px;"><p ng-if="!licenseUrl && !loading">translate>CURRENCY.LICENSE.NO_LICENSE_FILE</p><iframe ng-if="licenseUrl && !loading" class="padding-left padding-right no-padding-xs iframe-license" id="iframe-license" ng-src="{{licenseUrlHtml||licenseUrl}}"></iframe><div class="padding hidden-xs text-center"><button class="button button-stable ink" ng-click="downloadFile()">{{\'CURRENCY.LICENSE.BTN_DOWNLOAD\' | translate}}</button> <button class="button button-positive ink" type="submit" ng-click="closeModal()">{{\'COMMON.BTN_CLOSE\' | translate}}</button></div></ion-content></ion-modal-view>'),e.put("templates/currency/popover_actions.html",'<ion-popover-view class="fit has-header popover-wallet-actions"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink hidden-sm hidden-xs" ng-click="startCurrencyTour()"><i class="icon ion-easel"></i> {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/currency/tabs/tab_blocks.html",'<ion-view><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-navicon visible-xs visible-sm" ng-click="toggleCompactMode()"><b class="icon-secondary" ng-class="{\'ion-arrow-down-b\': !compactMode, \'ion-arrow-up-b\': compactMode}" style="top: -12px; left: 11px; font-size: 10px;"></b> <b class="icon-secondary" ng-class="{\'ion-arrow-up-b\': !compactMode,\'ion-arrow-down-b\': compactMode}" style="top: 12px; left: 11px; font-size: 10px;"></b></button><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content><div class="item item-divider"><span translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</span></div><cs-extension-point name="buttons"></cs-extension-point><ng-include src="::\'templates/blockchain/list_blocks.html\'"></ng-include></ion-content></ion-view>'),e.put("templates/currency/tabs/tab_network.html",'<ion-view><ion-nav-buttons side="secondary"><button class="button button-icon button-clear" ng-click="showExtendActionsPopover($event)"><i class="icon ion-android-funnel"></i></button></ion-nav-buttons><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refreshPeers()"></ion-refresher><div class="list"><ng-include src="::\'templates/currency/items_network.html\'"></ng-include></div></ion-content></ion-view>'),e.put("templates/currency/tabs/tab_parameters.html",'<ion-view><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()"></ion-refresher><div class="list"><ng-include src="::\'templates/currency/items_parameters.html\'"></ng-include></div></ion-content></ion-view>'),e.put("templates/currency/tabs/tab_wot.html",'<ion-view><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()"></ion-refresher><div class="list"><ng-include src="::\'templates/currency/items_wot.html\'"></ng-include></div></ion-content></ion-view>'),e.put("templates/currency/view_currency_lg.html",'<ion-view left-buttons="leftButtons" cache-view="false"><ion-nav-title bind-notifier="{ rebind:formData.useRelative }"><span ng-if="!loading">{{\'CURRENCY.VIEW.TITLE\' | translate}} {{formData.currency|abbreviate}}</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refreshPeers()"></button><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content><div class="hidden-xs hidden-sm padding text-center"><button class="button button-stable icon-right ink" ng-if="formData.licenseUrl" ng-click="showLicenseModal()"><i class="icon ion-document-text"></i>&nbsp; {{\'CURRENCY.VIEW.BTN_SHOW_LICENSE\' | translate}}</button> <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="refresh()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button> <button class="button button-stable button-small-padding icon ion-android-more-vertical ink" ng-click="showActionsPopover($event)"></button></div><div class="item item-text-wrap no-border no-padding pull-left"><div class="item-icon-left card padding stable-900-bg"><ion-spinner class="icon" icon="android" ng-if="loading"></ion-spinner><i class="icon ion-help-circled calm" ng-if="!loading"></i><div class="item-icon-left-padding" style="min-height: 26px;"><span ng-if="!loading" trust-as-html="\'CURRENCY.VIEW.CURRENCY_SHORT_DESCRIPTION\'|translate:formData"></span></div></div></div><div class="row responsive-sm"><div class="col list"><div class="item item-divider"><span translate>CURRENCY.VIEW.MONEY_DIVIDER</span></div><ng-include src="::\'templates/currency/items_parameters.html\'"></ng-include></div><div class="col list"><div class="item item-divider"><span translate>CURRENCY.VIEW.WOT_DIVIDER</span></div><ng-include src="::\'templates/currency/items_wot.html\'"></ng-include></div></div></ion-content></ion-view>'),e.put("templates/currency/view_currency.html",'<ion-view left-buttons="leftButtons" cache-view="false"><ion-tabs class="tabs-positive tabs-icon-top"><ion-tab title="{{\'CURRENCY.VIEW.TAB_CURRENCY\'|translate}}" icon="ion-stats-bars" ui-sref="app.currency.tab_parameters"><ion-nav-view name="tab-parameters"></ion-nav-view></ion-tab><ion-tab title="{{\'CURRENCY.VIEW.TAB_WOT\'|translate}}" icon="ion-person-stalker" ui-sref="app.currency.tab_wot"><ion-nav-view name="tab-wot"></ion-nav-view></ion-tab><ion-tab id="helptip-currency-tab-peers" title="{{\'CURRENCY.VIEW.TAB_NETWORK\'|translate}}" icon="ion-cloud" ui-sref="app.currency.tab_network"><ion-nav-view name="tab-network"></ion-nav-view></ion-tab><ion-tab title="{{\'CURRENCY.VIEW.TAB_BLOCKS\'|translate}}" icon="ion-lock-combination" ui-sref="app.currency.tab_blocks"><ion-nav-view name="tab-blocks"></ion-nav-view></ion-tab></ion-tabs></ion-view>'),e.put("templates/help/help.html",'<a name="demo"></a><div class="row responsive-sm" ng-if="::$root.config.demo" ng-class="itemsClass[\'demo\']"><div class="col col-20" translate>MODE.DEMO.MODE</div><div class="col"><span translate>MODE.DEMO.MODE_HELP</span><br><span translate>MODE.DEMO.INSTALL_HELP</span></div></div><a name="readonly"></a><div class="row responsive-sm" ng-if="::$root.config.readonly" ng-class="itemsClass[\'readonly\']"><div class="col col-20" translate>MODE.READONLY.MODE</div><div class="col"><span translate>MODE.READONLY.MODE_HELP</span><br><span translate>MODE.READONLY.INSTALL_HELP</span></div></div><div class="hidden-readonly"><a name="join"></a><h2 translate>HELP.JOIN.SECTION</h2><a name="join-salt"></a><div class="row responsive-sm" ng-class="itemsClass[\'join-salt\']"><div class="col col-20" translate>LOGIN.SALT</div><div class="col" translate>HELP.JOIN.SALT</div></div><a name="join-password"></a><div class="row responsive-sm" ng-class="itemsClass[\'join-password\']"><div class="col col-20" translate>LOGIN.PASSWORD</div><div class="col" translate>HELP.JOIN.PASSWORD</div></div><a name="join-pseudo"></a><div class="row responsive-sm" ng-class="itemsClass[\'join-pseudo\']"><div class="col col-20" translate>ACCOUNT.NEW.PSEUDO</div><div class="col" translate>HELP.JOIN.PSEUDO</div></div></div><div class="hidden-readonly"><a name="login"></a><h2 translate>HELP.LOGIN.SECTION</h2><a name="login-pubkey"></a><div class="row responsive-sm" ng-class="itemsClass[\'login-pubkey\']"><div class="col col-20" translate>HELP.LOGIN.PUBKEY</div><div class="col" translate>HELP.LOGIN.PUBKEY_DEF</div></div><a name="login-method"></a><div class="row responsive-sm" ng-class="itemsClass[\'login-method\']"><div class="col col-20" translate>HELP.LOGIN.METHOD</div><div class="col" translate>HELP.LOGIN.METHOD_DEF</div></div></div><div><a name="glossary"></a><h2 translate>HELP.GLOSSARY.SECTION</h2><a name="pubkey"></a><div class="row responsive-sm" ng-class="itemsClass.pubkey"><div class="col col-20" translate>COMMON.PUBKEY</div><div class="col" translate>HELP.GLOSSARY.PUBKEY_DEF</div></div><a name="blockchain"></a><div class="row responsive-sm" ng-class="itemsClass.blockchain"><div class="col col-20" translate>HELP.GLOSSARY.BLOCKCHAIN</div><div class="col" translate>HELP.GLOSSARY.BLOCKCHAIN_DEF</div></div><a name="universal_dividend"></a> <a name="ud"></a><div class="row responsive-sm" ng-class="itemsClass.ud"><div class="col col-20" translate>COMMON.UNIVERSAL_DIVIDEND</div><div class="col" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div></div><a name="member"></a><div class="row responsive-sm" ng-class="itemsClass.member"><div class="col col-20" translate>HELP.GLOSSARY.MEMBER</div><div class="col" translate>HELP.GLOSSARY.MEMBER_DEF</div></div><a name="wot"></a><div class="row responsive-sm" ng-class="itemsClass.wot"><div class="col col-20" translate>HELP.GLOSSARY.WOT</div><div class="col" translate>HELP.GLOSSARY.WOT_DEF</div></div><a name="currency_rules"></a><div class="row responsive-sm" ng-class="itemsClass.currency_rules"><div class="col col-20" translate>HELP.GLOSSARY.CURRENCY_RULES</div><div class="col" translate>HELP.GLOSSARY.CURRENCY_RULES_DEF</div></div><a name="distance_rule"></a><div class="row responsive-sm" ng-class="itemsClass.distance_rule"><div class="col col-20" translate>HELP.GLOSSARY.DISTANCE_RULE</div><div class="col" translate>HELP.GLOSSARY.DISTANCE_RULE_DEF</div></div></div>'),e.put("templates/help/modal_help.html",'<ion-modal-view class="modal-full-height modal-help"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CLOSE</button><h1 class="title" translate>HELP.TITLE</h1></ion-header-bar><ion-content scroll="true" class="padding no-padding-xs"><div ng-class="listClass"><ng-include src="::\'templates/help/help.html\'"></ng-include></div><div class="padding hidden-xs text-center"><button class="button button-positive ink" type="submit" ng-click="closeModal()">{{\'COMMON.BTN_CLOSE\' | translate}}</button></div></ion-content></ion-modal-view>'),e.put("templates/help/view_help.html",'<ion-view left-buttons="leftButtons"><ion-nav-title><span class="visible-xs visible-sm" translate>HELP.TITLE</span></ion-nav-title><ion-content scroll="true" class="padding"><h1 class="hidden-xs hidden-sm" translate>HELP.TITLE</h1><ng-include src="::\'templates/help/help.html\'"></ng-include></ion-content></ion-view>'),e.put("templates/home/home.html",'<ion-view id="home"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-clear hidden-xs hidden-sm flag" ng-click="showLocalesPopover($event)" style="align-content: center"><i class="flag-image" ng-if=":locale:$root.settings.locale" style="background-image: url(./img/flag-{{$root.settings.locale.flag}}.png);"></i> <b class="ion-arrow-down-b gray"></b></button></ion-nav-buttons><ion-content class="circle-bg-dark" ng-class="::{\'positive-900-bg\': !$root.config.readonly, \'balanced-900-bg\': $root.config.readonly}"><div class="ribbon" ng-if="::$root.config.demo || $root.config.readonly"><a class="badge badge-assertive" ng-if="$root.config.demo" ng-click="showHelpModal(\'demo\')">{{:locale:\'MODE.DEMO.BADGE\'|translate}}</a> <a class="badge badge-balanced" ng-if="$root.config.readonly" ng-click="showHelpModal(\'readonly\')">{{:locale:\'MODE.READONLY.BADGE\'|translate}}</a> <a class="badge badge-positive" ng-click="openLink($event, $root.settings.sourceUrl)" title="{{:locale:\'HOME.FORK_ME\'|translate}}">{{:locale:\'HOME.FREE_SOFTWARE\'|translate}}</a> <a class="badge badge-stable" ng-click="openLink($event, $root.settings.sourceLicenseUrl)" title="{{:locale:\'HOME.SHOW_LICENSE\'|translate}}">AGPL-3.0</a></div><div class="row padding-horizontal no-padding-xxs responsive-lg"><div class="col col-30 no-padding hidden-xs hidden-sm">&nbsp;</div><div class="col text-center no-padding-xs main-container"><div id="helptip-home-logo" class="logo"></div><h4 class="welcome" ng-if="::!$root.config.readonly"><p class="hidden-xs" translate>HOME.WELCOME</p><b ng-show="!loading" translate-values=":currency:{currency: $root.currency.name}" translate>HOME.MESSAGE</b></h4><h4 class="welcome" ng-if="::$root.config.readonly"><p translate>HOME.WELCOME_READONLY</p><b ng-show="!loading" translate-values=":currency:{currency: $root.currency.name}" translate>HOME.MESSAGE_READONLY</b></h4><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="center padding animate-fade-in animate-show-hide ng-hide" ng-show="!loading && error"><div class="card card-item padding"><p class="item-content item-text-wrap"><span class="dark" trust-as-html="\'HOME.CONNECTION_ERROR\'|translate:node"></span></p><button type="button" class="button button-positive icon icon-left ion-refresh ink" ng-click="reload()">{{:locale:\'COMMON.BTN_REFRESH\'|translate}}</button></div></div><div class="center animate-show-hide ng-hide" ng-show="!loading && !error"><button type="button" class="button button-block button-stable button-raised icon-left icon ion-easel ink-dark" ng-class="::{\'hidden-xs\': !$root.config.readonly}" ng-show="login || $root.config.readonly" ng-click="startHelpTour($event)">{{:locale:\'COMMON.BTN_HELP_TOUR\'|translate}}</button> <button type="button" class="item button button-block button-balanced button-raised icon icon-left ion-ios-world-outline ink-dark" ui-sref="app.currency" ng-if="::$root.config.readonly"><span translate-values=":currency:{currency: $root.currency.name}" translate>HOME.BTN_CURRENCY</span></button> <button type="button" class="item button button-block button-positive button-raised icon icon-left ion-cloud ink-dark" ui-sref="app.network" ng-if="::$root.config.readonly">{{:locale:\'HOME.BTN_NETWORK\'|translate}}</button> <button type="button" class="button button-block button-positive button-raised ink-dark" ng-click="showJoinModal()" ng-if="!$root.config.readonly && !login" translate>LOGIN.CREATE_FREE_ACCOUNT</button> <button type="button" class="item button button-block button-raised icon icon-left ion-person ink-dark" ng-class="{\'button-stable\': smallscreen, \'button-positive\': !smallscreen}" ui-sref="app.view_wallet" ng-show="login" translate>MENU.ACCOUNT</button> <button type="button" class="item button button-block button-stable button-raised icon icon-left ion-card ink-dark visible-xs" ui-sref="app.view_wallet_tx" ng-if="login"><b class="icon-secondary ion-clock" style="left: 52px; top: -2px; font-size: 10pt; display: block;"></b> {{:locale:\'MENU.TRANSACTIONS\'|translate}}</button> <button type="button" class="item button button-block button-positive button-raised icon icon-left ion-paper-airplane ink-dark visible-xs" ng-click="showTransferModal()" ng-if="login" translate>COMMON.BTN_SEND_MONEY</button><br class="visible-xs visible-sm"><div class="text-center no-padding" ng-if="::!$root.config.readonly" ng-show="!login"><br class="visible-xs visible-sm">{{\'LOGIN.HAVE_ACCOUNT_QUESTION\'|translate}} <b><a class="assertive hidden-xs hidden-sm" ui-sref="app.view_wallet" translate>COMMON.BTN_LOGIN</a></b></div><div class="text-center no-padding" ng-show="login"><br class="visible-xs visible-sm"><span ng-bind-html="\'HOME.NOT_YOUR_ACCOUNT_QUESTION\'|translate:{pubkey: walletData.pubkey}"></span><br><b><a class="assertive" ng-click="logout({askConfirm: true})" translate>HOME.BTN_CHANGE_ACCOUNT</a></b></div><button type="button" class="button button-block button-stable button-raised ink visible-xs visible-sm" ui-sref="app.view_wallet" ng-if="!$root.config.readonly && !login" translate>COMMON.BTN_LOGIN</button><div class="text-center visible-demo"><br><p class="text-center"><span class="light"><i class="icon ion-help-circled" style="font-size: 16pt;"></i></span> <span class="stable" translate>MODE.DEMO.MODE_HELP</span> <a href="#" ng-click="showHelpModal(\'demo\')" translate>HOME.READ_MORE</a></p></div><p class="text-center no-padding visible-readonly"><br><span class="light"><i class="icon ion-help-circled" style="font-size: 16pt;"></i></span> <span class="stable" translate>MODE.READONLY.INSTALL_HELP</span></p><div class="text-center no-padding visible-xs stable"><br>{{:locale:\'COMMON.APP_VERSION\'|translate:{version: config.version} }} | <a href="#" ng-click="showAboutModal()" translate>HOME.BTN_ABOUT</a></div></div></div><div class="col no-padding" ng-class="{\'col-30\': !feed, \'col-10\': feed}">&nbsp;</div><div class="col col-30 no-padding" ng-if="feed"><div class="feed padding-horizontal no-padding-xs padding-top"><h3 class="padding-left"><i class="icon ion-speakerphone"></i> {{feed.title}} <small><a ng-click="openLink($event, feed.home_page_url)" class="gray"><span translate>HOME.SHOW_ALL_FEED</span> <i class="icon ion-chevron-right"></i></a></small></h3><div class="animate-show-hide ng-hide" ng-show="feed"><div ng-repeat="item in feed.items" class="card padding no-margin-xs"><div class="header"><i ng-if="item.author.avatar" class="avatar" style="background-image: url({{item.author.avatar}});"></i> <a ng-class="{\'avatar-left-padding\': item.author.avatar}" class="author" ng-click="item.author.url && openLink($event, item.author.url)">{{item.author.name}} </a><a ng-if="item.time" title="{{item.time|formatDate}}" ng-click="openLink($event, item.url)" class="item-note"><small><i class="icon ion-clock"></i>&nbsp;{{item.time|formatFromNow}}</small></a></div><h2 class="title feed-title"><a ng-click="openLink($event, item.url)">{{item.title}}</a></h2><div ng-if="item.content" class="content feed-content" trust-as-html="item.content"></div><h4 class="card-footer feed-footer text-right positive-100"><a ng-click="openLink($event, item.url)"><span ng-if="item.truncated" translate>HOME.READ_MORE</span> <span ng-if="!item.truncated" translate>COMMON.BTN_SHOW</span> <i class="icon ion-chevron-right"></i></a></h4></div></div></div></div></div></ion-content></ion-view>'),e.put("templates/join/modal_choose_account_type.html",'<ion-modal-view class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button> <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slides.slider.activeIndex"></button><h1 class="title" translate>ACCOUNT.NEW.TITLE</h1><button class="button button-clear icon-right visible-xs" ng-if="slides.slider.activeIndex === 0" ng-click="slideNext()"><span translate>COMMON.BTN_NEXT</span> <i class="icon ion-ios-arrow-right"></i></button></ion-header-bar><ion-slides options="slides.options" slider="slides.slider"><ion-slide-page><ion-content class="has-header padding"><div class="center padding" ng-if="loading"><ion-spinner class="icon" icon="android"></ion-spinner></div><div ng-if="!loading"><p ng-bind-html="\'ACCOUNT.NEW.INTRO_WARNING_TIME\'|translate:currency"></p><div class="row responsive-sm"><div class="col"><div class="item card item-icon-left padding item-text-wrap stable-bg"><i class="icon ion-android-warning assertive"></i><p class="item-content item-icon-left-padding"><span class="dark" translate>ACCOUNT.NEW.INTRO_WARNING_SECURITY</span><br><small translate>ACCOUNT.NEW.INTRO_WARNING_SECURITY_HELP</small></p></div></div><div class="col"><div class="item card item-icon-left padding item-text-wrap stable-bg"><i class="icon ion-information-circled positive"></i><p class="item-content item-icon-left-padding"><span class="dark" trust-as-html="\'ACCOUNT.NEW.REGISTRATION_NODE\'|translate:currency.node"></span><br><small trust-as-html="\'ACCOUNT.NEW.REGISTRATION_NODE_HELP\'|translate:currency.node"></small></p></div></div></div></div><p class="hidden-xs hidden-sm" ng-bind-html="\'ACCOUNT.NEW.INTRO_HELP\'|translate"></p><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive icon-right ion-chevron-right ink" ng-click="slideNext()" ng-disabled="loading" type="button" translate>COMMON.BTN_START</button></div></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header padding"><p translate>ACCOUNT.NEW.SELECT_ACCOUNT_TYPE</p><div class="list"><button class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="selectAccountTypeAndClose(\'wallet\')"><div class="item-content item-text-wrap"><i class="item-image icon dark ion-card"></i><h2 translate>ACCOUNT.NEW.WALLET_ACCOUNT</h2><h4 class="gray" translate>ACCOUNT.NEW.WALLET_ACCOUNT_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right"></i></ng-if></div></button> <button class="item item-complex card stable-100-bg item-icon-left item-icon-right ink" ng-click="selectAccountTypeAndClose(\'member\')"><div class="item-content item-text-wrap"><i class="item-image icon dark ion-person"></i><h2 translate>ACCOUNT.NEW.MEMBER_ACCOUNT</h2><h4 class="gray" ng-bind-html="\'ACCOUNT.NEW.MEMBER_ACCOUNT_HELP\'|translate:currency"></h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right"></i></ng-if></div></button><cs-extension-point name="select-account-type"></cs-extension-point></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>'),e.put("templates/join/modal_join_member.html",'<ion-modal-view class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button> <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="doPrev()" ng-if="slides.slider.activeIndex && slideBehavior.hasPreviousButton"></button> <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="slideBehavior.helpAnchor" ng-click="showHelpModal(slideBehavior.helpAnchor)"></button><h1 class="title" translate>ACCOUNT.NEW.MEMBER_ACCOUNT_TITLE</h1><button class="button button-clear icon-right visible-xs" ng-if="slideBehavior.hasNextButton" ng-click="doNext()"><span translate>COMMON.BTN_NEXT</span> <i class="icon ion-ios-arrow-right"></i></button> <button class="button button-clear icon-right visible-xs" ng-class="{\'button-text-stable\': !isLicenseRead}" ng-if="slideBehavior.hasAcceptButton" ng-click="isLicenseRead ? doNext() : undefined"><span translate>ACCOUNT.NEW.BTN_ACCEPT</span> <i class="icon ion-ios-arrow-right"></i></button> <button class="button button-clear icon-right visible-xs" ng-if="slideBehavior.hasSendButton" ng-click="doNewAccount()"><i class="icon ion-android-send"></i></button></ion-header-bar><ion-slides options="slides.options" slider="slides.slider"><ion-slide-page ng-if="licenseFileUrl"><ion-content class="has-header" scroll="false"><div class="padding" translate>ACCOUNT.NEW.INFO_LICENSE</div><div class="center padding" ng-if="loading"><ion-spinner class="icon" icon="android"></ion-spinner></div><iframe ng-if="!loading" class="padding-left padding-right no-padding-xs iframe-license" id="iframe-license" ng-src="{{licenseFileUrl}}"></iframe><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doNext(\'licenceForm\')" ng-disabled="!isLicenseRead" type="button" translate>ACCOUNT.NEW.BTN_ACCEPT_LICENSE</button></div></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="true"><form name="pseudoForm" novalidate="" ng-submit="doNext(\'pseudoForm\')"><div class="item item-text-wrap text-center padding"><a class="pull-right icon-help hidden-xs" ng-click="showHelpModal(\'join-pseudo\')"></a> <span translate>ACCOUNT.NEW.PSEUDO_WARNING</span></div><div class="list" ng-init="setForm(pseudoForm, \'pseudoForm\')"><div class="item item-input" ng-class="{\'item-input-error\': (pseudoForm.$submitted && pseudoForm.pseudo.$invalid) || (uiAlreadyUsed && formData.pseudo)}"><span class="input-label" translate>ACCOUNT.NEW.PSEUDO</span> <input id="pseudo" name="pseudo" type="text" placeholder="{{\'ACCOUNT.NEW.PSEUDO_HELP\' | translate}}" ng-model="formData.pseudo" autocomplete="off" ng-minlength="3" ng-maxlength="100" ng-pattern="userIdPattern" ng-model-options="{ debounce: 250 }" required></div><div class="form-errors" ng-show="pseudoForm.$submitted && pseudoForm.pseudo.$error" ng-messages="pseudoForm.pseudo.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span></div><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="pattern"><span translate="ERROR.INVALID_USER_ID"></span></div></div><div class="text-right" style="min-height: 18px;"><div class="form-error gray" ng-if="formData.computing && formData.pseudo"><ion-spinner class="icon ion-spinner-small" icon="android" ng-if="formData.computing && formData.pseudo"></ion-spinner><span translate>ACCOUNT.NEW.CHECKING_PSEUDO</span></div><ng-if ng-if="!formData.computing && formData.pseudo"><div class="form-error balanced" ng-if="!uiAlreadyUsed "><i class="icon ion-checkmark balanced"></i> <span translate>ACCOUNT.NEW.PSEUDO_AVAILABLE</span></div><div class="form-error" ng-if="uiAlreadyUsed"><i class="icon ion-close-circled assertive"></i> <span translate>ACCOUNT.NEW.PSEUDO_NOT_AVAILABLE</span></div></ng-if></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" ng-disabled="uiAlreadyUsed" translate>COMMON.BTN_NEXT</button></div></div></form></ion-content></ion-slide-page><ion-slide-page ng-if="!formData.pubkey"><ion-content class="has-header" scroll="true"><form name="saltForm" novalidate="" ng-submit="doNext(\'saltForm\')"><div class="list" ng-init="setForm(saltForm, \'saltForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><a class="pull-right icon-help" ng-click="showHelpModal(\'join-salt\')"></a> <span translate>ACCOUNT.NEW.SALT_WARNING</span></div><div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.username.$invalid}"><span class="input-label" translate>LOGIN.SALT</span> <input ng-if="!showUsername" name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" autocomplete="off" ng-minlength="8" different-to="formData.pseudo" required> <input ng-if="showUsername" name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" autocomplete="off" ng-minlength="8" different-to="formData.pseudo" required></div><div class="form-errors" ng-show="saltForm.$submitted && saltForm.username.$error" ng-messages="saltForm.username.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="differentTo"><span translate="ERROR.EQUALS_TO_PSEUDO"></span></div></div><div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.confirmSalt.$invalid}"><span class="input-label pull-right" translate>ACCOUNT.NEW.SALT_CONFIRM</span> <input ng-if="!showUsername" name="confirmUsername" type="password" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" autocomplete="off" compare-to="formData.username"> <input ng-if="showUsername" name="confirmUsername" type="text" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" autocomplete="off" compare-to="formData.username"></div><div class="form-errors" ng-show="saltForm.$submitted && saltForm.confirmUsername.$error" ng-messages="saltForm.confirmUsername.$error"><div class="form-error" ng-message="compareTo"><span translate="ERROR.SALT_NOT_CONFIRMED"></span></div></div><div class="item item-toggle dark"><span translate>COMMON.SHOW_VALUES</span> <label class="toggle toggle-royal"><input type="checkbox" ng-model="showUsername"><div class="track"><div class="handle"></div></div></label></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>COMMON.BTN_NEXT <i class="icon ion-arrow-right-a"></i></button></div></div></form></ion-content></ion-slide-page><ion-slide-page ng-if="!formData.pubkey"><ion-content class="has-header" scroll="true"><form name="passwordForm" novalidate="" ng-submit="doNext(\'passwordForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><a class="pull-right icon-help" ng-click="showHelpModal(\'join-password\')"></a> <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span></div><div class="list" ng-init="setForm(passwordForm, \'passwordForm\')"><div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.password.$invalid}"><span class="input-label" translate>LOGIN.PASSWORD</span> <input ng-if="!showPassword" name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" autocomplete="off" ng-change="formDataChanged()" ng-minlength="8" different-to="formData.username" required> <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" autocomplete="off" ng-change="formDataChanged()" ng-minlength="8" different-to="formData.username" required></div><div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.password.$error" ng-messages="passwordForm.password.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="differentTo"><span translate="ERROR.EQUALS_TO_SALT"></span></div></div><div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}"><span class="input-label" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span> <input ng-if="!showPassword" name="confirmPassword" type="password" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" autocomplete="off" compare-to="formData.password"> <input ng-if="showPassword" name="confirmPassword" type="text" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" autocomplete="off" compare-to="formData.password"></div><div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.confirmPassword.$error" ng-messages="passwordForm.confirmPassword.$error"><div class="form-error" ng-message="compareTo"><span translate="ERROR.PASSWORD_NOT_CONFIRMED"></span></div></div><div class="item item-toggle dark"><span translate>COMMON.SHOW_VALUES</span> <label class="toggle toggle-royal"><input type="checkbox" ng-model="showPassword"><div class="track"><div class="handle"></div></div></label></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" ng-click="getRevocationDocument()" translate>COMMON.BTN_NEXT</button></div><div class="padding hidden-xs"></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="true"><div class="center padding" ng-if="formData.computing"><ion-spinner icon="android"></ion-spinner></div><ng-if ng-if="!formData.computing"><div class="animate-fade-in animate-show-hide ng-hide" ng-show="accountAvailable"><div class="padding text-center" translate>ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION</div><div class="list"><ion-item class="item text-center item-text-wrap"><h3 class="gray" translate>LOGIN.ASSOCIATED_PUBKEY</h3><h3 class="dark bold">{{formData.pubkey}}</h3></ion-item></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" ng-click="doNewAccount()" translate>COMMON.BTN_SEND <i class="icon ion-android-send"></i></button></div></div><div class="animate-fade-in animate-show-hide ng-hide" ng-show="!accountAvailable"><ion-item class="item-icon-left item-text-wrap text-center"><i class="icon ion-minus-circled assertive"></i> <span id="modal-license" trust-as-html="\'ERROR.EXISTING_ACCOUNT\'|translate"></span></ion-item><div class="list"><ion-item class="item item-text-wrap item-border"><div class="padding text-center"><span class="gray text-no-wrap">{{formData.pubkey}}</span></div></ion-item><div class="padding text-center"><span translate>ERROR.EXISTING_ACCOUNT_REQUEST</span></div></div><div class="padding hidden-xs text-left"><button class="button button-assertive icon-left ion-chevron-left ink" ng-click="identifierRecovery()" translate>COMMON.BTN_MODIFY</button></div></div></ng-if></ion-content></ion-slide-page></ion-slides></ion-modal-view>'),e.put("templates/join/modal_join_wallet.html",'<ion-modal-view class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button> <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slideBehavior.hasPreviousButton"></button> <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="slideBehavior.helpAnchor" ng-click="showHelpModal(slideBehavior.helpAnchor)"></button><h1 class="title" translate>ACCOUNT.NEW.WALLET_ACCOUNT_TITLE</h1><button class="button button-clear icon-right visible-xs" ng-if="slideBehavior.hasNextButton" ng-click="doNext()"><span translate>COMMON.BTN_NEXT</span> <i class="icon ion-ios-arrow-right"></i></button> <button class="button button-clear icon-right visible-xs" ng-if="slideBehavior.hasSendButton" ng-click="doNewAccount()"><i class="icon ion-android-send"></i></button></ion-header-bar><ion-slides options="slides.options" slider="slides.slider"><ion-slide-page><ion-content class="has-header" scroll="false"><form name="saltForm" novalidate="" ng-submit="doNext(\'saltForm\')"><div class="list" ng-init="setForm(saltForm, \'saltForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><a class="pull-right icon-help" ng-click="showHelpModal(\'join-salt\')"></a> <span translate>ACCOUNT.NEW.SALT_WARNING</span></div><div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.username.$invalid}"><span class="input-label" translate>LOGIN.SALT</span> <input ng-if="!showUsername" name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required> <input ng-if="showUsername" name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required></div><div class="form-errors" ng-show="saltForm.$submitted && saltForm.username.$error" ng-messages="saltForm.username.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.confirmSalt.$invalid}"><span class="input-label pull-right" translate>ACCOUNT.NEW.SALT_CONFIRM</span> <input ng-if="!showUsername" name="confirmUsername" type="password" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username"> <input ng-if="showUsername" name="confirmUsername" type="text" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username"></div><div class="form-errors" ng-show="saltForm.$submitted && saltForm.confirmUsername.$error" ng-messages="saltForm.confirmUsername.$error"><div class="form-error" ng-message="compareTo"><span translate="ERROR.SALT_NOT_CONFIRMED"></span></div></div><div class="item item-toggle dark"><span translate>COMMON.SHOW_VALUES</span> <label class="toggle toggle-royal"><input type="checkbox" ng-model="showUsername"><div class="track"><div class="handle"></div></div></label></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>COMMON.BTN_NEXT <i class="icon ion-arrow-right-a"></i></button></div></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="false"><form name="passwordForm" novalidate="" ng-submit="doNext(\'passwordForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><a class="pull-right icon-help" ng-click="showHelpModal(\'join-password\')"></a> <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span></div><div class="list" ng-init="setForm(passwordForm, \'passwordForm\')"><div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.password.$invalid}"><span class="input-label" translate>LOGIN.PASSWORD</span> <input ng-if="!showPassword" name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required> <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required></div><div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.password.$error" ng-messages="passwordForm.password.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}"><span class="input-label" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span> <input ng-if="!showPassword" name="confirmPassword" type="password" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password"> <input ng-if="showPassword" name="confirmPassword" type="text" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password"></div><div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.confirmPassword.$error" ng-messages="passwordForm.confirmPassword.$error"><div class="form-error" ng-message="compareTo"><span translate="ERROR.PASSWORD_NOT_CONFIRMED"></span></div></div><div class="item item-toggle dark"><span translate>COMMON.SHOW_VALUES</span> <label class="toggle toggle-royal"><input type="checkbox" ng-model="showPassword"><div class="track"><div class="handle"></div></div></label></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>COMMON.BTN_NEXT</button></div><div class="padding hidden-xs"></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="false"><div class="padding center" ng-if="formData.computing"><ion-spinner icon="android"></ion-spinner></div><div ng-if="accountAvailable && !formData.computing"><div class="padding text-center" translate>ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION</div><div class="list"><ion-item class="item item-text-wrap item-border"><div class="dark pull-right padding-right" ng-if="formData.computing"><ion-spinner icon="android"></ion-spinner></div><span class="input-label" translate>COMMON.PUBKEY</span> <span class="gray text-no-wrap" ng-if="formData.computing" translate>ACCOUNT.NEW.COMPUTING_PUBKEY </span><span class="gray text-no-wrap" ng-if="formData.pubkey">{{formData.pubkey}}</span></ion-item></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" ng-click="doNewAccount()" translate>COMMON.BTN_CREATE</button></div></div><div ng-if="!accountAvailable && !formData.computing"><ion-item class="item-icon-left item-text-wrap text-center"><i class="icon ion-android-close active"></i> <span id="modal-license" translate>ERROR.EXISTING_ACCOUNT</span></ion-item><div class="list"><ion-item class="item item-text-wrap item-border"><div class="dark pull-right padding-right" ng-if="formData.computing"><ion-spinner icon="android"></ion-spinner></div><span class="gray text-no-wrap" ng-if="formData.computing" translate>ACCOUNT.NEW.COMPUTING_PUBKEY</span><div class="padding text-center"><span class="gray text-no-wrap" ng-if="formData.pubkey">{{formData.pubkey}}</span></div></ion-item><div class="padding text-center"><span translate>ERROR.EXISTING_ACCOUNT_REQUEST</span></div></div><div class="padding hidden-xs text-left"><button class="button button-assertive icon-left ion-chevron-left ink" ng-click="identifierRecovery()" translate>COMMON.BTN_MODIFY</button></div></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>'),e.put("templates/login/form_file_import.html",'<div class="item"><p class="item-text-wrap" translate>LOGIN.FILE_FORM_HELP</p></div><div class="item item-icon-left item-text-wrap"><i class="icon ion-ios-information-outline positive"></i> <span class="positive" translate>LOGIN.FILE.HELP</span></div><div drop-zone="onFileChanged(file)"><div ng-if="!formData.file" file-select="onFileChanged(file)" accept=".dunikey,.yml"><h2 class="gray" translate>COMMON.CHOOSE_FILE</h2></div><div class="item item-icon-left item-icon-right stable-bg" ng-if="formData.file"><i class="icon ion-document-text dark"></i><div class="item-content row"><div class="col"><h2>{{formData.file.name}}</h2><h4 class="dark" ng-if="formData.file.lastModified"><span class="gray" translate>COMMON.FILE.DATE</span> {{formData.file.lastModified/1000|formatDate}}</h4><h5 class="dark"><span class="gray" translate>COMMON.FILE.SIZE</span> {{formData.file.size|formatInteger}} Ko</h5></div><div class="col"><h3><span class="gray" translate>COMMON.PUBKEY</span></h3><h3 ng-if="validatingFile" translate>COMMON.FILE.VALIDATING</h3><h3 ng-if="!validatingFile"><span class="dark animate-show-hide ng-hide" ng-show="formData.file.pubkey">{{formData.file.pubkey}}</span> <span class="assertive animate-show-hide ng-hide" ng-show="!formData.file.valid"><br><i class="ion-close-circled assertive"></i> {{formData.file.pubkey ? \'ERROR.AUTH_INVALID_PUBKEY\' : \'ERROR.AUTH_INVALID_FILE\' |translate}}</span></h3></div></div><a class="ion-close-round gray pull-right" style="font-size: 10px; position: absolute; top: 6px; right: 6px;" ng-click="removeKeyFile()"></a></div></div><ion-checkbox ng-model="formData.keepAuth" class="item ink item-text-wrap"><div class="item-content dark" translate>LOGIN.MEMORIZE_AUTH_FILE</div></ion-checkbox>'),e.put("templates/login/form_login.html",'<form name="loginForm" novalidate="" ng-submit="doLogin()" autocomplete="off"><div class="list padding no-padding-xs" ng-init="setForm(loginForm)" ng-switch on="formData.method"><div class="item hidden-xs no-padding" ng-if="showMethods"><div class="pull-right"><a class="button button-text button-small-padding icon-right ink" ng-click="showMethodsPopover($event)"><i class="icon ion-wrench"></i> {{\'LOGIN.BTN_METHODS\'| translate}} </a>&nbsp; <a class="button button-icon positive button-small-padding icon ion-ios-help-outline" style="right: 8px;" ng-click="showHelpModal(\'login-method\')"></a></div></div><div class="item item-text-wrap" ng-if="::isAuth"><p ng-if="::expectedPubkey" ng-bind-html="::expectedUid ? \'AUTH.EXPECTED_UID_HELP\' : \'AUTH.EXPECTED_PUBKEY_HELP\' |translate: {uid: expectedUid, pubkey: expectedPubkey}"></p><p ng-if="::!expectedPubkey" ng-bind-html="::\'AUTH.GENERAL_HELP\'|translate"></p></div><div ng-switch-when="SCRYPT_DEFAULT"><ng-include src="::\'templates/login/form_scrypt.html\'"></ng-include></div><div ng-switch-when="SCRYPT_ADVANCED"><ng-include src="::\'templates/login/form_scrypt_advanced.html\'"></ng-include></div><div ng-switch-when="PUBKEY"><ng-include src="::\'templates/login/form_pubkey.html\'"></ng-include></div><div ng-switch-when="FILE"><ng-include src="::\'templates/login/form_file_import.html\'"></ng-include></div><div ng-switch-when="SCAN"><ng-include src="::\'templates/login/form_scan.html\'"></ng-include></div><div ng-switch-default><ng-include src="::\'templates/login/form_scrypt.html\'"></ng-include></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" ng-class="{\'button-assertive\': isAuth, \'button-positive\': !isAuth}" type="submit">{{okText || (isAuth ? \'AUTH.BTN_AUTH\' : \'COMMON.BTN_LOGIN\') | translate}}</button></div><div class="text-center no-padding visible-xs"><button type="button" class="button button-small icon-right ink" ng-click="showMethodsPopover($event)"><i class="icon ion-loop"></i> <span translate>LOGIN.BTN_METHODS_DOTS</span></button><br><br></div><ng-if ng-if="!isAuth && showNewAccountLink"><div class="text-center no-padding">{{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}<br class="visible-xs"><a ng-click="showJoinModal()" translate>LOGIN.CREATE_ACCOUNT</a></div><br class="visible-xs"><div class="text-center no-padding"><a ng-click="showAccountSecurityModal()" translate>LOGIN.FORGOTTEN_ID</a></div></ng-if></form>'),e.put("templates/login/form_pubkey.html",'<div class="item"><p class="item-text-wrap" translate>LOGIN.PUBKEY_FORM_HELP</p></div><div class="item item-input item-button-right" ng-class="{ \'item-input-error\': form.$submitted && form.pubkey.$invalid}"><span class="input-label hidden-xs" translate>COMMON.PUBKEY</span> <input name="pubkey" type="text" placeholder="{{\'LOGIN.PUBKEY_HELP\' | translate}}" autocomplete="off" ng-model="formData.pubkey" ng-model-options="{ debounce: 650 }" required> <a class="button button-stable icon ion-android-search ink" ng-click="showWotLookupModal(form.pubkey.$viewValue)"></a></div><div class="form-errors" ng-show="form.$submitted && form.pubkey.$error" ng-messages="form.pubkey.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="checksum"><span translate="ERROR.INVALID_PUBKEY_CHECKSUM"></span></div></div>'),e.put("templates/login/form_scan.html",'<div class="item"><p class="item-text-wrap" ng-bind-html="::isAuth ? \'AUTH.SCAN_FORM_HELP\' : \'LOGIN.SCAN_FORM_HELP\' |translate"></p></div><div class="item item-icon-right item-text-wrap item-input" ng-class="{ \'item-input-error\': pubkeyError}"><span class="input-label" translate>COMMON.PUBKEY</span><div class="item-content text-wrap"><span class="gray animate-show-hide" ng-show="!computing && formData.pubkey">{{formData.pubkey}}</span><ion-spinner class="ion-spinner-small" icon="android" ng-if="computing"></ion-spinner><input type="hidden" ng-model="formData.pubkey" required></div><a class="button button-icon positive button-small-padding icon ion-qr-scanner animate-show-hide" ng-show="!computing && (!expectedPubkey || pubkeyError)" ng-click="doScan()"></a> <span class="button button-icon balanced button-small-padding icon ion-checkmark animate-show-hide" ng-if="expectedPubkey" ng-show="!computing && !pubkeyError"></span></div><div class="form-errors" ng-if="expectedPubkey"><div class="form-error" ng-show="pubkeyError"><span trust-as-html="::\'ERROR.AUTH_INVALID_PUBKEY\'|translate:{pubkey: expectedPubkey}"></span></div></div>'),e.put("templates/login/form_scrypt_advanced.html",'<div class="row responsive-md responsive-sm padding-left"><div class="col col-33 no-padding"><label class="item item-input item-select"><select ng-model="formData.scrypt" style="max-width: 100%" ng-change="changeScrypt(formData.scrypt)" ng-options="l as (l.label | translate) for l in scryptParamsValues track by l.id"></select></label></div><div class="col no-padding"><label class="item item-input"><span class="input-label" translate>LOGIN.SCRYPT.N</span> <input class="no-padding-right" type="number" placeholder="N" autocomplete="off" ng-model="formData.scrypt.params.N" ng-model-options="{ debounce: 650 }" ng-change="onScryptFormChanged()" required></label></div><div class="col no-padding"><label class="item item-input"><span class="input-label" translate>LOGIN.SCRYPT.r</span> <input class="no-padding-right" type="number" placeholder="r" ng-model="formData.scrypt.params.r" autocomplete="off" ng-model-options="{ debounce: 650 }" ng-change="onScryptFormChanged()" required></label></div><div class="col no-padding"><label class="item item-input"><span class="input-label" translate>LOGIN.SCRYPT.p</span> <input class="no-padding-right" type="number" placeholder="p" autocomplete="off" ng-model="formData.scrypt.params.p" ng-model-options="{ debounce: 650 }" ng-change="onScryptFormChanged()" required></label></div></div><p class="energized-100-bg padding dark"><i class="icon ion-android-warning"></i> <span translate>INFO.FEATURES_NOT_IMPLEMENTED</span></p><ng-include src="::\'templates/login/form_scrypt.html\'"></ng-include>'),e.put("templates/login/form_scrypt.html",'<div class="item item-text-wrap" ng-if="!isAuth"><p ng-bind-html="\'LOGIN.SCRYPT_FORM_HELP\'|translate"></p></div><input type="password" name="fake-password" autocomplete="off" style="visibility:hidden; position:absolute;"> <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}"><span class="input-label hidden-xs" translate>LOGIN.SALT</span> <input name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" required></label><div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}"><span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span> <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" autocomplete="off" ng-model="formData.password" ng-model-options="{ debounce: 650 }" select-on-click required></label><div class="form-errors" ng-show="form.$submitted && form.password.$error" ng-messages="form.password.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-icon-right item-text-wrap" ng-class="{ \'item-input-error\': pubkeyError, \'item-input\': showPubkey}"><span class="input-label hidden-xs animate-show-hide ng-hide" ng-show="showPubkey" translate>COMMON.PUBKEY</span><div class="item-content text-wrap"><a class="positive ink animate-show-hide ng-hide" ng-show="showComputePubkeyButton && !pubkey" ng-click="computePubkey()"><i class="ion-eye"></i> {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}} </a><span class="gray animate-show-hide" ng-show="!computing && pubkey">{{pubkey}}</span><ion-spinner class="ion-spinner-small" icon="android" ng-if="computing"></ion-spinner></div><a class="button button-icon positive button-small-padding icon ion-ios-help-outline animate-show-hide" ng-click="showHelpModal(\'login-pubkey\')" ng-if="!expectedPubkey" ng-show="showPubkey"></a> <span class="button button-icon balanced button-small-padding icon ion-checkmark animate-show-hide" ng-if="expectedPubkey" ng-show="showPubkey && !showComputePubkeyButton && !computing && !pubkeyError"></span></div><div class="form-errors" ng-if="expectedPubkey"><div class="form-error" ng-show="pubkeyError"><span trust-as-html="::\'ERROR.AUTH_INVALID_PUBKEY\'|translate:{pubkey: expectedPubkey}"></span></div></div>'),e.put("templates/login/item_remember_me.html",'<ion-checkbox ng-model="formData.rememberMe" ng-if="!isAuth" class="item ink item-text-wrap"><div class="item-content dark" translate>SETTINGS.REMEMBER_ME</div></ion-checkbox>'),e.put("templates/login/modal_login.html",'<ion-modal-view class="modal-full-height modal-login"><ion-header-bar class="" ng-class="{\'bar-positive\': !isAuth, \'bar-assertive\': isAuth}"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" ng-bind-html="title | translate"></h1><div class="buttons buttons-right"><div class="secondary-buttons"><button class="button button-icon button-clear icon ion-android-done visible-xs" ng-class="{\'button-positive\': !isAuth}" style="color: #fff;" ng-click="doLogin()"></button></div></div></ion-header-bar><ion-content scroll="true"><ng-include src="::\'templates/login/form_login.html\'"></ng-include></ion-content></ion-modal-view>'),e.put("templates/login/popover_methods.html",'<ion-popover-view class="fit has-header popover-login-methods" ng-class="{\'auth\': isAuth}"><ion-header-bar><h1 class="title" translate>LOGIN.METHOD_POPOVER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="changeMethod(\'SCRYPT_DEFAULT\')"><i class="icon ion-shuffle" style="font-size: 22px;"></i> {{\'LOGIN.METHOD.SCRYPT_DEFAULT\' | translate}} </a><a class="item item-icon-left ink" ng-click="changeMethod(\'SCRYPT_ADVANCED\')"><i class="icon ion-shuffle" style="font-size: 22px;"></i> <i class="icon-secondary ion-plus" style="font-size: 13px; left: 40px; margin-top: -4px;"></i> {{\'LOGIN.METHOD.SCRYPT_ADVANCED\' | translate}} </a><a class="item item-icon-left ink hidden-xs" ng-click="changeMethod(\'FILE\')"><i class="icon ion-document-text"></i> {{\'LOGIN.METHOD.FILE\' | translate}}</a><div ng-if="!isAuth" class="item-divider hidden-xs hidden-sm"></div><a class="item item-icon-left ink" ng-if="$root.device.barcode.enable" ng-click="changeMethod(\'SCAN\')"><i class="icon ion-qr-scanner"></i> {{\'LOGIN.METHOD.SCAN\' | translate}} </a><a class="item item-icon-left ink" ng-if="!isAuth" ng-click="changeMethod(\'PUBKEY\')"><i class="icon ion-key"></i> {{\'LOGIN.METHOD.PUBKEY\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/menu.html",'<ion-side-menus enable-menu-with-back-views="true" bind-notifier="{locale: $root.settings.locale.id, peer: $root.currency.node.url}"><ion-side-menu-content><ion-nav-bar class="bar-dark" title-align="left"><ion-nav-back-button class="no-text"></ion-nav-back-button><ion-nav-buttons side="left"><button class="button button-clear visible-nomenu" menu-toggle="left"><i class="icon ion-navicon"></i></button></ion-nav-buttons><ion-nav-buttons side="right"><button class="button button-clear button-peer hidden-xs hidden-sm gray" ng-if="$root.config.readonly || $root.settings.expertMode" style="max-width: 450px !important;" ng-click="showPeerInfoPopover($event)"><span style="display: inline-flex;"><small class="ion-locked" ng-if=":peer:$root.currency.node.useSsl">&nbsp;</small> {{:peer:$root.currency.node.host}}{{:peer:$root.currency.node.port != 80 && $root.currency.node.port != 443 ? \':\'+$root.currency.node.port : \'\'}} <small>&nbsp;</small> <small class="ion-arrow-down-b"></small></span></button><cs-extension-point name="nav-buttons-right"></cs-extension-point><a id="helptip-header-bar-btn-profile" class="button button-icon button-clear hidden-xs hidden-sm" ng-if="::!$root.config.readonly" ng-click="showProfilePopover($event)"><i class="avatar avatar-member" ng-if="!walletData.avatar" ng-class="{\'disable\': !login, \'royal-bg\': login}"></i> <i class="avatar" ng-if="walletData.avatar" style="background-image: url(\'{{walletData.avatar.src}}\')"></i> <span ng-if="login && !auth" class="badge badge-button badge-secondary badge-assertive ion-locked"></span></a></ion-nav-buttons></ion-nav-bar><ion-nav-view name="menuContent"></ion-nav-view></ion-side-menu-content><ion-side-menu id="menu" side="left" expose-aside-when="large" enable-menu-with-back-views="false" width="225"><ion-header-bar class="bar-title"><h1 class="title dark hidden-sm hidden-xs"><span class="animate-fade-in animate-show-hide ng-hide" ng-show="$root.currency.name">{{:locale:\'COMMON.APP_NAME\'|translate}} {{$root.currency.name|abbreviate}} </span><a class="badge badge-assertive badge-app-mode left visible-demo" ng-click="showHelpModal(\'demo\')">{{:locale:\'MODE.DEMO.BADGE\'|translate}}</a> <a class="badge badge-balanced badge-app-mode right visible-readonly" ng-click="showHelpModal(\'readonly\')">{{:locale:\'MODE.READONLY.BADGE\'|translate}}</a></h1><div class="visible-sm visible-xs hero"><div class="content"><i class="avatar avatar-member hero-icon" ng-if="!walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}" ng-click="!login ? showHome() : loginAndGo()" menu-close></i> <a class="avatar hero-icon" ng-if="walletData.avatar" style="background-image: url(\'{{walletData.avatar.src}}\')" ui-sref="app.view_wallet" menu-close></a><h4 ng-if="login"><a class="light" ui-sref="app.view_wallet" menu-close>{{walletData.name||walletData.uid}} <span ng-if="!walletData.name && !walletData.uid"><i class="icon ion-key"></i>&nbsp;{{walletData.pubkey|formatPubkey}}</span></a></h4><h4 ng-if="!login"><a class="light" ui-sref="app.login" menu-close>{{\'COMMON.BTN_LOGIN\'|translate}} <i class="ion-arrow-right-b"></i></a></h4><cs-extension-point name="menu-profile-user"></cs-extension-point></div><a ng-if="::$root.device.isWeb()" ng-click="toggleFullscreen()" class="button-icon" style="position: absolute; top: 5px; right: 5px; z-index: 999;"><i class="icon ion-arrow-expand dark" ng-class="{\'ion-arrow-shrink\': fullscreen}"></i></a></div></ion-header-bar><ion-content scroll="false" class="scroll-content ionic-scroll" ng-class="{\'overflow-scroll\': smallscreen, \'scroll-content-false\': !smallscreen}"><ion-list class="list" ng-class="{\'scroll\': smallscreen}"><ion-item menu-close class="item item-actions item-button-right visible-xs visible-sm hidden-readonly" ng-if="login" ng-class="::{\'item-button-left\': $root.device.barcode.enable}"><button class="button button-positive ink-dark" ng-click="showTransferModal()"><i class="icon ion-paper-airplane"></i></button> <button class="button button-stable ink" ng-if="$root.device.barcode.enable" ng-click="scanQrCodeAndGo()"><i class="icon ion-qr-scanner"></i></button></ion-item><ion-item menu-close class="item-icon-left hidden-xs" ui-sref="app.home" active-link="active"><i class="icon ion-home"></i> {{:locale:\'MENU.HOME\'|translate}}</ion-item><ion-item menu-close class="item-icon-left visible-xs" ui-sref="app.home" active-link="active"><i class="icon ion-home"></i> {{:locale:\'MENU.HOME\'|translate}}</ion-item><div class="item item-divider hidden-readonly"></div><a menu-close class="item item-icon-left hidden-readonly" active-link="active" active-link-path-prefix="#/app/account" ui-sref="app.view_wallet" ng-class="{\'item-menu-disable\': !login}"><i class="icon ion-person"></i> {{:locale:\'MENU.ACCOUNT\'|translate}} </a><a id="helptip-menu-btn-account"></a> <a menu-close class="item item-icon-left hidden-readonly" active-link="active" active-link-path-prefix="#/app/history" ui-sref="app.view_wallet_tx" ng-class="{\'item-menu-disable\': !login}"><i class="icon ion-clock" style="top: calc(100%/4); left: 25px; font-size: 10pt; display: block;"></i> <b class="icon-secondary ion-card" style="top: calc(100%/2.5); left: 19px; font-size: 17pt; background-color: whitesmoke; width:17px; height: 14px;"></b> {{:locale:\'MENU.TRANSACTIONS\'|translate}} </a><a id="helptip-menu-btn-tx"></a> <a menu-close class="item item-icon-left hidden-readonly" active-link="active" active-link-path-prefix="#/app/wallets" ui-sref="app.view_wallets" ng-class="{\'item-menu-disable\': !login}"><i class="icon ion-card" style="top: calc(100%/5); left: 22px; font-size: 16pt; display: block;"></i> <i class="icon-secondary ion-card" style="top: 20px; left: 19px; font-size: 16pt; background-color: whitesmoke; width:17px; height: 14px;"></i> {{:locale:\'MENU.WALLETS\'|translate}} </a><a id="helptip-menu-btn-wallets"></a><div class="item item-divider visible-xs visible-sm hidden-readonly"></div><cs-extension-point name="menu-user"></cs-extension-point><ion-item class="item hidden-xs hidden-sm hidden-readonly"><button class="button button-block button-small button-small-padding icon-left icon ion-paper-airplane no-margin" ng-class="{\'button-positive\': login, \'button-stable\': !login}" ng-click="showTransferModal()">{{:locale:\'COMMON.BTN_SEND_MONEY\'|translate}}</button></ion-item><div class="item-spacer hidden-readonly"></div><div class="item item-divider hidden-readonly"></div><a class="item item-icon-left item-closeable hidden-xs hidden-sm" ng-show="$root.settings.helptip.enable" title="{{:locale:\'SETTINGS.DISABLE_HELPTIP\'|translate}}" ng-click="startHelpTour($event)"><i class="icon ion-easel"></i> {{:locale:\'COMMON.BTN_HELP_TOUR\'|translate}} <span class="close" ng-click="disableHelpTour($event)"></span> </a><a menu-close class="item item-icon-left" id="helptip-menu-btn-wot" active-link="active" active-link-path-prefix="#/app/wot" ui-sref="app.wot_lookup.tab_search"><i class="icon ion-person-stalker"></i> {{:locale:\'MENU.WOT\'|translate}}</a><cs-extension-point name="menu-main"></cs-extension-point><a menu-close class="item item-icon-left" id="helptip-menu-btn-currency" active-link="active" active-link-path-prefix="#/app/currency" ui-sref="app.currency"><i class="icon ion-ios-world-outline"></i> {{:locale:\'MENU.CURRENCY\'|translate}} </a><a menu-close class="item item-icon-left hidden-xs hidden-sm" id="helptip-menu-btn-network" active-link="active" active-link-path-prefix="#/app/network" ui-sref="app.network"><i class="icon ion-cloud"></i> {{:locale:\'MENU.NETWORK\'|translate}}</a><cs-extension-point name="menu-discover"></cs-extension-point><div class="item-spacer visible-readonly"></div><div class="item item-divider visible-xs visible-sm"></div><a menu-close class="item item-icon-left visible-xs visible-sm" active-link="active" active-link-path-prefix="#/app/help" ui-sref="app.help"><i class="icon ion-ios-help-outline"></i> {{:locale:\'HOME.BTN_HELP\'|translate}} </a><a menu-close class="item item-icon-left visible-xs visible-sm visible-readonly" active-link="active" id="menu-btn-settings" active-link-path-prefix="#/app/settings" ui-sref="app.settings"><i class="icon ion-android-settings"></i> {{:locale:\'MENU.SETTINGS\'|translate}} </a><a id="helptip-menu-btn-settings"></a><div class="item item-divider visible-xs visible-sm margin-top" ng-if="login"></div><a menu-close ng-if="login" class="item item-icon-left visible-xs visible-sm" ng-click="logout({askConfirm: true})"><i class="icon ion-log-out assertive"></i> <span class="assertive" translate>{{:locale:\'COMMON.BTN_LOGOUT\'|translate}}</span></a></ion-list></ion-content><ion-footer-bar class="bar-stable footer hidden-xs hidden-sm"><a class="pull-left icon-help" menu-toggle="left" title="{{:locale:\'HOME.BTN_HELP\'|translate}}" ui-sref="app.help"></a> <a class="title gray" ng-click="showAboutModal()"><span title="{{:locale:\'HOME.BTN_ABOUT\'|translate}}" ng-class="{\'assertive\': $root.newRelease}"><i ng-if="$root.newRelease" class="ion-alert-circled assertive"></i> {{:locale:\'COMMON.APP_VERSION\'|translate:{version: config.version} }} </span>| <span title="{{:locale:\'HOME.BTN_ABOUT\'|translate}}">{{:locale:\'HOME.BTN_ABOUT\'|translate}}</span></a></ion-footer-bar></ion-side-menu></ion-side-menus>'),e.put("templates/modal_about.html",'<ion-modal-view class="about"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CLOSE</button><h1 class="title" translate>ABOUT.TITLE</h1></ion-header-bar><ion-content class="text-center" scroll="true"><div class="list item-wrap-text"><ion-item class="item-icon-left item-text-wrap"><span>{{\'COMMON.APP_NAME\'|translate}}&nbsp;<b>{{\'COMMON.APP_VERSION\'|translate:$root.config}}</b> - <a ng-click="openLink($event, \'http://cesium.app\')">www.cesium.app</a></span> <i ng-if="$root.newRelease" class="assertive ion-alert-circled"></i><h3 ng-if="buildDate" class="gray">{{\'COMMON.APP_BUILD\'|translate:{build: buildDate} }}</h3><span translate>ABOUT.LICENSE</span></ion-item><ion-item class="item-icon-left" ng-if="$root.newRelease"><i class="item-image icon ion-alert-circled assertive"></i> <span ng-if="!$root.device.isWeb()" ng-bind-html="\'ABOUT.PLEASE_UPDATE\' | translate:$root.newRelease "></span> <span ng-if="$root.device.isWeb()" ng-bind-html="\'ABOUT.LATEST_RELEASE\' | translate:$root.newRelease "></span><h3 ng-if="!$root.device.enable"><a ng-click="openLink($event, $root.newRelease.url)" translate>{{::$root.newRelease.url}}</a></h3></ion-item><ion-item class="item-icon-left item-text-wrap"><i class="item-image icon ion-android-laptop"></i> <span translate>ABOUT.OFFICIAL_WEB_SITE</span><h3><a ng-click="openLink($event, \'https://www.cesium.app\')">https://www.cesium.app</a></h3></ion-item><ion-item class="item-icon-left"><i class="item-image icon ion-chatbubbles"></i> {{\'ABOUT.FORUM\' | translate}}<h3><a ng-click="openLink($event, $root.settings.userForumUrl)">{{::$root.settings.userForumUrl}}</a></h3></ion-item><ion-item class="item-icon-left item-text-wrap"><i class="item-image icon ion-bug"></i> <span translate>ABOUT.PLEASE_REPORT_ISSUE</span><h3><a ng-click="openLink($event, $root.settings.newIssueUrl)" translate>ABOUT.REPORT_ISSUE</a></h3></ion-item><ion-item class="item-icon-left"><i class="item-image icon ion-network"></i> {{\'ABOUT.CODE\' | translate}}<h3><a ng-click="openLink($event, $root.settings.sourceUrl)">{{$root.settings.sourceUrl}}</a></h3></ion-item><ion-item class="item-icon-left"><i class="item-image icon ion-person-stalker"></i> {{\'ABOUT.DEVELOPERS\' | translate}}<h3><a href="https://github.com/blavenie" target="_system">Benoit Lavenier</a>, <a href="https://github.com/bpresles" target="_system">bpresles</a>, <a href="https://github.com/c-geek" target="_system">cgeek</a>, <a href="https://github.com/devingfx" target="_system">DiG</a>, <a href="https://git.duniter.org/ji_emme" target="_system">Ji_emme</a></h3></ion-item><div class="padding hidden-xs text-center"><button class="button button-stable icon-left ink" type="submit" ng-click="closeModal()" ui-sref="app.help"><i class="icon ion-ios-help-outline"></i> {{\'HOME.BTN_HELP\' | translate}}</button> <button class="button button-positive ink" type="submit" ng-click="closeModal()">{{\'COMMON.BTN_CLOSE\' | translate}}</button></div></div></ion-content></ion-modal-view>'),e.put("templates/network/item_content_peer.html",'<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> <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> <i class="avatar" ng-if="::peer.avatar" style="background-image: url(\'{{::peer.avatar.src}}\')"></i> <b class="icon-secondary assertive ion-close-circled" ng-if=":rebind:!peer.online" style="left: 37px; top: -10px;"></b><div class="row no-padding"><div class="col no-padding"><h3 class="dark" ng-if=":rebind:!peer.bma.private">{{:rebind:peer.dns || peer.server}}</h3><h4 class="gray" ng-if=":rebind:peer.bma.private"><i class="ion-flash"></i> {{:locale:\'NETWORK.VIEW.PRIVATE_ACCESS\'|translate}}</h4><h4><span class="gray" ng-if=":rebind:!peer.uid"><i class="ion-key"></i> {{:rebind:peer.pubkey|formatPubkey}} </span><span class="positive" ng-if=":rebind:peer.uid"><i class="ion-person"></i> {{:rebind:peer.name || peer.uid}} </span><span class="gray" ng-if=":rebind:!compactMode">{{:rebind:peer.dns && (\' | \' + peer.server) + (peer.bma.path||\'\') }}</span></h4></div><div class="col col-15 no-padding text-center hidden-xs hidden-sm" ng-if="::expertMode"><div style="min-width: 50px; padding-top: 5px;" ng-if=":rebind:!compactMode"><span ng-if=":rebind:peer.isSsl()" title="SSL"><i class="ion-locked"></i><small class="hidden-md"> SSL</small> </span><span ng-if=":rebind:peer.isBma()" title="BMA"><i class="ion-cloud"></i><small class="hidden-md"> BMA</small> </span><span ng-if=":rebind:peer.isWs2p()" ng-click="showWs2pPopover($event, peer)" title="WS2P"><i class="ion-arrow-swap"></i><small class="hidden-md"> WS2P</small></span></div><div ng-if=":rebind:!peer.isWs2p()&&peer.hasEndpoint(\'ES_USER_API\')" ng-click="showEndpointsPopover($event, peer, \'ES_USER_API\')" title="Cesium+"><i class="ion-es-user-api"></i> <b class="ion-plus dark" style="position: relative; left: -14px; top:-17px; font-size : 16px;"></b></div><div ng-if=":rebind:!peer.isWs2p()&&peer.isTor()" ng-click="showEndpointsPopover($event, peer, \'BMATOR\')"><i class="ion-bma-tor-api"></i></div><div ng-if=":rebind:peer.isWs2p()&&peer.isTor()" ng-click="showWs2pPopover($event, peer)"><i class="ion-bma-tor-api"></i></div></div><div class="col col-20 no-padding text-center" ng-if="::expertMode && search.type != \'offline\'"><h3 class="hidden-sm hidden-xs gray"><span ng-if=":rebind:peer.uid"><i class="ion-lock-combination"></i>{{:rebind:peer.difficulty||\'?\'}}</span> <span ng-if=":rebind:!peer.uid" translate>PEER.MIRROR</span></h3><h4 class="hidden-sm hidden-xs gray">{{:rebind: peer.software !== \'duniter\' ? peer.software : \'\'}} {{:rebind: peer.version ? (\'v\'+peer.version) : \'\'}}</h4></div><div class="col col-20 no-padding text-center"><span id="{{$index === 0 ? helptipPrefix + \'-peer-0-block\' : \'\'}}" class="badge" ng-class=":rebind:{\'badge-balanced\': peer.hasMainConsensusBlock, \'badge-energized\': peer.hasConsensusBlock, \'ng-hide\': !peer.currentNumber && !peer.blockNumber }">{{:locale:!expertMode ? (\'COMMON.BLOCK\'|translate) : \'\' }} {{:rebind:(peer.currentNumber || peer.blockNumber) | formatInteger}}</span> <span class="badge badge-secondary" ng-if=":rebind:peer.consensusBlockDelta && expertMode"><i class="ion-clock"></i>&nbsp; {{:rebind:peer.consensusBlockDelta|formatDurationTime}}</span></div></div>'),e.put("templates/network/items_peers.html",'<div class="no-padding {{::motion.ionListClass}}"><div class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-if="::isHttps && expertMode"><small><i class="icon ion-alert-circled"></i> {{:locale:\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small></div><div class="item row row-header hidden-xs hidden-sm done in" ng-if="::expertMode"><a class="col col-header no-padding dark" ng-click="toggleSort(\'uid\')"><cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'uid\'"></cs-sort-icon>{{:locale:\'COMMON.UID\' | translate}} / {{:locale:\'COMMON.PUBKEY\' | translate}} </a><a class="no-padding dark hidden-md col col-15 col-header" ng-click="toggleSort(\'api\')" ng-if=":rebind:!compactMode"><cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'api\'"></cs-sort-icon>{{:locale:\'PEER.API\' | translate}}</a><div class="no-padding dark hidden-md col col-15 col-header" ng-if=":rebind:compactMode"></div><a class="no-padding dark col col-20 col-header" ng-click="toggleSort(\'difficulty\')"><cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'difficulty\'"></cs-sort-icon>{{:locale:\'PEER.DIFFICULTY\' | translate}} </a><a class="col col-20 col-header no-padding dark" ng-click="toggleSort(\'current_block\')"><cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'current_block\'"></cs-sort-icon>{{:locale:\'PEER.CURRENT_BLOCK\' | translate}}</a></div><div ng-repeat="peer in search.results track by peer.id" class="item item-peer item-icon-left ink {{::ionItemClass}}" ng-class=":rebind:{\'compacted\': peer.compacted && compactMode}" ng-attr-id="{{::($index === 0 ? (helptipPrefix + \'-peer-0\') : undefined)}}" ng-click="selectPeer(peer)" ng-include="::\'templates/network/item_content_peer.html\'"></div></div>'),
e.put("templates/network/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>PEER.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'member\')"><i class="icon ion-person"></i> {{\'PEER.MEMBERS\' | translate}} <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'member\'"></i> </a><a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'mirror\')"><i class="icon ion-radio-waves"></i> {{\'PEER.MIRRORS\' | translate}} <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'mirror\'"></i> </a><a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'offline\')"><i class="icon ion-eye-disabled"></i> {{\'PEER.OFFLINE\' | translate}} <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'offline\'"></i></a></div></ion-content></ion-popover-view>'),e.put("templates/network/modal_network.html",'<ion-modal-view id="nodes" class="modal-full-height" cache-view="false"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>PEER.PEER_LIST</h1><div class="buttons buttons-right header-item"><span class="secondary"><button class="button button-clear icon ion-loop button-clear" ng-click="refresh()"></button> <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></span></div></ion-header-bar><ion-content><div class="list"><div class="padding padding-xs" style="display: block; height: 60px;"><div class="pull-left"><h4><span ng-if="enableFilter && search.type==\'member\'" translate>PEER.MEMBER_PEERS</span> <span ng-if="enableFilter && search.type==\'mirror\'" translate>PEER.MIRROR_PEERS</span> <span ng-if="!enableFilter || !search.type" translate>PEER.ALL_PEERS</span> <span ng-if="!search.loading">({{search.results.length}})</span></h4></div><div class="pull-right"><ion-spinner class="icon" icon="android" ng-if="search.loading"></ion-spinner>&nbsp;<div class="pull-right"><a class="button button-text button-small hidden-xs hidden-sm ink" ng-if="enableFilter" ng-class="{\'button-text-positive\': search.type==\'member\'}" ng-click="toggleSearchType(\'member\')"><i class="icon ion-person"></i> {{\'PEER.MEMBERS\'|translate}} </a>&nbsp; <a class="button button-text button-small hidden-xs hidden-sm ink" ng-if="enableFilter" ng-class="{\'button-text-positive\': search.type==\'mirror\'}" ng-click="toggleSearchType(\'mirror\')"><i class="icon ion-ios-infinite"></i> {{\'PEER.MIRRORS\'|translate}}</a></div></div></div><ng-include src="::\'templates/network/items_peers.html\'"></ng-include></div></ion-content></ion-modal-view>'),e.put("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"><ion-header-bar class="bar bar-header stable-bg" ng-if="titleKey"><div class="title">{{titleKey | translate:titleValues }}</div></ion-header-bar><ion-content scroll="false"><div class="list" ng-class="{\'has-header\': titleKey}"><div class="item item-text-wrap" ng-repeat="item in items"><div class="item-label" ng-if="item.label">{{item.label | translate}}</div><div id="endpoint_{{$index}}" class="badge item-note dark">{{item.value}}</div></div></div></ion-content></ion-popover-view>'),e.put("templates/network/popover_network.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-network" ng-controller="NetworkLookupPopoverCtrl"><ion-header-bar class="stable-bg block"><div class="title">{{\'MENU.NETWORK\'|translate}}<ion-spinner class="ion-spinner-small" icon="android" ng-if="search.loading"></ion-spinner></div><div class="pull-right"><a ng-class="{\'positive\': search.type==\'member\', \'dark\': search.type!==\'member\'}" ng-click="toggleSearchType(\'member\')" translate>PEER.MEMBERS</a></div></ion-header-bar><ion-content scroll="true"><div class="list no-padding"><ng-include src="::\'templates/network/items_peers.html\'"></ng-include></div></ion-content><ion-footer-bar class="stable-bg block"><div class="pull-left"><a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SETTINGS</a></div><div class="pull-right"><a class="positive" ui-sref="app.network" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a></div></ion-footer-bar></ion-popover-view>'),e.put("templates/network/popover_peer_info.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-peer-info" ng-controller="PeerInfoPopoverCtrl"><ion-header-bar class="stable-bg block"><div class="title">{{\'PEER.VIEW.TITLE\'|translate}}</div></ion-header-bar><ion-content scroll="true"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="list no-padding" ng-if="!loading"><div class="item" ng-if=":rebind:formData.software"><i class="ion-outlet"></i> {{\'NETWORK.VIEW.SOFTWARE\'|translate}}<div class="badge" ng-class=":rebind:{\'badge-energized\': formData.isPreRelease, \'badge-assertive\': formData.hasNewRelease }">{{formData.software}} v{{:rebind:formData.version}}</div><div class="gray badge badge-secondary" ng-if="formData.isPreRelease"><i class="ion-alert-circled"></i> <span ng-bind-html="\'NETWORK.VIEW.WARN_PRE_RELEASE\'|translate: formData.latestRelease"></span></div><div class="gray badge badge-secondary" ng-if="formData.hasNewRelease"><i class="ion-alert-circled"></i> <span ng-bind-html="\'NETWORK.VIEW.WARN_NEW_RELEASE\'|translate: formData.latestRelease"></span></div></div><div class="item"><i class="ion-locked"></i> {{\'NETWORK.VIEW.ENDPOINTS.BMAS\'|translate}}<div class="badge badge-balanced" ng-if=":rebind:formData.useSsl" translate>COMMON.BTN_YES</div><div class="badge badge-assertive" ng-if=":rebind:!formData.useSsl" translate>COMMON.BTN_NO</div></div><div class="item"><i class="ion-cube"></i> {{\'BLOCKCHAIN.VIEW.TITLE_CURRENT\'|translate}}<div class="badge badge-balanced">{{:rebind:formData.number | formatInteger}}</div></div><div class="item"><i class="ion-clock"></i> {{\'CURRENCY.VIEW.MEDIAN_TIME\'|translate}}<div class="badge dark">{{:rebind:formData.medianTime | medianDate}}</div></div><div class="item"><i class="ion-lock-combination"></i> {{\'CURRENCY.VIEW.POW_MIN\'|translate}}<div class="badge dark">{{:rebind:formData.powMin | formatInteger}}</div></div><cs-extension-point name="default"></cs-extension-point></div></ion-content><ion-footer-bar class="stable-bg block"><div class="pull-left"><a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>MENU.SETTINGS</a></div><div class="pull-right"><a class="positive" ui-sref="app.view_peer" ng-click="closePopover()" translate>PEER.BTN_SHOW_PEER</a></div></ion-footer-bar></ion-popover-view>'),e.put("templates/network/view_network.html",'<ion-view><ion-nav-title><span translate>MENU.NETWORK</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()"></button></ion-nav-buttons><ion-content scroll="true" ng-init="enableFilter=true; ionItemClass=\'item-border-large\';"><div class="row responsive-sm responsive-md responsive-lg"><div class="col list col-border-right"><div class="padding padding-xs" style="display: block; height: 60px;"><div class="pull-left"><h4><span ng-if="enableFilter && search.type==\'member\'" translate>PEER.MEMBER_PEERS</span> <span ng-if="enableFilter && search.type==\'mirror\'" translate>PEER.MIRROR_PEERS</span> <span ng-if="enableFilter && search.type==\'offline\'" translate>PEER.OFFLINE_PEERS</span> <span ng-if="!enableFilter || !search.type" translate>PEER.ALL_PEERS</span> <span ng-if="search.results.length">({{search.results.length}})</span><ion-spinner ng-if="search.loading" class="icon ion-spinner-small" icon="android"></ion-spinner></h4></div><div class="pull-right"><div class="pull-right" ng-if="enableFilter"><a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': compactMode}" ng-click="toggleCompactMode()"><i class="icon ion-navicon"></i> <b class="ion-arrow-down-b" style="position: absolute; top: -2px; left: 4px; font-size: 8px;"></b> <b class="ion-arrow-up-b" style="position: absolute; top: 10px; left: 4px; font-size: 8px;"></b> <span>{{:locale:\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\'|translate}}</span> </a><a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': search.type==\'member\'}" title="{{:locale:\'PEER.MEMBER_PEERS\'|translate}}" ng-click="toggleSearchType(\'member\')"><i class="icon ion-person-stalker"></i> {{\'PEER.MEMBERS\'|translate}} </a>&nbsp; <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': search.type==\'mirror\'}" title="{{\'PEER.MIRROR_PEERS\'|translate}}" ng-click="toggleSearchType(\'mirror\')"><i class="icon ion-radio-waves"></i> {{:locale:\'PEER.MIRRORS\'|translate}} </a><a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': search.type==\'offline\', \'button-text-stable\': search.type!=\'offline\'}" title="{{\'PEER.OFFLINE_PEERS\'|translate}}" ng-click="toggleSearchType(\'offline\')"><i class="icon ion-close-circled light-gray"></i> <span>{{:locale:\'PEER.OFFLINE\'|translate}}</span></a><cs-extension-point name="network-buttons"></cs-extension-point></div></div></div><div id="helptip-network-blockchain" style="display: block"></div><div id="helptip-network-peers" style="display: block"></div><ng-include src="::\'templates/network/items_peers.html\'"></ng-include></div><div class="col col-33" ng-controller="BlockLookupCtrl"><div class="padding padding-xs" style="display: block; height: 100px;"><h4 translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><div class="pull-right hidden-xs hidden-sm"><a class="button button-text button-small ink" ng-class="{\'button-text-positive\': compactMode, \'button-text-stable\': !compactMode}" ng-click="toggleCompactMode()"><i class="icon ion-navicon"></i> <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b> <b class="icon-secondary ion-arrow-up-b" style="top: 4px; left: 5px; font-size: 8px;"></b> <span>{{:locale:\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\'|translate}}</span></a><cs-extension-point name="blockchain-buttons"></cs-extension-point></div></div><ng-include src="::\'templates/blockchain/list_blocks.html\'"></ng-include></div></div></ion-content></ion-view>'),e.put("templates/network/view_peer.html",'<ion-view><ion-nav-title><span translate>PEER.VIEW.TITLE</span></ion-nav-title><ion-content><div class="row no-padding"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col list"><ion-item><h1><span translate>PEER.VIEW.TITLE</span> <span class="gray">{{node.host}}</span></h1><h2 class="gray"><i class="gray icon ion-android-globe"></i> {{node.bma.dns || node.server}} <span class="gray" ng-if="!loading && node.useSsl"><i class="gray ion-locked"></i> <small>SSL</small> </span><span class="gray" ng-if="!loading && node.useTor"><i class="gray ion-bma-tor-api"></i> </span><span class="assertive" ng-if="!loading && !node.uid">({{\'PEER.MIRROR\'|translate}})</span></h2><h3><span class="dark"><i class="icon ion-android-desktop"></i> {{\'PEER.VIEW.OWNER\'|translate}} </span><a class="positive" ng-if="node.uid" ui-sref="app.wot_identity({pubkey: node.pubkey, uid: node.uid})"><i class="ion-person"></i> {{node.name || node.uid}} <span class="gray" ng-if="node.name">({{node.uid}}) </span></a><span ng-if="!loading && !node.uid"><a class="gray" ui-sref="app.wot_identity({pubkey: node.pubkey})"><i class="ion-key"></i> {{node.pubkey|formatPubkey}} <span class="gray" ng-if="node.name">({{node.name}})</span></a></span></h3><h3><a ng-click="openRawPeering($event)"><i class="icon ion-share"></i> {{\'PEER.VIEW.SHOW_RAW_PEERING\'|translate}} </a><span class="gray" ng-if="!isReachable">| </span><a ng-if="!isReachable" ng-click="openRawCurrentBlock($event)"><i class="icon ion-share"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span></a></h3></ion-item><div class="item item-divider" translate>PEER.VIEW.GENERAL_DIVIDER</div><ion-item class="item-icon-left item-text-wrap ink" copy-on-click="{{node.pubkey}}"><i class="icon ion-key"></i> <span translate>COMMON.PUBKEY</span><h4 class="dark text-left">{{node.pubkey}}</h4></ion-item><a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.view_server_block_hash({server: node.server, ssl: node.useSsl, tor: node.useTor, number: current.number, hash: current.hash})"><i class="icon ion-cube"></i> <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span><div class="badge badge-calm" ng-if="!loading">{{current.number|formatInteger}}</div><i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.server_blockchain({server: node.server, ssl: node.useSsl, tor: node.useTor})"><i class="icon ion-cube" style="font-size: 25px;"></i> <i class="icon-secondary ion-clock" style="font-size: 18px; left: 33px; top: -12px;"></i> <span translate>PEER.VIEW.LAST_BLOCKS</span> <i class="gray icon ion-ios-arrow-right"></i></a><cs-extension-point name="general"></cs-extension-point><div class="item item-divider" ng-hide="loading || !isReachable" translate>PEER.VIEW.KNOWN_PEERS</div><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"><small><i class="icon ion-alert-circled"></i> {{\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small></ion-item><div class="item center" ng-if="loading"><ion-spinner class="icon" icon="android"></ion-spinner></div><div class="list no-padding {{::motion.ionListClass}}" ng-if="isReachable"><div ng-repeat="peer in :rebind:peers track by peer.id" class="item item-peer item-icon-left ink {{::ionItemClass}}" ng-click="selectPeer(peer)" ng-include="::\'templates/network/item_content_peer.html\'"></div></div></div><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div></div></ion-content></ion-view>'),e.put("templates/settings/popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink visible-xs visible-sm" ng-click="reset()"><i class="icon ion-refresh"></i> {{\'SETTINGS.BTN_RESET\' | translate}} </a><a class="item item-icon-left ink" ng-click="startSettingsTour()"><i class="icon ion-easel"></i> {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/settings/popup_node.html",'<form name="popupForm" ng-submit=""><div class="list no-padding" ng-init="setPopupForm(popupForm)"><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': popupForm.$submitted && popupForm.newNode.$invalid}"><span class="input-label" ng-bind-html="\'SETTINGS.POPUP_PEER.HOST\'|translate"></span> <input name="newNode" type="text" placeholder="{{\'SETTINGS.POPUP_PEER.HOST_HELP\' | translate}}" ng-model="popupData.newNode" ng-minlength="3" required></div><div class="form-errors" ng-if="popupForm.$submitted && popupForm.newNode.$error" ng-messages="popupForm.newNode.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div><div class="item item-toggle"><span class="input-label">{{\'SETTINGS.POPUP_PEER.USE_SSL\' | translate}}</span><h4><small class="gray" ng-bind-html="\'SETTINGS.POPUP_PEER.USE_SSL_HELP\' | translate"></small></h4><label class="toggle toggle-royal no-padding-right"><input type="checkbox" ng-model="popupData.useSsl"><div class="track"><div class="handle"></div></div></label></div><a class="button button-positive button-clear positive button-outline button-full button-small-padding icon-left ink no-padding" ng-click="showNodeList()"><i class="icon ion-search"></i> {{\'SETTINGS.POPUP_PEER.BTN_SHOW_LIST\' | translate}}</a></div><button type="submit" class="hide"></button></form>'),e.put("templates/settings/settings.html",'<ion-view left-buttons="leftButtons" cache-view="false" class="settings"><ion-nav-title translate>SETTINGS.TITLE</ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content><div class="padding text-center hidden-xs hidden-sm"><button class="button button-raised button-stable ink" ng-click="reset()"><i class="icon ion-refresh"></i> {{\'SETTINGS.BTN_RESET\' | translate}}</button> <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showActionsPopover($event)" title="{{\'COMMON.BTN_OPTIONS\' | translate}}"></button></div><div class="row no-padding responsive-sm responsive-md responsive-lg"><div class="col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm" style="margin-bottom: 2px;"><span class="item item-divider" translate>SETTINGS.DISPLAY_DIVIDER</span> <label class="item item-input item-select"><div class="input-label" translate>COMMON.LANGUAGE</div><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"></select></label><div class="item item-toggle dark"><div class="input-label">{{\'COMMON.BTN_RELATIVE_UNIT\' | translate}}</div><label class="toggle toggle-royal" id="helptip-settings-btn-unit-relative"><input type="checkbox" ng-model="formData.useRelative"><div class="track"><div class="handle"></div></div></label></div><div class="item item-toggle dark item-text-wrap"><div class="input-label" ng-bind-html="\'SETTINGS.ENABLE_HELPTIP\' | translate"></div><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.helptip.enable"><div class="track"><div class="handle"></div></div></label></div><span class="item item-divider" translate>SETTINGS.STORAGE_DIVIDER</span><div class="item item-text-wrap item-toggle dark"><div class="input-label">{{\'SETTINGS.USE_LOCAL_STORAGE\' | translate}}</div><h4 class="gray" ng-bind-html="\'SETTINGS.USE_LOCAL_STORAGE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.useLocalStorage"><div class="track"><div class="handle"></div></div></label></div><div class="item item-text-wrap item-toggle dark"><div class="input-label" ng-class="{\'gray\': !formData.useLocalStorage}" ng-bind-html="\'SETTINGS.PERSIST_CACHE\' | translate"></div><h4 class="gray" ng-bind-html="\'SETTINGS.PERSIST_CACHE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.persistCache" ng-if="formData.useLocalStorage"> <input type="checkbox" ng-model="formData.useLocalStorage" ng-if="!formData.useLocalStorage" disabled="disabled"><div class="track"><div class="handle"></div></div></label></div><cs-extension-point name="common"></cs-extension-point><span class="item item-divider hidden-readonly">{{\'SETTINGS.AUTHENTICATION_SETTINGS\' | translate}}</span><div class="item item-toggle item-text-wrap hidden-readonly"><div class="input-label" ng-class="{\'gray\': !formData.useLocalStorage}">{{\'SETTINGS.REMEMBER_ME\' | translate}}</div><h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.REMEMBER_ME_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.rememberMe" ng-if="formData.useLocalStorage"> <input type="checkbox" ng-model="formData.useLocalStorage" ng-if="!formData.useLocalStorage" disabled="disabled"><div class="track"><div class="handle"></div></div></label></div><label class="item item-input item-select item-text-wrap hidden-readonly"><div class="input-label hidden-xs" ng-class="::{\'gray\': $root.config.demo}"><span class="hidden-xs" translate>SETTINGS.KEEP_AUTH</span><h4 class="gray text-wrap hidden-xs" ng-bind-html="\'SETTINGS.KEEP_AUTH_HELP\' | translate"></h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"></ng-if></div><span class="visible-xs" ng-class="::{\'gray\': $root.config.demo}" translate>SETTINGS.KEEP_AUTH_SHORT</span> <select ng-model="formData.keepAuthIdle" ng-disabled="$root.config.demo" ng-options="i as (keepAuthIdleLabels[i].labelKey | translate:keepAuthIdleLabels[i].labelParams ) for i in keepAuthIdles track by i"></select></label><div class="item item-input hidden-xs hidden-sm" ng-class="{\'gray\': (!formData.useLocalStorage || !formData.rememberMe)}" ng-if="::$root.device.isDesktop()"><div class="input-label"><span class="input-label" translate>SETTINGS.KEYRING_FILE</span><h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.KEYRING_FILE_HELP\' | translate"></h4></div><div class="item-note dark">{{formData.keyringFile}}</div></div></div><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"><span class="item item-divider hidden-readonly">{{\'SETTINGS.WALLETS_SETTINGS\' | translate}}</span><div class="item item-toggle item-text-wrap dark hidden-readonly"><span class="input-label" ng-class="{\'gray\': !formData.useLocalStorage}" translate>SETTINGS.USE_WALLETS_ENCRYPTION</span><h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.USE_WALLETS_ENCRYPTION_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.useLocalStorageEncryption" ng-if="formData.useLocalStorage"> <input type="checkbox" ng-model="formData.useLocalStorage" ng-if="!formData.useLocalStorage" disabled="disabled"><div class="track"><div class="handle"></div></div></label></div><span class="item item-divider hidden-readonly" translate>SETTINGS.HISTORY_SETTINGS</span><div class="item item-toggle item-text-wrap dark hidden-readonly"><div class="input-label" translate>SETTINGS.DISPLAY_UD_HISTORY</div><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.showUDHistory"><div class="track"><div class="handle"></div></div></label></div><div class="item item-toggle dark hidden-xs hidden-sm hidden-readonly"><div class="input-label" translate>SETTINGS.TX_HISTORY_AUTO_REFRESH</div><h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.TX_HISTORY_AUTO_REFRESH_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.walletHistoryAutoRefresh"><div class="track"><div class="handle"></div></div></label></div><cs-extension-point name="history"></cs-extension-point><span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span><div class="item ink item-text-wrap item-icon-right hidden-xs hidden-sm" ng-click="changeNode()"><div class="input-label" translate>SETTINGS.PEER</div><ng-if ng-if="formData.node.temporary"><h4 class="gray text-wrap assertive"><i class="icon ion-alert-circled"></i> <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span></h4><div class="item-note assertive text-italic">{{bma.server}}</div></ng-if><div class="badge badge-balanced" ng-if="!formData.node.temporary">{{bma.server}}</div><i class="icon ion-ios-arrow-right"></i></div><ion-item class="ink item-icon-right visible-xs visible-sm" ng-click="changeNode()"><div class="input-label hidden-xs" translate>SETTINGS.PEER</div><div class="input-label visible-xs" translate>SETTINGS.PEER_SHORT</div><ng-if ng-if="formData.node.temporary"><h4 class="gray text-wrap assertive"><b class="ion-alert-circled"></b> <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span></h4><div class="badge badge-assertive">{{bma.server}}</div></ng-if><div class="badge badge-balanced" ng-if="!formData.node.temporary">{{bma.server}}</div><i class="icon ion-ios-arrow-right"></i></ion-item><div class="item item-text-wrap item-toggle dark hidden-xs hidden-sm"><div class="input-label" ng-bind-html="\'SETTINGS.EXPERT_MODE\' | translate"></div><h4 class="gray" ng-bind-html="\'SETTINGS.EXPERT_MODE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.expertMode"><div class="track"><div class="handle"></div></div></label></div><label class="item item-input item-select item-text-wrap"><div class="input-label hidden-xs"><span translate>SETTINGS.BLOCK_VALIDITY_WINDOW</span><h4 class="gray text-wrap hidden-xs" ng-bind-html="\'SETTINGS.BLOCK_VALIDITY_WINDOW_HELP\' | translate"></h4></div><div class="input-label visible-xs" translate>SETTINGS.BLOCK_VALIDITY_WINDOW_SHORT</div><select ng-model="formData.blockValidityWindow" ng-options="i as (blockValidityWindowLabels[i].labelKey | translate:blockValidityWindowLabels[i].labelParams ) for i in blockValidityWindows track by i"></select></label><cs-extension-point name="network"></cs-extension-point><span class="item item-divider" ng-if="$root.config.plugins" translate>SETTINGS.PLUGINS_SETTINGS</span><cs-extension-point name="plugins"></cs-extension-point></div></div></ion-content></ion-view>'),e.put("templates/wallet/item_tx.html",'<i class="icon item-image" ng-if="::!tx.avatar" ng-class="::{\'ion-person dark\': tx.uid, \'ion-card dark\': !tx.uid}"></i> <i class="avatar" ng-if="::tx.avatar" style="background-image: url({{::tx.avatar.src}})"></i><div class="row no-padding"><div class="col col-pubkey no-padding"><a class="" ui-sref="app.wot_identity({pubkey:tx.pubkey, uid:tx.uid})" ng-if="::tx.uid">{{::tx.name||tx.uid}} </a><a class="gray" ui-sref="app.wot_identity({pubkey:tx.pubkey, uid:tx.uid})" ng-if="::!tx.uid && tx.pubkey"><i class="ion-key gray"></i> {{::tx.pubkey | formatPubkey}} <span ng-if="::tx.name">- {{::tx.name | truncText:40}}</span></a><p ng-if="::tx.pubkeys" class="pubkeys"><a class="gray" ng-repeat="pubkey in ::tx.pubkeys.slice(0, 4)" ui-sref="app.wot_identity({pubkey:pubkey})"><i class="ion-key gray"></i>&nbsp;{{::pubkey | formatPubkey}} </a><span ng-if="::tx.pubkeys.length &gt; 4">...</span></p><p class="dark visible-xs comment text-italic" ng-if="::tx.comment" title="{{::tx.comment}}"><i class="ion-ios-chatbubble-outline"></i> {{::tx.comment}}<br></p><h4><a ng-if="::!pending" class="gray underline" ui-sref="app.view_block({number: tx.block_number})">{{::tx.time | medianFromNowAndDate: false}} </a><span ng-if="::pending" class="gray">{{::tx.time | medianFromNowAndDate: false}}</span></h4></div><div class="col col-50 col-comment no-padding padding-left hidden-xs" ng-if="::tx.comment"><p class="vertical-center gray text-italic" data-toggle="tooltip" title="{{::tx.comment}}">{{::tx.comment}}</p></div><div class="col col-10 no-padding"><span ng-if="::!tx.lockedOutputs" class="badge item-note" ng-class="{\'badge-calm\': tx.amount > 0, \'badge-white\': tx.amount <= 0}"><span ng-bind-html=":rebind:tx.amount| formatAmount:{currency:$root.currency.name}"></span> </span><a ng-if=":rebind:tx.lockedOutputs" class="badge item-note" ng-class="{\'badge-calm\': tx.amount > 0}" ng-click="showLockedOutputsPopover(tx, $event)"><b class="ion-locked"></b> <span ng-bind-html=":rebind:tx.amount| formatAmount:{currency:$root.currency.name}"></span></a><div class="badge badge-secondary" ng-if="$root.settings.expertMode">(<span ng-bind-html=":rebind:tx.amount| formatAmount:{useRelative: !$root.settings.useRelative, currency:$root.currency.name}"></span>)</div></div></div>'),e.put("templates/wallet/item_ud.html",'<i class="icon item-image ion-arrow-up-c energized"></i><div class="row no-padding"><div class="col no-padding"><span class="energized" translate>COMMON.UNIVERSAL_DIVIDEND</span><h4><a class="gray underline" ui-sref="app.view_block({number: tx.block_number})">{{::tx.time | medianFromNowAndDate}}</a></h4></div><div class="col col-10 no-padding"><span class="badge item-note badge-energized"><span ng-bind-html=":rebind:tx.amount| formatAmount:{currency:$root.currency.name}"></span></span><div class="badge badge-secondary" ng-if="$root.settings.expertMode">(<span ng-bind-html=":rebind:tx.amount| formatAmount:{useRelative: !$root.settings.useRelative, currency:$root.currency.name}"></span>)</div></div></div>'),e.put("templates/wallet/list/item_wallet_light.html",'<div class="item item-avatar item-icon-right item-border item-wallet" ng-click="select($event, wallet)" ng-init="walletData=wallet.data;"><i ng-if="::!walletData.avatar" class="item-image icon" ng-class="::{\'ion-card\': !walletData.isMember, \'ion-person\': walletData.isMember}"></i> <i ng-if="::walletData.avatar" class="item-image avatar" style="background-image: url({{::walletData.avatar.src}})"></i><div class="badge badge-button badge-avatar badge-assertive ion-locked" ng-hide="::wallet.isAuth()"></div><h2><ng-if ng-if="::walletData.localName||walletData.name||walletData.uid">{{::walletData.localName||walletData.name||walletData.uid}}</ng-if><ng-if ng-if="::!walletData.localName && !walletData.name && !walletData.uid">{{::walletData.pubkey|formatPubkey}}</ng-if></h2><h4 class="gray"><span class="positive" ng-if="::walletData.name && walletData.uid"><i class="ion-person"></i> {{::walletData.uid}}&nbsp; </span><b class="ion-key"></b> {{::walletData.pubkey | formatPubkey}} <span ng-if="::!walletData.uid" class="assertive" translate>WOT.NOT_MEMBER_PARENTHESIS</span></h4><div class="badge" ng-if="formData.showBalance" ng-class="{\'badge-calm\': (walletData.balance > 0) }"><span ng-bind-html="walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}"></span></div><i class="icon ion-ios-arrow-right"></i></div>'),e.put("templates/wallet/list/item_wallet.html",'<div class="item item-avatar item-icon-right item-border-large item-wallet ink" id="wallet-{{::wallet.id}}" ng-click="select($event, wallet)" ng-init="walletData=wallet.data;"><i ng-if=":rebind:!walletData.avatar" class="item-image icon" ng-class=":rebind:{\'ion-card\': !walletData.isMember, \'ion-person\': walletData.isMember}"></i> <i ng-if=":rebind:walletData.avatar" class="item-image avatar" style="background-image: url({{::walletData.avatar.src}})"></i><div class="badge badge-button badge-avatar badge-assertive ion-locked" ng-hide=":rebind:wallet.isAuth()"></div><h2><span class="text-editable" ng-click="editWallet($event, wallet)" title="{{\'ACCOUNT.WALLET_LIST.BTN_RENAME\'|translate}}"><ng-if ng-if=":rebind:walletData.localName||walletData.name||walletData.uid" ng-bind-html="::walletData.localName||walletData.name||walletData.uid"></ng-if><ng-if ng-if=":rebind:!walletData.localName && !walletData.name && !walletData.uid">{{::walletData.pubkey|formatPubkey}}</ng-if></span></h2><h4 class="gray"><span class="positive" ng-if="::walletData.name && walletData.uid"><i class="ion-person"></i> {{::walletData.uid}}&nbsp; </span><b class="ion-key"></b> {{::walletData.pubkey | formatPubkey}} <span ng-if="::!walletData.uid" class="assertive" translate>WOT.NOT_MEMBER_PARENTHESIS</span></h4><cs-extension-point name="item-wallet"></cs-extension-point><span class="badge" ng-if=":rebind:formData.showBalance && walletData.sources" ng-class=":rebind:{\'badge-calm\': (walletData.balance > 0) }"><ion-spinner class="ion-spinner-small" ng-if="formData.updatingWalletId==wallet.id" icon="android"></ion-spinner><span ng-bind-html=":rebind:walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}"></span> </span><i class="icon ion-ios-arrow-right"></i></div>'),e.put("templates/wallet/list/modal_import_file.html",'<ion-modal-view id="transfer" class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.TITLE</h1></ion-header-bar><ion-content scroll="true" class="padding"><p translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.HELP</p><div drop-zone="onFileChanged(file)"><div ng-if="!hasContent" file-select="onFileChanged(file)" accept=".csv,.txt"><h2 class="gray" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if="hasContent" class="item item-icon-left item-icon-right stable-bg"><i class="icon ion-document-text gray"></i><div class="item-content row"><div class="col"><h2>{{fileData.name}}</h2><h4 ng-if="fileData.lastModified"><span class="gray" translate>COMMON.FILE.DATE</span> {{fileData.lastModified/1000|formatDate}}</h4><h5><span class="gray" translate>COMMON.FILE.SIZE</span> {{fileData.size|formatInteger}} Ko</h5></div><div class="col padding-left"><h3 ng-if="validatingFile" translate>COMMON.FILE.VALIDATING</h3><h3 ng-if="!validatingFile"><span class="dark animate-show-hide ng-hide" ng-show="isValidFile && content.length" ng-bind-html="\'ACCOUNT.WALLET_LIST.IMPORT_MODAL.WALLET_COUNT\'|translate:{count: content.length}"></span> <span class="assertive animate-show-hide ng-hide" ng-show="isValidFile && !content.length"><br><i class="ion-close-circled assertive"></i> {{\'ACCOUNT.WALLET_LIST.IMPORT_MODAL.NO_NEW_WALLET\' |translate}} </span><span class="assertive animate-show-hide ng-hide" ng-show="!isValidFile"><br><i class="ion-close-circled assertive"></i> {{\'ERROR.INVALID_FILE_FORMAT\' |translate}}</span></h3></div></div><a class="ion-close-round gray pull-right" style="font-size: 10px; position: absolute; top: 6px; right: 6px;" ng-click="removeFile()"></a></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" ng-disabled="loading || !content.length" ng-click="closeModal(content)" translate>COMMON.BTN_IMPORT</button></div></ion-content></ion-modal-view>'),e.put("templates/wallet/list/modal_wallets.html",'<ion-modal-view id="transfer" class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>ACCOUNT.SELECT_WALLET_MODAL.TITLE</h1></ion-header-bar><ion-content scroll="true"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="center padding gray" ng-if="!loading && !wallets.length && !defaultWallet">{{:locale:\'ACCOUNT.WALLET_LIST.NO_WALLET\'|translate}}</div><ion-list ng-if="!loading" class="{{::motion.ionListClass}}"><ng-include ng-if="defaultWallet" ng-init="wallet = defaultWallet" src="\'templates/wallet/list/item_wallet.html\'"></ng-include><ng-repeat ng-repeat="wallet in wallets track by wallet.id" ng-include="::\'templates/wallet/list/item_wallet_light.html\'"></ng-repeat></ion-list></ion-content></ion-modal-view>'),e.put("templates/wallet/list/popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><button class="item item-icon-left ink" ng-class="{\'gray\': loading || !wallets.length, \'assertive\': !loading && wallets.length}" ng-disabled="loading || !wallets.length" ng-click="selectAndRemoveWallet()"><i class="icon ion-trash-a"></i> {{\'ACCOUNT.WALLET_LIST.BTN_DELETE\' | translate}}</button><div class="item-divider hidden-sm hidden-xs"></div><button class="item item-icon-left ink hidden-sm hidden-xs" ng-class="{\'gray\': loading || !wallets.length}" ng-disabled="loading || !wallets.length" ng-click="downloadAsFile()"><i class="icon ion-android-download"></i> {{\'ACCOUNT.WALLET_LIST.BTN_DOWNLOAD\' | translate}}</button> <button class="item item-icon-left ink hidden-sm hidden-xs" ng-class="{\'gray\': loading}" ng-disabled="loading" ng-click="showImportFileModal()"><i class="icon ion-android-upload"></i> {{\'ACCOUNT.WALLET_LIST.BTN_IMPORT_FILE_DOTS\' | translate}}</button></div></ion-content></ion-popover-view>'),e.put("templates/wallet/list/popover_wallets.html",'<ion-popover-view class="fit popover-wallets popover-light"><ion-header-bar class="stable-bg block"><div class="title" translate>ACCOUNT.SELECT_WALLET_MODAL.TITLE</div><div class="pull-right"><a class="positive" ng-click="showNewWalletModal()" translate>ACCOUNT.WALLET_LIST.BTN_NEW</a></div></ion-header-bar><ion-content scroll="true"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="center padding gray" ng-if="!loading && !wallets.length && !defaultWallet">{{:locale:\'ACCOUNT.WALLET_LIST.NO_WALLET\'|translate}}</div><ion-list ng-if="!loading"><ng-include ng-if="defaultWallet" ng-init="wallet = defaultWallet" src="\'templates/wallet/list/item_wallet_light.html\'"></ng-include><ng-repeat ng-repeat="wallet in :rebind:wallets | filter:filterFn(formData) track by wallet.id" ng-include="::\'templates/wallet/list/item_wallet_light.html\'"></ng-repeat></ion-list></ion-content><ion-footer-bar class="stable-bg block"><div class="pull-right"><a class="positive" ui-sref="app.view_wallets" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a></div></ion-footer-bar></ion-popover-view>'),e.put("templates/wallet/list/popup_edit_name.html",'<form name="editForm" ng-submit=""><div class="list" ng-init="setEditForm(editForm)"><label class="item item-input" ng-class="{\'item-input-error\': editForm.$submitted && editForm.name.$invalid}"><input name="name" type="text" placeholder="{{\'ACCOUNT.WALLET_LIST.EDIT_POPOVER.NAME_HELP\' | translate}}" ng-model="formData.name" ng-minlength="3" required></label><div class="form-errors" ng-if="editForm.$submitted && editForm.name.$error" ng-messages="editForm.name.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div></div></form>'),e.put("templates/wallet/list/view_wallets.html",'<ion-view left-buttons="leftButtons" class="view-wallet-list"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content scroll="true" class="padding no-padding-xs no-padding-sm" bind-notifier="{ rebind:formData.useRelative, locale:settings.locale.id}"><ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate(true, $event)"></ion-refresher><div class="hidden-xs hidden-sm padding text-center"><button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate(true, $event)" title="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point><button class="button button-calm icon-left ink" ng-click="showNewWalletModal()">{{:locale:\'ACCOUNT.WALLET_LIST.BTN_NEW\' | translate}}</button> <button class="button button-stable button-small-padding icon ion-android-more-vertical ink" ng-click="showActionsPopover($event)" title="{{:locale:\'COMMON.BTN_OPTIONS\' | translate}}"></button></div><div class="padding-top padding-xs hidden-xs hidden-sm" style="display: block; height: 60px;"><div class="pull-left"><h4><span translate>ACCOUNT.WALLET_LIST.TITLE</span> <small class="gray" ng-if="formData.balance">(<span translate>ACCOUNT.WALLET_LIST.TOTAL_DOTS</span>&nbsp; <span ng-bind-html="formData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}"></span>)</small><ion-spinner class="ion-spinner-small" icon="android" ng-if="loading || formData.updatingWalletId"></ion-spinner></h4></div></div><div class="center padding gray" ng-if="!loading && wallets && !wallets.length && !defaultWallet">{{:locale:\'ACCOUNT.WALLET_LIST.NO_WALLET\'|translate}}</div><ion-list class="{{::motion.ionListClass}}"><ng-include ng-if="defaultWallet" ng-init="wallet = defaultWallet" src="\'templates/wallet/list/item_wallet.html\'"></ng-include><ng-include ng-repeat="wallet in wallets track by wallet.id" src="\'templates/wallet/list/item_wallet.html\'"></ng-include></ion-list><div class="center padding visible-xs visible-sm" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div></ion-content><button id="fab-add-wallet" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop ng-hide" ng-show="!loading" ng-click="showNewWalletModal()"><i class="icon ion-plus"></i></button></ion-view>'),e.put("templates/wallet/modal_security.html",'<ion-modal-view class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button> <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slides.slider.activeIndex"></button><h1 class="title hidden-xs" translate>ACCOUNT.SECURITY.TITLE</h1><button class="button button-clear icon-right visible-xs" ng-if="!isLastSlide && slides.slider.activeIndex > 0" ng-click="doNext()"><span translate>COMMON.BTN_NEXT</span> <i class="icon ion-ios-arrow-right"></i></button> <button class="button button-positive button-icon button-clear icon ion-android-done visible-xs" ng-click="doNext()" ng-if="isLastSlide && option === \'saveID\'"></button></ion-header-bar><ion-slides options="slides.options" slider="slides.slider"><ion-slide-page><ion-content class="has-header padding"><div class="list"><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="selectOption(\'recoverID\')" ng-if="!login"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-person"></i> <b class="ion-ios-undo icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.RECOVER_ID</h2><h4 class="gray" translate>ACCOUNT.SECURITY.RECOVER_ID_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right" ng-if="::!$root.config.demo"></i></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="selectOption(\'revocation\', true)" ng-if="!login"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-person"></i> <b class="ion-close icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE</h2><h4 class="gray" translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE_DESCRIPTION</h4><i class="icon dark ion-ios-arrow-right"></i></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs" ng-click="selectOption(\'saveID\')" ng-if="login && !$root.device.enable"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-person"></i> <b class="ion-ios-redo icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b> <b class="ion-locked icon-secondary dark" style="top: 0px; left: 40px; font-size: 8px;"></b><h2 translate>ACCOUNT.SECURITY.SAVE_ID</h2><h4 class="gray" translate>ACCOUNT.SECURITY.SAVE_ID_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right"></i></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs" ng-click="selectOption(\'generateKeyfile\')" ng-if="login && !$root.device.enable"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-document-text"></i> <b class="ion-key icon-secondary dark" style="top: -8px; left: 42px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.GENERATE_KEYFILE</h2><h4 class="gray" translate>ACCOUNT.SECURITY.GENERATE_KEYFILE_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right"></i></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs hidden-sm" ng-click="downloadRevokeFile()" ng-if="canRevoke && !$root.device.enable"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-person"></i> <b class="ion-ios-redo icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b> <b class="ion-close icon-secondary dark" style="top: 0px; left: 40px; font-size: 8px;"></b><h2 translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE</h2><h4 class="gray" translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-android-archive"></i></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="self()" ng-if="needSelf"><div class="item-content item-text-wrap"><i class="item-image icon ion-person dark"></i> <b class="ion-flag icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.SEND_IDENTITY</h2><h4 class="gray" ng-bind-html="::\'ACCOUNT.SECURITY.SEND_IDENTITY_HELP\' | translate"></h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="membershipIn()" ng-if="needMembership"><div class="item-content item-text-wrap"><i class="item-image icon ion-person dark"></i> <b class="ion-plus icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.MEMBERSHIP_IN</h2><h4 class="gray" ng-bind-html="::\'ACCOUNT.SECURITY.MEMBERSHIP_IN_HELP\' | translate"></h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="revokeWalletIdentity()" ng-if="canRevoke"><div class="item-content item-text-wrap"><i class="item-image icon ion-person assertive-900"></i> <b class="ion-close icon-secondary assertive-900" style="top: -8px; left: 39px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.REVOCATION_WALLET</h2><h4 class="gray" translate>ACCOUNT.SECURITY.REVOCATION_WALLET_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"></ng-if></div></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button></div></ion-content></ion-slide-page><ion-slide-page ng-if="option == \'revocation\'"><ng-include src="::\'templates/wallet/slides/slides_revocation_file.html\'"></ng-include></ion-slide-page><ion-slide-page ng-if="login && option == \'saveID\'"><ng-include src="::\'templates/wallet/slides/slides_saveID_1.html\'"></ng-include></ion-slide-page><ion-slide-page ng-if="login && option == \'saveID\'"><ng-include src="::\'templates/wallet/slides/slides_saveID_2.html\'"></ng-include></ion-slide-page><ion-slide-page ng-if="option == \'recoverID\'"><ng-include src="::\'templates/wallet/slides/slides_recoverID_1.html\'"></ng-include></ion-slide-page><ion-slide-page ng-if="option == \'recoverID\'"><ng-include src="::\'templates/wallet/slides/slides_recoverID_2.html\'"></ng-include></ion-slide-page><ion-slide-page ng-if="option == \'recoverID\'"><ng-include src="::\'templates/wallet/slides/slides_recoverID_3.html\'"></ng-include></ion-slide-page><ion-slide-page ng-if="login && option == \'generateKeyfile\'"><ng-include src="::\'templates/wallet/slides/slides_generate_keyfile.html\'"></ng-include></ion-slide-page></ion-slides></ion-modal-view>'),e.put("templates/wallet/modal_transfer.html",'<ion-modal-view id="transfer" class="modal-full-height modal-transfer"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>TRANSFER.MODAL.TITLE</h1><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doTransfer()"></button></ion-header-bar><ion-content><ng-include src="::\'templates/wallet/transfer_form.html\'"></ng-include></ion-content><ion-digit-keyboard settings="digitKeyboardSettings" ng-if="digitKeyboardVisible"></ion-digit-keyboard></ion-modal-view>'),e.put("templates/wallet/new_transfer.html",'<ion-view left-buttons="leftButtons" id="transfer"><ion-nav-title><span class="visible-xs visible-sm" translate>TRANSFER.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doTransfer()"></button></ion-nav-buttons><ion-content scroll="true"><div class="row no-padding-xs"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col no-padding-xs"><h2 class="hidden-xs hidden-sm" ng-if="formData">{{(formData.all ? \'TRANSFER.SUB_TITLE_ALL\' : \'TRANSFER.SUB_TITLE\')|translate}}</h2><h4 class="hidden-xs hidden-sm">&nbsp;</h4><ng-include src="::\'templates/wallet/transfer_form.html\'"></ng-include></div><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div></div></ion-content><ion-digit-keyboard settings="digitKeyboardSettings" ng-if="digitKeyboardVisible"></ion-digit-keyboard></ion-view>'),e.put("templates/wallet/popover_actions.html",'<ion-popover-view class="fit has-header popover-wallet-actions"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)"><i class="icon ion-android-share-alt"></i> {{\'COMMON.BTN_SHARE\' | translate}} </a><a class="item item-icon-left ink" ng-if="walletData.requirements.alternatives" ng-click="showSelectIdentitiesModal()"><i class="icon ion-person"></i> <b class="icon-secondary ion-loop" style="margin-top: 4px; left: 15px;"></b> {{\'ACCOUNT.BTN_SELECT_ALTERNATIVES_IDENTITIES\' | translate}} </a><a class="item item-icon-left ink visible-xs visible-sm" ng-if="!walletData.requirements.needSelf && walletData.requirements.needRenew" ng-click="renewMembership()"><i class="icon ion-loop"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\' | translate}} </a><a class="item item-icon-left ink hidden-xs hidden-sm" ng-if="!walletData.requirements.needSelf && !walletData.requirements.hasBadSelfBlock && !walletData.requirements.revoked" ng-class="{\'gray\':!walletData.requirements.needRenew}" ng-click="renewMembership()"><i class="icon ion-loop"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\' | translate}} </a><a class="item item-icon-left ink hidden-xs hidden-sm" ng-if="walletData.requirements.hasBadSelfBlock" ng-click="fixMembership()"><i class="icon ion-loop"></i> {{\'ACCOUNT.BTN_FIX_MEMBERSHIP\' | translate}} </a><a class="item item-icon-left assertive ink" ng-if="walletData.requirements.canMembershipOut" ng-click="membershipOut()"><i class="icon ion-log-out"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_OUT_DOTS\' | translate}} </a><a class="item item-icon-left ink" ng-click="showSecurityModal()"><i class="icon ion-locked"></i> <span ng-bind-html="\'ACCOUNT.BTN_SECURITY_DOTS\' | translate"></span></a><div class="item-divider hidden-sm hidden-xs"></div><a class="item item-icon-left ink hidden-sm hidden-xs" ng-if="isDefaultWallet" ng-click="startWalletTour()"><i class="icon ion-easel"></i> {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/wallet/popover_unit.html",'<ion-popover-view class="popover-unit"><ion-content scroll="false"><div class="list"><a class="item item-icon-left" ng-class="{ \'selected\': !formData.useRelative}" ng-click="closePopover(false)"><i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': !formData.useRelative}"></i> <i ng-bind-html="$root.currency.name | currencySymbol:false"></i> </a><a class="item item-icon-left" ng-class="{ \'selected\': formData.useRelative}" ng-click="closePopover(true)"><i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': formData.useRelative}"></i> <i ng-bind-html="$root.currency.name | currencySymbol:true"></i></a></div></ion-content></ion-popover-view>'),e.put("templates/wallet/popup_register.html",'<form name="registerForm" ng-submit=""><div class="list" ng-init="setRegisterForm(registerForm)"><label class="item item-input" ng-class="{\'item-input-error\': registerForm.$submitted && registerForm.pseudo.$invalid}"><input name="pseudo" type="text" placeholder="{{\'ACCOUNT.NEW.PSEUDO_HELP\' | translate}}" ng-model="formData.newUid" ng-minlength="3" required></label><div class="form-errors" ng-if="registerForm.$submitted && registerForm.pseudo.$error" ng-messages="registerForm.pseudo.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div></div></form>'),e.put("templates/wallet/slides/slides_generate_keyfile.html",'<ion-content class="has-header padding"><h3 translate>ACCOUNT.SECURITY.GENERATE_KEYFILE</h3><div class="list"><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="downloadKeyFile(\'PubSec\')"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-document-text"></i> <b class="ion-ios-redo icon-secondary dark" style="top: -8px; left: 42px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT</h2><h4 class="gray" translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right"></i></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="downloadKeyFile(\'WIF\')"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-document-text"></i> <b class="ion-ios-redo icon-secondary dark" style="top: -8px; left: 42px; font-size: 12px;"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT</h2><h4 class="gray" translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right"></i></ng-if></div></div><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-click="downloadKeyFile(\'EWIF\')"><div class="item-content item-text-wrap"><i class="item-image dark icon ion-document-text"></i> <b class="ion-ios-redo icon-secondary dark" style="top: -8px; left: 42px; font-size: 12px;"></b> <b class="ion-locked icon-secondary dark" style="top: 0px; left: 43px; font-size: 8px;"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT</h2><h4 class="gray" translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT_HELP</h4><ng-if ng-if="::$root.config.demo" ng-include="::\'templates/common/note_feature_not_available.html\'"><i class="icon dark ion-ios-arrow-right"></i></ng-if></div></div></div></ion-content>'),e.put("templates/wallet/slides/slides_recoverID_1.html",'<ion-content class="has-header padding"><p translate>ACCOUNT.SECURITY.RECOVER_ID_SELECT_FILE</p><div drop-zone="onFileChanged(file)"><div ng-if="!hasContent" file-select="onFileChanged(file)" accept=".txt"><h2 class="gray" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if="hasContent" class="item item-icon-left item-icon-right"><i class="icon ion-document-text dark"></i><div class="item-content row"><div class="col"><span>{{fileData.name}}</span><br><small>{{fileData.size}} Ko</small></div><div class="col-10"><b ng-class="{\'ion-close-circled assertive\': !isValidFile}" style="font-size: 28px; position: relative; top: 6px;"></b></div></div><a class="ion-close-round gray pull-right" style="font-size: 10px; position: absolute; top: 6px; right: 6px;" ng-click="restore()"></a></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doNext()" translate>COMMON.BTN_NEXT <i class="icon ion-arrow-right-a"></i></button></div></ion-content>'),e.put("templates/wallet/slides/slides_recoverID_2.html",'<ion-content class="has-header padding"><h3 translate>ACCOUNT.SECURITY.RECOVER_ID</h3><form name="recoverForm" novalidate ng-submit="recoverId()"><div class="list" ng-init="setForm(recoverForm, \'recoverForm\')"><ng-repeat ng-repeat="question in recover.questions "><label class="item item-input {{smallscreen ? \'item-stacked-label\' : \'item-floating-label\'}}" ng-class="{\'item-input-error\': recoverForm.$submitted && recoverForm[\'question{{$index}}\'].$invalid}"><span class="input-label" style="{{smallscreen ? \'white-space: normal\' : \'\'}}">{{question.value }}</span> <input type="text" autocomplete="off" name="question{{$index}}" placeholder="{{smallscreen ? \'\' : question.value }}" ng-model="question.answer" required></label><div class="form-errors" ng-show="recoverForm.$submitted && recoverForm[\'question{{$index}}\'].$error" ng-messages="recoverForm[\'question{{$index}}\'].$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div></ng-repeat><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-clear button-dark" ng-click="restore()" type="button" translate>ACCOUNT.SECURITY.BTN_CLEAN</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>COMMON.BTN_NEXT <i class="icon ion-arrow-right-a"></i></button></div></div></form></ion-content>'),e.put("templates/wallet/slides/slides_recoverID_3.html",'<ion-content class="has-header padding"><h3 translate>ACCOUNT.SECURITY.RECOVER_ID</h3><div class="item item-input"><span class="input-label">{{\'LOGIN.SALT\' | translate}} :</span> <span>{{recover.salt}}</span></div><div class="item item-input"><span class="input-label">{{\'LOGIN.PASSWORD\' | translate}} :</span> <span>{{recover.pwd}}</span></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CLOSE</button></div></ion-content>'),e.put("templates/wallet/slides/slides_revocation_file.html",'<ion-content class="has-header padding"><p translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE_HELP</p><div drop-zone="onFileChanged(file)"><div ng-if="!hasContent" file-select="onFileChanged(file)" accept=".txt"><h2 class="gray" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if="hasContent" class="item item-icon-left item-icon-right"><i class="icon ion-document-text dark"></i><div class="row"><div class="col"><h2>{{fileData.name}}</h2><h4 ng-if="fileData.lastModified"><span class="gray" translate>COMMON.FILE.DATE</span> {{fileData.lastModified/1000|formatDate}}</h4><h5><span class="gray" translate>COMMON.FILE.SIZE</span> {{fileData.size|formatInteger}} Ko</h5></div><div class="col padding-left"><h3 class="assertive animate-show-hide ng-hide" ng-show="!isValidFile"><br><i class="ion-close-circled assertive"></i> {{revocationError|translate}}</h3></div></div><a class="ion-close-round gray pull-right" style="font-size: 10px; position: absolute; top: 6px; right: 6px;" ng-click="restore()"></a></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" ng-click="revokeWithFile()" translate>COMMON.BTN_NEXT <i class="icon ion-arrow-right-a"></i></button></div></ion-content>'),e.put("templates/wallet/slides/slides_saveID_1.html",'<ion-content class="has-header padding"><h3 translate>ACCOUNT.SECURITY.SAVE_ID</h3><label class="item item-input item-select"><div class="input-label" translate>ACCOUNT.SECURITY.LEVEL</div><select ng-model="formData.level"><option value="2" ng-bind-html="\'ACCOUNT.SECURITY.LOW_LEVEL\' | translate"></option><option value="4" translate>ACCOUNT.SECURITY.MEDIUM_LEVEL</option><option value="6" translate>ACCOUNT.SECURITY.STRONG_LEVEL</option></select></label><div class="padding-top" translate="ACCOUNT.SECURITY.HELP_LEVEL" translate-values="{nb: {{formData.level}}}"></div><form name="questionsForm" novalidate ng-submit="doNext(\'questionsForm\')"><div class="list" ng-init="setForm(questionsForm, \'questionsForm\')"><ion-checkbox ng-repeat="question in formData.questions" ng-model="question.checked" ng-required="isRequired()"><span style="white-space: normal;">{{question.value | translate}}</span></ion-checkbox><div class="item item-icon-right no-padding-top"><a class="dark"><i class="icon ion-android-add" ng-click="addQuestion()"></i></a><div class="list list-inset"><label class="item item-input"><input type="text" autocomplete="off" placeholder="{{\'ACCOUNT.SECURITY.ADD_QUESTION\' | translate}}" ng-model="formData.addQuestion"></label></div></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-clear button-dark" ng-click="restore()" type="button" translate>ACCOUNT.SECURITY.BTN_RESET</button> <button class="button button-calm icon-right ion-chevron-right ink" ng-disabled="questionsForm.$invalid" type="submit" translate>COMMON.BTN_NEXT <i class="icon ion-arrow-right-a"></i></button></div></form></ion-content>'),e.put("templates/wallet/slides/slides_saveID_2.html",'<ion-content class="has-header padding"><h3 translate>ACCOUNT.SECURITY.SAVE_ID</h3><form name="answersForm" novalidate ng-submit="doNext(\'answersForm\')"><div class="list" ng-init="setForm(answersForm, \'answersForm\')"><ng-repeat ng-repeat="question in formData.questions |filter:true:checked"><label class="item item-input item-text-wrap {{smallscreen ? \'item-stacked-label\' : \'item-floating-label\'}}" ng-class="{\'item-input-error\': answersForm.$submitted && answersForm[\'question{{$index}}\'].$invalid}"><span class="input-label" style="width: 100%; max-width: inherit;">{{question.value | translate}}</span> <input type="text" autocomplete="off" name="question{{$index}}" placeholder="{{smallscreen ? \'\' : question.value | translate}}" ng-model="question.answer" required></label><div class="form-errors" ng-show="answersForm.$submitted && answersForm[\'question{{$index}}\'].$error" ng-messages="answersForm[\'question{{$index}}\'].$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div></ng-repeat><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-clear button-dark" ng-click="restore()" type="button" translate>ACCOUNT.SECURITY.BTN_CLEAN</button> <button class="button button-positive ink" type="submit" translate>COMMON.BTN_CONTINUE <i class="icon ion-android-archive"></i></button></div></div></form></ion-content>'),e.put("templates/wallet/transfer_form.html",'<form name="transferForm" novalidate="" ng-submit="doTransfer()"><div class="list no-padding-xs" ng-init="setForm(transferForm)"><ion-item class="item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.destPub}" tabindex="1" ng-click="showWotLookupModal()"><span class="gray" translate="">TRANSFER.TO</span> <span class="badge badge-royal animate-fade-in animate-show-hide ng-hide" ng-show="destUid"><i class="ion-person"></i> {{destUid}} </span>&nbsp; <span class="badge badge-royal" ng-show="!destUid && formData.destPub"><i class="ion-key"></i> {{formData.destPub | formatPubkey}} </span><i class="gray icon ion-ios-arrow-right"></i></ion-item><div class="form-errors" ng-if="form.$submitted && !formData.destPub"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><ion-item class="item-text-wrap ink" ng-class="{\'item-icon-right\': enableSelectWallet}" tabindex="2" ng-click="showSelectWalletModal()"><span class="gray" translate="">TRANSFER.FROM</span> <span class="badge item-note" ng-if="loading"><ion-spinner class="ion-spinner-small" icon="android"></ion-spinner></span><span class="badge animate-fade-in animate-show-hide ng-hide" ng-show="!loading" ng-class="{\'badge-assertive\': (convertedBalance <= 0 || form.amount.$error.max), \'badge-balanced\': (convertedBalance > 0 && (!form.amount.$error.max)) }"><span ng-if="walletData.pubkey && !walletData.isMember"><i class="ion-key"></i> {{walletData.pubkey| formatPubkey}}&nbsp;&nbsp; </span><span ng-if="walletData.isMember"><i class="ion-person"></i> {{walletData.name||walletData.uid}}&nbsp;&nbsp; </span><span ng-bind-html="walletData.balance|formatAmount:{useRelative: formData.useRelative, currency:currency}"></span> </span><i class="gray icon ion-ios-arrow-right" ng-if="enableSelectWallet"></i></ion-item><div class="form-errors ng-hide" ng-show="!loading && walletData.pubkey && walletData.balance <= 0"><div class="form-error"><span translate="ERROR.NOT_ENOUGH_CREDIT"></span></div></div><ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.amount.$invalid}"><div class="input-label"><span translate="">TRANSFER.AMOUNT</span> (<span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative"></span>)</div><input type="text" tabindex="3" autocomplete="off" class="hidden-device" name="amount" placeholder="{{::\'TRANSFER.AMOUNT_HELP\' | translate}}" ng-model="formData.amount" required number-float=""> <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0px 16px;" ng-click="showUnitPopover($event)"><span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative"></span> &nbsp;<b class="ion-arrow-down-b" style="font-size: 12pt;"></b></a></ion-item><div class="form-errors" ng-show="form.$submitted && form.amount.$error" ng-messages="form.amount.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="numberFloat"><span translate="ERROR.FIELD_NOT_NUMBER"></span></div><div class="form-error" ng-message="numberInt"><span translate="ERROR.FIELD_NOT_INT"></span></div><div class="form-error" ng-message="min"><span translate="ERROR.FIELD_MIN" translate-values="{min: minAmount}"></span></div><div class="form-error" ng-message="max"><span translate="ERROR.NOT_ENOUGH_CREDIT"></span></div></div><a class="item item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.destPub}" ng-click="showWotLookupModal(\'restPub\')" tabindex="5" ng-if="formData.all && formData.restAmount"><span class="gray"><i translate="">TRANSFER.REST</i><ng-if ng-if="formData.restAmount">(<i ng-bind-html="formData.restAmount|formatAmount:{useRelative: formData.useRelative, currency:currency}"></i>)</ng-if><i translate="">TRANSFER.REST_TO</i> </span><span class="badge badge-royal animate-fade-in animate-show-hide ng-hide" ng-show="restUid"><i class="ion-person"></i> {{restUid}} </span>&nbsp; <span class="badge badge-royal" ng-show="!restUid && formData.restPub"><i class="ion-key"></i> {{formData.restPub | formatPubkey}} </span><i class="gray icon ion-ios-arrow-right"></i></a><div class="form-errors" ng-if="form.$submitted && formData.all && !formData.restPub && formData.restAmount &gt; 0"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="pull-right visible-xs visible-sm" ng-if="!formData.useComment"><a class="button button-text button-small ink" tabindex="-1" ng-click="addComment()"><i class="icon ion-plus"></i> <span translate="">TRANSFER.BTN_ADD_COMMENT</span></a></div><label class="item item-input item-floating-label hidden-xs hidden-sm" ng-class="{\'item-input-error\': form.$submitted && form.comment.$invalid}"><span class="input-label">{{\'TRANSFER.COMMENT\' | translate}}</span> <input type="text" placeholder="{{\'TRANSFER.COMMENT_HELP\' | translate}}" name="comment" tabindex="6" autocomplete="off" ng-model="formData.comment" ng-maxlength="255" ng-pattern="commentPattern"></label> <label class="item item-input item-floating-label visible-xs visible-sm" ng-if="formData.useComment" ng-class="{\'item-input-error\': form.$submitted && form.comment.$invalid}"><span class="input-label">{{\'TRANSFER.COMMENT\' | translate}}</span> <input type="text" placeholder="{{\'TRANSFER.COMMENT_HELP\' | translate}}" id="{{commentInputId}}" tabindex="7" name="comment" autocomplete="off" ng-model="formData.comment" ng-model-options="{ debounce: 650 }" ng-maxlength="255" ng-pattern="commentPattern" ng-focus="hideDigitKeyboard()"></label><div class="form-errors" ng-show="form.comment.$error" ng-messages="form.comment.$error"><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG"></span></div><div class="form-error" ng-message="pattern"><span translate="ERROR.FIELD_ACCENT"></span></div></div><div class="item item-icon-left item-text-wrap item-no-border hidden-xs hidden-sm"><div class="animate-fade-in animate-show-hide ng-hide" ng-show="formData.comment && formData.comment.length || form.comment.$invalid"><i class="icon ion-android-alert positive"></i><h4 class="positive" translate="">TRANSFER.WARN_COMMENT_IS_PUBLIC</h4></div></div><div class="item item-icon-left item-text-wrap item-no-border visible-xs visible-sm" ng-if="formData.useComment"><i class="icon ion-android-alert positive"></i><h4 class="positive" translate="">TRANSFER.WARN_COMMENT_IS_PUBLIC</h4></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" tabindex="-1" ng-click="cancel()" type="button" translate="">COMMON.BTN_CANCEL</button> <button class="button ink" tabindex="8" ng-class="{\'button-assertive\': formData.all, \'button-positive\': !formData.all}" ng-disabled="loading" type="submit" translate="">TRANSFER.BTN_SEND</button></div></form>'),e.put("templates/wallet/tx_locked_outputs_popover.html",'<ion-popover-view class="fit popover-locked-outputs"><ion-header-bar><h1 class="title" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.TITLE</h1></ion-header-bar><ion-content scroll="true"><div ng-if="popoverData.lockedOuputs.length == 1" class="item item-text-wrap no-border"><h4 class="positive" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION</h4></div><div ng-if="popoverData.lockedOuputs.length > 1" class="item item-text-wrap no-border"><h4 class="positive" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION_MANY</h4></div><div ng-repeat="output in popoverData.lockedOuputs track by $index" class="item"><h2 class="gray" ng-if="popoverData.lockedOuputs.length > 1" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.LOCKED_AMOUNT</h2><div ng-if="popoverData.lockedOuputs.length > 1" class="badge item-note" ng-class="{\'badge-balanced\': output.amount > 0}"><i class="icon ion-locked"></i> <span ng-bind-html="::output.amount| formatAmount"></span> <span ng-bind-html="::unit"></span></div><div ng-repeat="condition in output.unlockConditions track by $index" class="row" ng-class="::{\'padding-top\': !$index && popoverData.lockedOuputs.length > 1}" ng-style="::condition.style"><span class="gray" ng-if="::condition.operator">{{::\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\'+condition.operator|translate}}&nbsp;</span><div ng-if="::condition.type==\'SIG\'"><i class="icon ion-key dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.SIG\' | translate"></span> <a ng-click="goState(\'app.wot_identity\', {pubkey:condition.value})" style="text-decoration: none;" class="positive">{{condition.value|formatPubkey}}</a></div><div ng-if="::condition.type==\'XHX\'"><i class="icon ion-lock-combination dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.XHX\' | translate"></span> <a copy-on-click="{{::condition.value}}" class="positive">{{::condition.value|formatPubkey}}...</a></div><div ng-if="condition.type==\'CSV\'"><i class="icon ion-clock dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CSV\' | translate"></span> {{::condition.value|formatDuration}}</div><div ng-if="condition.type==\'CLTV\'"><i class="icon ion-clock dark"></i> <span class="dark" ng-bind-html="::\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CLTV\' | translate"></span> {{::condition.value|medianDate}}</div></div></div></ion-content></ion-popover-view>'),e.put("templates/wallet/view_wallet_tx_error.html",'<ion-view left-buttons="leftButtons" class="view-wallet-tx-error"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content scroll="true" class="refresher-top-bg" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate(true)"></ion-refresher><div class="hidden-xs hidden-sm padding text-center"><button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button></div><div class="row no-padding"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col list {{::motion.ionListClass}}"><div class="item item-divider"><span><b class="ion-clock"></b> {{:locale:\'ACCOUNT.PENDING_TX_RECEIVED\'|translate}}</span><div class="badge item-note"><span ng-if="!$root.settings.useRelative">({{$root.currency.name | abbreviate}})</span> <span ng-if="$root.settings.useRelative">({{\'COMMON.UD\' | translate}}<sub>{{$root.currency.name | abbreviate}}</sub>)</span></div></div><span class="item padding" ng-if="!loading && !hasReceivedTx()"><span class="gray">{{:locale:\'ACCOUNT.NO_TX\'|translate}}</span></span><div class="item item-pending item-tx item-icon-left" ng-repeat="tx in formData.tx.errors | filter: filterReceivedTx" ng-init="pending=true;" ng-include="::\'templates/wallet/item_tx.html\'"></div><div class="item item-divider"><span><b class="ion-close-circled"></b> {{:locale:\'ACCOUNT.ERROR_TX_SENT\'|translate}}</span><div class="badge item-note"><span ng-if="!$root.settings.useRelative">({{$root.currency.name | abbreviate}})</span> <span ng-if="$root.settings.useRelative">({{\'COMMON.UD\' | translate}}<sub>{{$root.currency.name | abbreviate}}</sub>)</span></div></div><span class="item padding" ng-if="!loading && !hasSentTx()"><span class="gray">{{:locale:\'ACCOUNT.NO_TX\'|translate}}</span></span><div class="item item-pending item-tx item-icon-left" ng-repeat="tx in formData.tx.errors | filter: filterSentTx" ng-init="error=true;" ng-include="::\'templates/wallet/item_tx.html\'"></div></div><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div></div></ion-content></ion-view>'),e.put("templates/wallet/view_wallet_tx.html",'<ion-view left-buttons="leftButtons" class="view-wallet-tx"><ion-nav-title><span class="visible-xs visible-sm" translate>MENU.TRANSACTIONS</span></ion-nav-title><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content scroll="true" class="refresher-positive-900-bg" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}"><ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate(true)"></ion-refresher><div class="positive-900-bg hero"><div class="content" ng-if="!loading"><h1 class="light"><span ng-bind-html=":balance:rebind:formData.balance | formatAmount:{currency: $root.currency.name}"></span></h1><h4><ng-if ng-if="!loading && $root.settings.expertMode" style="font-style: italic;">(<span ng-bind-html=":balance:rebind:formData.balance | formatAmount:{useRelative:!$root.settings.useRelative, currency: $root.currency.name}"></span>)</ng-if><ng-if ng-if=":rebind:!enableSelectWallet" style="color: lightgray;"><span ng-if=":rebind:formData.name">{{:rebind:formData.name}}</span> <span ng-if=":rebind:!formData.name && formData.uid">{{:rebind:formData.uid}}</span> <span ng-if=":rebind:!formData.name && !formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</span></ng-if><ng-if ng-if=":rebind:enableSelectWallet"><a class="hidden-xs hidden-sm" style="color: lightgray;" title="{{:locale:\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\'|translate}}" ng-click="showSelectWalletPopover($event)"><span ng-if=":rebind:formData.name">{{:rebind:formData.name}}</span> <span ng-if=":rebind:!formData.name && formData.uid">{{:rebind:formData.uid}}</span> <span ng-if=":rebind:!formData.name && !formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class="ion-arrow-down-b"></i></small> </a><a class="visible-xs visible-sm" style="color: lightgray;" title="{{:locale:\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\'|translate}}" ng-click="showSelectWalletModal($event)"><span ng-if=":rebind:formData.name">{{:rebind:formData.name}}</span> <span ng-if=":rebind:!formData.name && formData.uid">{{:rebind:formData.uid}}</span> <span ng-if=":rebind:!formData.name && !formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class="ion-arrow-down-b"></i></small></a></ng-if></h4><div class="helptip-anchor-center"><a id="helptip-wallet-balance">&nbsp;</a></div></div><h2 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h2></div><ng-include src="::\'templates/common/qrcode.html\'"></ng-include><div class="hidden-xs hidden-sm padding text-center" ng-if="!loading"><button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button> <button class="button button-stable button-small-padding icon ion-android-download ink" ng-click="downloadHistoryFile()" title="{{\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point>&nbsp;&nbsp; <button class="button button-calm ink" ng-click="showTransferModal()">{{:locale:\'COMMON.BTN_SEND_MONEY\' | translate}}</button></div><div class="row no-padding"><div class="col col-15 hidden-xs hidden-sm">&nbsp;</div><div class="col"><div class="list {{::motion.ionListClass}}"><a class="item item-icon-left item-icon-right ink" ng-if="formData.tx.errors && formData.tx.errors.length" ng-click="showTxErrors()"><i class="icon ion-alert-circled"></i> {{:locale:\'ACCOUNT.ERROR_TX\'|translate}}<div class="badge badge-assertive">{{formData.tx.errors.length}}</div><i class="gray icon ion-ios-arrow-right"></i></a><ng-if ng-if="formData.tx.pendings.length"><span class="item item-pending item-divider"><b class="ion-clock"></b> {{:locale:\'ACCOUNT.PENDING_TX\'|translate}}</span><div class="item item-pending item-tx item-icon-left" ng-repeat="tx in formData.tx.pendings" ng-init="pending=true;" ng-include="::\'templates/wallet/item_tx.html\'"></div></ng-if><ng-if ng-if="formData.tx.validating.length"><span class="item item-pending item-divider"><b class="icon ion-checkmark" style="font-size: 12px;"></b> <b class="icon-secondary ion-help" style="font-size: 12px; top: 2px; left: 11px;"></b> {{:locale:\'ACCOUNT.VALIDATING_TX\'|translate}}</span><div class="item item-pending item-tx item-icon-left" ng-repeat="tx in formData.tx.validating" ng-init="validating=true;" ng-include="::\'templates/wallet/item_tx.html\'"></div></ng-if><span class="item item-divider" ng-if="!loading"><b class="icon ion-checkmark"></b> {{:locale:\'ACCOUNT.LAST_TX\'|translate}} <a id="helptip-wallet-tx" style="position: relative; bottom: 0; right: 0px;">&nbsp;</a> </span><span class="item padding" ng-if="!loading && !formData.tx.history.length"><span class="gray">{{:locale:\'ACCOUNT.NO_TX\'|translate}}</span></span><div ng-repeat="tx in formData.tx.history" class="item item-tx item-icon-left" ng-include="::!tx.isUD ? \'templates/wallet/item_tx.html\' : \'templates/wallet/item_ud.html\'"></div><div class="item item-text-wrap text-center" ng-if="formData.tx.fromTime > 0"><p><a ng-click="showMoreTx()">{{:locale:\'ACCOUNT.SHOW_MORE_TX\'|translate}}</a> <span class="gray" translate="ACCOUNT.TX_FROM_DATE" translate-values="{fromTime: formData.tx.fromTime}"></span> <span class="gray">|</span> <a ng-click="showMoreTx(-1)" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div></div><div class="col col-15 hidden-xs hidden-sm">&nbsp;</div></div></ion-content><button id="fab-transfer" ng-show="!loading" class="button button-fab button-fab-bottom-right button-energized-900 hidden-md hidden-lg drop ng-hide" ng-click="showTransferModal()"><i class="icon ion-android-send"></i></button></ion-view>'),e.put("templates/wallet/view_wallet.html",'<ion-view left-buttons="leftButtons" class="view-wallet" id="wallet"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" id="helptip-wallet-options-xs" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content scroll="true" class="refresher-positive-900-bg" bind-notifier="{ rebind:settings.useRelative, locale:$root.settings.locale.id}"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate(true)"></ion-refresher><div class="positive-900-bg hero" style="max-width: 100%; display: block"><div class="content" ng-if="!loading" style="max-width: 100%"><i class="avatar" ng-if=":rebind:!formData.avatar" ng-class=":rebind:{\'avatar-wallet\': !formData.isMember, \'avatar-member\': formData.isMember}"></i> <i class="avatar" ng-if=":rebind:formData.avatar" style="background-image: url({{:rebind:formData.avatar.src}})"></i><h3 class="light" ng-if=":rebind:!enableSelectWallet"><span ng-if=":rebind:formData.name">{{:rebind:formData.name}}</span> <span ng-if=":rebind:!formData.name && formData.uid">{{:rebind:formData.uid}}</span> <span ng-if=":rebind:!formData.name && !formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</span></h3><h3 class="light" ng-if=":rebind:enableSelectWallet"><a class="hidden-xs hidden-sm" style="color: lightgray;" title="{{:locale:\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\'|translate}}" ng-click="showSelectWalletPopover($event)"><span ng-if=":rebind:formData.name">{{:rebind:formData.name}}</span> <span ng-if=":rebind:!formData.name && formData.uid">{{:rebind:formData.uid}}</span> <span ng-if=":rebind:!formData.name && !formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class="ion-arrow-down-b"></i></small> </a><a class="visible-xs visible-sm" style="color: lightgray;" title="{{:locale:\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\'|translate}}" ng-click="showSelectWalletModal($event)"><span ng-if=":rebind:formData.name">{{:rebind:formData.name}}</span> <span ng-if=":rebind:!formData.name && formData.uid">{{:rebind:formData.uid}}</span> <span ng-if=":rebind:!formData.name && !formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class="ion-arrow-down-b"></i></small></a></h3><h4><span class="assertive" ng-if=":rebind:(formData.name || formData.uid) && !formData.isMember" translate>WOT.NOT_MEMBER_PARENTHESIS</span><cs-extension-point name="hero"></cs-extension-point></h4></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><ng-include src="::\'templates/common/qrcode.html\'"></ng-include><a id="wallet-share-anchor"></a><div class="hidden-xs hidden-sm padding text-center" ng-if="!loading"><button class="button button-stable button-small-padding icon ion-android-share-alt ink" ng-disabled="loading" ng-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}"></button> <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point>&nbsp;&nbsp; <button id="helptip-wallet-options" class="button button-stable icon-right ink" ng-click="showActionsPopover($event)">&nbsp; <i class="icon ion-android-more-vertical"></i>&nbsp; {{:locale:\'COMMON.BTN_OPTIONS\' | translate}}</button><div ng-if="formData.requirements.needRenew"><br><button class="button button-raised button-stable ink" ng-click="renewMembership()"><i class="icon ion-alert-circled assertive"></i> <span class="assertive">{{:locale:\'ACCOUNT.BTN_MEMBERSHIP_RENEW\' | translate}}</span></button></div></div><div class="visible-xs visible-sm padding text-center" ng-if="!loading && formData.requirements.needRenew"><button class="button button-raised icon-left button-stable button-small-padding ink" ng-click="renewMembership()"><i class="icon ion-loop assertive"></i> <span class="assertive">{{:locale:\'ACCOUNT.BTN_MEMBERSHIP_RENEW\' | translate}}</span></button></div><div class="row no-padding"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col"><div class="list {{::motion.ionListClass}}" ng-hide="loading"><span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span><div id="helptip-wallet-pubkey" class="item item-icon-left item-text-wrap ink" on-hold="copy(formData.pubkey)" copy-on-click="{{:rebind:formData.pubkey}}"><i class="icon ion-key"></i> <span>{{:locale:\'COMMON.PUBKEY\'|translate}}</span><h4 id="pubkey" class="dark">{{:rebind:formData.pubkey}}</h4></div><ion-item class="item-icon-left" ng-if=":rebind:formData.sigDate||formData.uid"><i class="icon ion-calendar"></i> <span translate>COMMON.UID</span><h5 class="dark" ng-if=":rebind:formData.sigDate"><span translate>WOT.REGISTERED_SINCE</span> {{:rebind:formData.sigDate | medianDate}}</h5><span class="badge badge-stable">{{:rebind:formData.uid}}</span></ion-item><a id="helptip-wallet-certifications" class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="formData.isMember||formData.requirements.pendingMembership||!formData.requirements.needSelf" ng-click="showCertifications()"><i class="icon ion-ribbon-b"></i> <b ng-if="formData.requirements.isSentry" class="ion-star icon-secondary" style="color: yellow; font-size: 16px; left: 25px; top: -7px;"></b> {{:locale:\'ACCOUNT.CERTIFICATION_COUNT\'|translate}}<cs-badge-certification requirements="formData.requirements" parameters="::currency.parameters"></cs-badge-certification><i class="gray icon ion-ios-arrow-right"></i> </a><a id="helptip-wallet-given-certifications" class="item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm" ng-if="formData.isMember" ng-click="showGivenCertifications()"><i class="icon ion-ribbon-a"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span> <i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-icon-right ink" ng-click="showTxHistory()"><i class="icon ion-card"></i> <span translate>WOT.ACCOUNT_OPERATIONS</span> <i class="gray icon ion-ios-arrow-right"></i> </a><span class="item item-divider" ng-if="formData.events.length">{{:locale:\'ACCOUNT.EVENTS\' | translate}}</span><div class="item item-text-wrap item-icon-left item-wallet-event" ng-repeat="event in formData.events"><i class="icon" ng-class="{\'ion-information-circled royal\': event.type==\'info\',\'ion-alert-circled assertive\': event.type==\'warn\'||event.type==\'error\',\'assertive\': event.type==\'error\',\'ion-clock\': event.type==\'pending\'}"></i> <span trust-as-html="event.message | translate:event.messageParams"></span></div><cs-extension-point name="general"></cs-extension-point><cs-extension-point name="after-general"></cs-extension-point></div></div><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div></div></ion-content></ion-view>'),e.put("templates/wot/item_certification.html",'<i class="item-image" ng-if="!cert.avatar" ng-class="{\'ion-card\': !cert.isMember, \'ion-person\': cert.isMember}"></i> <i class="item-image avatar" ng-if="cert.avatar" style="background-image: url({{::cert.avatar.src}})"></i> <span ng-if="cert.isMember"><h3><i class="icon ion-clock" ng-if="cert.pending"></i> <span class="positive">{{::cert.name||cert.uid}}</span></h3><h4 class="gray"><i class="ion-key"></i> {{::cert.pubkey | formatPubkey}} <span class="gray">| {{::cert.time|medianDate}}</span> <span class="gray" ng-if="$root.settings.expertMode">| {{::cert.pending ? \'WOT.SIGNED_ON_BLOCK\' : \'WOT.WRITTEN_ON_BLOCK\' | translate:cert}}</span></h4></span><span ng-if="!cert.isMember"><h3><i class="icon ion-clock" ng-if="cert.pending"></i> <span ng-if="cert.uid" class="dark">{{::cert.name||cert.uid}} </span><span ng-if="!cert.uid" class="gray"><i class="ion-key"></i> {{::cert.pubkey | formatPubkey}}</span></h3><h5 class="assertive">{{::\'WOT.NOT_MEMBER_PARENTHESIS\'|translate}}</h5><h4 class="gray"><span ng-if="cert.uid"><i class="ion-key"></i> {{::cert.pubkey | formatPubkey}} </span><span class="gray">| {{::cert.time|medianDate}}</span> <span class="gray" ng-if="$root.settings.expertMode">| {{::cert.pending ? \'WOT.SIGNED_ON_BLOCK\' : \'WOT.WRITTEN_ON_BLOCK\' | translate:cert}}</span></h4></span><div class="badge badge-stable" ng-class="{\'badge-energized\': cert.willExpire}" ng-if="cert.expiresIn">{{::cert.expiresIn | formatDurationTo}}</div><div class="badge badge-assertive" ng-if="!cert.expiresIn">{{::\'WOT.EXPIRED\' | translate}}</div>'),e.put("templates/wot/item_content_identity.html",'<i ng-if="::!item.avatar" class="item-image icon ion-person"></i> <i ng-if="::item.avatar" class="item-image avatar" style="background-image: url({{::item.avatar.src}})"></i><h2><ng-if ng-if="::item.name||item.uid" ng-bind-html="::item.name||item.uid"></ng-if><ng-if ng-if="::!item.name && !item.uid">{{::item.pubkey|formatPubkey}}</ng-if></h2><h4 class="gray" ng-class="{\'pull-right\': !smallscreen}" ng-if="::item.sigDate"><i class="ion-clock"></i> {{::\'WOT.LOOKUP.REGISTERED\' | translate:item }}</h4><h4 class="gray" ng-class="{\'pull-right\': !smallscreen}" ng-if="item.memberDate"><i class="ion-clock"></i> {{::\'WOT.LOOKUP.MEMBER_FROM\' | translate:item}}</h4><h4 class="gray"><span class="positive" ng-if="::item.name && item.uid"><i class="ion-person"></i> {{::item.uid}}&nbsp; </span><b class="ion-key"></b> {{::item.pubkey | formatPubkey}} <span ng-if="::(!item.uid && !item.revoked)" class="assertive" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <span ng-if="::item.revoked" class="assertive" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</span></h4><h4 ng-if="::item.events||item.tags"><span ng-repeat="event in ::item.events" class="assertive"><i class="ion-alert-circled" ng-if="::!item.valid"></i> <span ng-bind-html="::event.message|translate:event.messageParams"></span> </span><span ng-if="::item.tags" class="dark"><ng-repeat ng-repeat="tag in ::item.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4>'),e.put("templates/wot/items_given_certifications.html",'<div class="list given-certifications" ng-class="::motions.givenCertifications.ionListClass"><span class="item item-divider hidden-xs"><span translate>WOT.GIVEN_CERTIFICATIONS.SUMMARY</span></span><div id="helptip-certs-stock" class="item item-icon-left item-text-wrap ink"><i class="icon ion-ribbon-a"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span><cs-badge-given-certification identity="formData" parameters="$root.currency.parameters"></cs-badge-given-certification></div><div class="item item-icon-left item-text-wrap ink" ng-if="formData.given_cert_error.length"><i class="icon ion-alert-circled"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.ERROR</span> <span class="badge badge-assertive">{{formData.given_cert_error.length}}</span></div><span class="item item-divider" ng-if="formData.given_cert_pending.length"><span translate>WOT.GIVEN_CERTIFICATIONS.PENDING_LIST</span><div class="badge item-note" style="text-align: right !important;" translate>WOT.NOT_WRITTEN_EXPIRE_IN</div></span><a class="item item-avatar ink" ng-repeat="cert in formData.given_cert_pending" ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})" ng-include="::\'templates/wot/item_certification.html\'"></a><span class="item item-divider"><span translate>WOT.GIVEN_CERTIFICATIONS.LIST</span><div class="badge item-note" translate>WOT.EXPIRE_IN</div></span><span class="item gray" ng-if="!formData.given_cert.length" translate>WOT.NO_GIVEN_CERTIFICATION </span><a class="item item-avatar ink" ng-repeat="cert in formData.given_cert" ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})" ng-include="::\'templates/wot/item_certification.html\'"></a></div>'),e.put("templates/wot/items_received_certifications.html",'<div class="list certifications" ng-class="::motions.receivedCertifications.ionListClass"><span class="item item-divider hidden-xs"><span translate>WOT.CERTIFICATIONS.SUMMARY</span></span><div id="helptip-received-certs" class="item item-icon-left item-text-wrap ink"><i class="icon ion-ribbon-b"></i> <b ng-if="formData.requirements.isSentry" class="ion-star icon-secondary" style="color: yellow; font-size: 16px; left: 25px; top: -7px;"></b> <span translate>WOT.CERTIFICATIONS.RECEIVED</span><h4 class="gray" ng-if="formData.requirements.isSentry" translate>WOT.CERTIFICATIONS.SENTRY_MEMBER</h4><cs-badge-certification cs-id="helptip-wot-view-certifications-count" requirements="formData.requirements" parameters="$root.currency.parameters"></cs-badge-certification></div><div class="item item-icon-left item-text-wrap ink" ng-if="formData.received_cert_error.length"><i class="icon ion-alert-circled"></i> <span translate>WOT.CERTIFICATIONS.ERROR</span> <span class="badge badge-assertive">{{formData.received_cert_error.length}}</span></div><span class="item item-divider" ng-if="formData.received_cert_pending.length"><span translate>WOT.CERTIFICATIONS.PENDING_LIST</span><div class="badge item-note" style="text-align: right !important;" translate>WOT.NOT_WRITTEN_EXPIRE_IN</div></span><a class="item item-avatar ink" ng-repeat="cert in formData.received_cert_pending" ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})" ng-include="::\'templates/wot/item_certification.html\'"></a><span class="item item-divider"><span translate>WOT.CERTIFICATIONS.LIST</span><div class="badge item-note" translate>WOT.EXPIRE_IN</div></span><span class="item gray" ng-if="!formData.received_cert.length" translate>WOT.NO_CERTIFICATION</span> <a class="item item-avatar ink" ng-repeat="cert in formData.received_cert" ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})" ng-include="::\'templates/wot/item_certification.html\'"></a></div>'),e.put("templates/wot/lookup_form.html",'<div class="lookupForm"><div class="item no-padding"><div class="double-padding-x padding-top-xs item-text-wrap" ng-if="::allowMultiple" style="height: 36px;"><div class="gray padding-top" ng-if="!selection.length && parameters.help">{{::parameters.help|translate}}</div><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}"><span ng-bind-html="identity.name||identity.uid||(identity.pubkey|formatPubkey)"></span> <i class="icon ion-close" ng-click="removeSelection(identity, $event)">&nbsp;&nbsp;</i></div></div><div class="item-input"><i class="icon ion-search placeholder-icon"></i> <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()" on-return="doSearchText()" select-on-click> <input type="text" class="hidden-xs hidden-sm" id="{{wotSearchTextId}}" placeholder="{{\'WOT.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()"><div class="helptip-anchor-center"><a id="helptip-wot-search-text"></a></div></div></div><div class="padding-top padding-xs padding-sm" style="display: block; height: 60px;" ng-class="::{\'hidden-xs hidden-sm\': !showResultLabel}"><div class="pull-left" ng-if="!search.loading && showResultLabel"><ng-if ng-if="search.type==\'newcomers\'"><h4 translate>WOT.LOOKUP.NEWCOMERS</h4><small class="gray no-padding" ng-if="search.total">{{\'WOT.LOOKUP.NEWCOMERS_COUNT\'|translate:{count: search.total} }}</small></ng-if><ng-if ng-if="search.type==\'pending\'"><h4 translate>WOT.LOOKUP.PENDING</h4><small class="gray no-padding" ng-if="search.total">{{\'WOT.LOOKUP.PENDING_COUNT\'|translate:{count: search.total} }}</small></ng-if><h4 ng-if="search.type==\'text\'"><span translate>COMMON.RESULTS_LIST</span> <small class="gray" ng-if="search.total">({{search.total}})</small></h4></div><div class="pull-right hidden-xs hidden-sm"><a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.type==\'newcomers\'}" ng-click="doGetNewcomers()"><i class="icon ion-person-stalker"></i> {{\'WOT.LOOKUP.BTN_NEWCOMERS\' | translate}} </a><a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.type==\'pending\'}" ng-click="doGetPending()" class="badge-balanced"><i class="icon ion-clock"></i> {{\'WOT.LOOKUP.BTN_PENDING\' | translate}} </a><a ng-if="enableWallets" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.type==\'wallets\'}" ng-click="doGetWallets()" class="badge-balanced"><i class="icon ion-card" style="left: -1px; top: 4px; position: relative; padding-left: 3px; padding-right: 3px;"></i> <b class="icon-secondary ion-card" style="left: 10px; top: -4px; font-size: 14px;"></b> {{\'MENU.WALLETS\' | translate}}</a><cs-extension-point name="filter-buttons"></cs-extension-point>&nbsp; <button class="button button-small button-stable ink" ng-click="doSearch()">{{\'COMMON.BTN_SEARCH\' | translate}}</button> <button class="button button-small button-positive {{parameters.okType}} ink" ng-if="::allowMultiple" ng-disabled="!selection.length" ng-click="next()">{{parameters.okText||\'COMMON.BTN_NEXT\' | translate}}</button></div></div><div class="text-center padding-top" ng-if="search.loading"><p class="gray" ng-if="::$root.currency.initPhase" translate>WOT.SEARCH_INIT_PHASE_WARNING</p><ion-spinner icon="android"></ion-spinner></div><ng-if ng-if="!search.loading"><div class="assertive padding" ng-if="!search.results.length"><span ng-if="search.type==\'text\'" translate>COMMON.SEARCH_NO_RESULT</span> <span ng-if="search.type==\'pending\'" translate>WOT.LOOKUP.NO_PENDING</span> <span ng-if="search.type==\'newcomers\'" translate>WOT.LOOKUP.NO_NEWCOMERS</span></div><div ng-if="::!allowMultiple" class="list {{::motion.ionListClass}}"><div ng-repeat="item in search.results track by item.id" id="helptip-wot-search-result-{{$index}}" ng-class="::{\'item-avatar item-icon-right ink\': !item.divider, \'item-divider \': item.divider}" class="item item-border-large {{::item.ionItemClass}}" ng-click="::select(item)"><span ng-if="::item.divider">{{::(\'WOT.SEARCH.DIVIDER_\' + item.index)|upper|translate}}</span><ng-include ng-if="::!item.divider" src="item.templateUrl || \'templates/wot/item_content_identity.html\'"></ng-include><i ng-if="::!item.divider" class="icon ion-ios-arrow-right"></i></div></div><div ng-if="::allowMultiple" class="list {{::motion.ionListClass}}"><ion-checkbox ng-repeat="item in search.results track by item.id" ng-model="item.checked" class="item item-border-large item-avatar ink" ng-click="toggleCheck($index, $event)"><ng-include src="::\'templates/wot/item_content_identity.html\'"></ng-include></ion-checkbox></div><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="20%"></ion-infinite-scroll></ng-if></div>'),e.put("templates/wot/lookup_lg.html",'<ion-view><ion-nav-title>{{\'MENU.WOT\' | translate}}</ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)"><i class="icon ion-android-funnel"></i></button></ion-nav-buttons><ion-content class="padding no-padding-x no-padding-sm" scroll="true"><cs-extension-point name="top"></cs-extension-point><ng-include src="::\'templates/wot/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("templates/wot/lookup_popover_actions.html",'<ion-popover-view class="fit has-header visible-sm visible-xs"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-if="enableWallets" ng-click="doGetWallets()"><i class="icon ion-card"></i> {{\'MENU.WALLETS\' | translate}} </a><a class="item item-icon-left ink" ng-click="doGetNewcomers()"><i class="icon ion-person"></i> {{\'WOT.LOOKUP.BTN_NEWCOMERS\' | translate}} </a><a class="item item-icon-left ink" ng-click="doGetPending()"><i class="icon ion-clock"></i> {{\'WOT.LOOKUP.BTN_PENDING\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/wot/lookup.html",'<ion-view left-buttons="leftButtons"><ion-tabs class="tabs-positive tabs-icon-top"><ion-tab title="{{\'WOT.LOOKUP.TITLE\'|translate}}" icon="ion-person-stalker" ui-sref="app.wot_lookup.tab_search"><ion-nav-view name="tab"></ion-nav-view></ion-tab><cs-extension-point name="tabs"></cs-extension-point></ion-tabs></ion-view>'),e.put("templates/wot/modal_lookup.html",'<ion-modal-view id="wotLookup" class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate="">COMMON.BTN_CANCEL</button><h1 class="title hidden-xs">{{::parameters.title?parameters.title:\'WOT.MODAL.TITLE\'|translate}}</h1><button class="button button-clear icon-right visible-xs ink" ng-if="allowMultiple && selection.length" ng-click="closeModal(selection)">{{::parameters.okText||\'COMMON.BTN_NEXT\' | translate}} <i ng-if="::!parameters.okText||parameters.okIcon" class="icon {{::parameters.okIcon||\'ion-ios-arrow-right\'}}"></i></button></ion-header-bar><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><div class="visible-xs visible-sm text-right stable-bg stable"><button class="button button-icon button-small-padding dark ink" ng-click="showActionsPopover($event)"><i class="icon ion-android-funnel"></i></button></div><ng-include src="::\'templates/wot/lookup_form.html\'"></ng-include></ion-content></ion-modal-view>'),e.put("templates/wot/modal_select_pubkey_identity.html",'<ion-modal-view id="transfer" class="modal-full-height modal-transfer"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>ACCOUNT.SELECT_IDENTITY_MODAL.TITLE</h1></ion-header-bar><ion-content scroll="true"><div class="padding"><p trust-as-html="\'ACCOUNT.SELECT_IDENTITY_MODAL.HELP\'|translate:{pubkey: pubkey}"></p></div><ion-list><ion-item class="item-avatar item-icon-right" ng-repeat="item in identities" ng-click="closeModal(item)"><i class="item-image icon ion-person"></i><h2>{{item.uid}}</h2><h4 class="gray"><b class="ion-key"></b> {{::item.pubkey | formatPubkey}} <span ng-if="::!item.revoked && !item.pendingRevocation && !item.isMember" class="assertive" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <span ng-if="::item.revoked || item.pendingRevocation" class="assertive bold" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</span> <span ng-if="::item.meta.invalid" class="assertive" translate>ERROR.WOT_PENDING_INVALID_BLOCK_HASH</span></h4><h4 class="dark" ng-if="::item.meta.time"><i class="ion-calendar"></i> <span translate>WOT.REGISTERED_SINCE</span> {{::item.meta.time|medianDate}}</h4><ng-if ng-if="::!item.revoked && !item.pendingRevocation && (item.certificationCount || item.pendingCertificationCount)"><cs-badge-certification requirements="item" parameters="$root.currency.parameters"></cs-badge-certification><div class="gray badge badge-secondary hidden-xs"><span translate>ACCOUNT.CERTIFICATION_COUNT</span></div></ng-if><i class="icon ion-ios-arrow-right"></i></ion-item></ion-list></ion-content></ion-modal-view>'),e.put("templates/wot/tabs/tab_given_certifications.html",'<ion-view><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-loop" ng-click="doUpdate()"></button></ion-nav-buttons><ion-content ng-init="motions.receivedCertifications=false; motions.avatar=false"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><ng-include src="::\'templates/wot/items_given_certifications.html\'"></ng-include></ion-content><div class="visible-xs visible-sm"><button id="fab-select-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin" ng-if="canSelectAndCertify || $root.tour" ng-click="selectAndCertify()"><i class="icon ion-plus"></i></button></div></ion-view>'),e.put("templates/wot/tabs/tab_lookup.html",'<ion-view><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point><button class="button button-icon button-clear" ng-click="showActionsPopover($event)"><i class="icon ion-android-funnel"></i></button></ion-nav-buttons><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doSearch()"></ion-refresher><cs-extension-point name="buttons"></cs-extension-point><ng-include src="::\'templates/wot/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("templates/wot/tabs/tab_received_certifications.html",'<ion-view><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-loop" ng-click="doUpdate()"></button></ion-nav-buttons><ion-content ng-init="motions.givenCertifications=false; motions.avatar=false;"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><ng-include src="::\'templates/wot/items_received_certifications.html\'"></ng-include></ion-content><div class="visible-xs visible-sm"><button id="fab-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin" ng-click="certify()" ng-if="(formData.hasSelf && canCertify && !alreadyCertified) || $root.tour"><i class="icon ion-ribbon-b"></i></button></div></ion-view>'),e.put("templates/wot/view_certifications.html",'<ion-view left-buttons="leftButtons"><ion-nav-title><span class="visible-xs visible-sm">{{::formData.name||formData.uid}}</span> <span class="hidden-xs hidden-sm" ng-if="!loading" translate="WOT.CERTIFICATIONS.TITLE" translate-values="{uid: formData.name || formData.uid}"></span></ion-nav-title><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content class="certifications certifications-lg"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate()"></ion-refresher><div class="hidden-xs hidden-sm text-center padding"><button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button> <button id="helptip-certs-certify" class="button button-raised button-calm icon-left ion-ribbon-b" ng-if="canCertify" ng-click="certify()" ng-disabled="disableCertifyButton">{{\'WOT.BTN_CERTIFY\' | translate}}</button> <button id="helptip-certs-select-certify" class="button button-raised button-calm icon-left" ng-if="canSelectAndCertify" ng-click="selectAndCertify()">{{\'WOT.BTN_SELECT_AND_CERTIFY\' | translate}}</button><cs-extension-point name="buttons"></cs-extension-point></div><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="row responsive-sm responsive-md responsive-lg"><div class="col no-padding" ng-if="motions.receivedCertifications.enable"><ng-include src="::\'templates/wot/items_received_certifications.html\'"></ng-include></div><div class="col col-20 col-avatar hidden-xs hidden-sm hidden-md no-padding" style="margin-top: 100px;" ng-if="motions.avatar.enable"><div class="row no-padding" ng-class="::motions.avatar.ionListClass"><div class="col text-center no-padding gray" style="margin-top: 30px;"><i class="icon ion-arrow-right-a" style="font-size:30px"></i></div><div class="col text-center no-padding"><a style="text-decoration: none;" ui-sref="app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})"><i class="avatar avatar-large" ng-if="!formData.avatar" ng-class="{\'avatar-wallet\': !formData.isMember, \'avatar-member\': formData.isMember}"></i> <i class="avatar avatar-large" ng-if="formData.avatar" style="background-image: url({{::formData.avatar.src}})"></i><h4 class="text-center" ng-class="{\'positive\': formData.isMember, \'gray\': !formData.isMember}">{{::formData.name||formData.uid}}</h4><h5 class="text-center gray"><i class="icon ion-key"></i> {{formData.pubkey|formatPubkey}}</h5><h5 class="assertive"><span ng-if="::(formData.name || formData.uid) && !formData.isMember && !revoked" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <b ng-if="::(formData.name || formData.uid) && !formData.isMember && revoked" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</b> <b ng-if="::(formData.name || formData.uid) && formData.isMember && revoked" translate>WOT.MEMBER_PENDING_REVOCATION_PARENTHESIS</b></h5></a></div><div class="col text-center no-padding gray" style="margin-top: 30px;"><i class="icon ion-arrow-right-a" style="font-size:30px"></i></div></div></div><div class="col no-padding" ng-if="motions.givenCertifications.enable"><ng-include src="::\'templates/wot/items_given_certifications.html\'"></ng-include></div></div></ion-content><div class="visible-xs visible-sm"><button id="fab-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly" ng-if="canCertify && !alreadyCertified" ng-click="certify()"><i class="icon ion-ribbon-b"></i></button> <button id="fab-select-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly" ng-if="canSelectAndCertify" ng-click="selectAndCertify()"><i class="icon ion-plus"></i></button></div></ion-view>'),e.put("templates/wot/view_identity_tx.html",'<ion-view left-buttons="leftButtons" class="view-identity-tx"><ion-nav-title><span class="visible-xs visible-sm" ng-if="!loading"><span ng-if="formData.name || formData.uid">{{formData.name || formData.uid}} </span><span ng-if="!formData.name && !formData.uid"><i class="ion-key"></i> {{formData.pubkey|formatPubkey}}</span> </span><span class="hidden-xs hidden-sm" ng-if="!loading"><ng-if ng-if="formData.name || formData.uid">{{\'WOT.OPERATIONS.TITLE\'|translate: {uid: formData.name || formData.uid} }}</ng-if><ng-if ng-if="!formData.name && !formData.uid"><i class="ion-key"></i> {{formData.pubkey|formatPubkey}} {{\'WOT.OPERATIONS.TITLE\'|translate}}</ng-if></span></ion-nav-title><ion-content scroll="true"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate(true)"></ion-refresher><div class="hidden-xs hidden-sm padding text-center"><button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button> <button class="button button-stable button-small-padding icon ion-android-download ink" ng-click="downloadHistoryFile()" title="{{\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point></div><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="list {{motion.ionListClass}}" ng-if="!loading"><div class="row"><div class="col col-15 hidden-xs hidden-sm">&nbsp;</div><div class="col"><div class="item item-tx item-divider">{{:locale:\'ACCOUNT.BALANCE_ACCOUNT\'|translate}}<div class="badge item-note" ng-class=":balance:{\'badge-assertive\': formData.balance <= 0, \'badge-balanced\': formData.balance > 0 }" ng-bind-html=":balance:formData.balance|formatAmount:{currency: $root.currency.name}"></div><div class="badge badge-secondary" ng-if="$root.settings.expertMode">(<span ng-bind-html=":balance:formData.balance| formatAmount: {useRelative: !$root.settings.useRelative, currency: $root.currency.name} "></span>)</div></div><div class="item item-icon-left" ng-if="formData.tx.errors.length"><i class="icon ion-alert-circled"></i> {{:locale:\'ACCOUNT.ERROR_TX\'|translate}}<div class="badge badge-assertive">{{formData.tx.errors.length}}</div></div><ng-if ng-if="formData.tx.pendings.length"><span class="item item-pending item-divider"><i class="ion-clock"></i> {{:locale:\'ACCOUNT.PENDING_TX\'|translate}}</span><div class="item item-pending item-tx item-icon-left" ng-repeat="tx in formData.tx.pendings" ng-init="pending=true;" ng-include="::\'templates/wallet/item_tx.html\'"></div></ng-if><ng-if ng-if="formData.tx.validating.length"><span class="item item-pending item-divider">{{:locale:\'ACCOUNT.VALIDATING_TX\'|translate}}</span><div class="item item-pending item-tx item-icon-left" ng-repeat="tx in formData.tx.validating" ng-init="validating=true;" ng-include="::\'templates/wallet/item_tx.html\'"></div></ng-if><span class="item item-divider" ng-if="!loading">{{:locale:\'ACCOUNT.LAST_TX\'|translate}} <a id="helptip-wallet-tx" style="position: relative; bottom: 0; right: 0px;">&nbsp;</a></span><div ng-repeat="tx in formData.tx.history" class="item item-tx item-icon-left" ng-include="::!tx.isUD ? \'templates/wallet/item_tx.html\' : \'templates/wallet/item_ud.html\'"></div><div class="item item-text-wrap text-center" ng-if="formData.tx.fromTime > 0"><p><a ng-click="showMoreTx()">{{:locale:\'ACCOUNT.SHOW_MORE_TX\'|translate}}</a> <span class="gray" translate="ACCOUNT.TX_FROM_DATE" translate-values="{fromTime: formData.tx.fromTime}"></span> <span class="gray">|</span> <a ng-click="showMoreTx(-1)" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div><div class="col col-15 hidden-xs hidden-sm">&nbsp;</div></div></div></ion-content></ion-view>'),
e.put("templates/wot/view_identity.html",'<ion-view left-buttons="leftButtons" class="view-identity"><ion-nav-title></ion-nav-title><ion-content scroll="true" ng-class="{\'member\': !loading && formData.isMember}"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate(true)"></ion-refresher><div class="hero"><div class="content" ng-if="!loading"><i class="avatar" ng-if=":rebind:!formData.avatar" ng-class="{\'avatar-wallet\': !formData.isMember, \'avatar-member\': formData.isMember}"></i> <i class="avatar" ng-if=":rebind:formData.avatar" style="background-image: url({{::formData.avatar.src}})"></i><ng-if ng-if=":rebind:formData.name"><h3 class="light">{{::formData.name}}</h3></ng-if><ng-if ng-if=":rebind:!formData.name"><h3 class="light" ng-if=":rebind:formData.uid">{{:rebind:formData.uid}}</h3><h3 class="light" ng-if=":rebind:!formData.uid"><i class="ion-key"></i> {{:rebind:formData.pubkey | formatPubkey}}</h3></ng-if><h4><ng-if class="assertive" ng-if=":rebind:(formData.name || formData.uid) && !formData.isMember && revoked" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</ng-if><ng-if class="assertive" ng-if=":rebind:(formData.name || formData.uid) && formData.isMember && revoked" translate>WOT.MEMBER_PENDING_REVOCATION_PARENTHESIS</ng-if><cs-extension-point name="hero"></cs-extension-point></h4></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><ng-include src="::\'templates/common/qrcode.html\'"></ng-include><a id="wot-share-anchor-{{::formData.pubkey}}"></a><div class="hidden-xs hidden-sm padding text-center"><button class="button button-stable button-small-padding icon ion-android-share-alt ink" ng-disabled="loading" ng-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point><button class="button button-stable button-small-padding icon ion-ribbon-b ink hidden-readonly" ng-click="certify()" ng-if=":rebind:formData.hasSelf" title="{{\'WOT.BTN_CERTIFY\' | translate}}" ng-disabled="disableCertifyButton"></button> <button class="button button-calm ink hidden-readonly" ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})">{{\'COMMON.BTN_SEND_MONEY\' | translate}}</button><cs-extension-point name="after-buttons"></cs-extension-point></div><div class="visible-xs visible-sm"><button id="fab-certify-{{:rebind:formData.uid}}" class="button button-fab button-fab-top-left button-fab-hero button-calm spin hidden-readonly" ng-if=":rebind:(canCertify && !alreadyCertified)" ng-click="certify()"><i class="icon ion-ribbon-b"></i></button><cs-extension-point name="buttons-top-fab"></cs-extension-point></div><div class="row no-padding"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col list {{::motion.ionListClass}}" bind-notifier="{ rebind:loading}"><span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span><ion-item class="item-icon-left item-text-wrap ink" copy-on-click="{{:rebind:formData.pubkey}}"><i class="icon ion-key"></i> <span translate>COMMON.PUBKEY</span><h4 id="pubkey" class="dark text-left">{{:rebind:formData.pubkey}}</h4></ion-item><div class="item item-icon-left item-text-wrap" ng-if=":rebind:!formData.hasSelf"><i class="icon ion-ios-help-outline positive"></i> <span translate>WOT.NOT_MEMBER_ACCOUNT</span><h4 class="gray" translate>WOT.NOT_MEMBER_ACCOUNT_HELP</h4></div><ion-item class="item-icon-left" ng-if=":rebind:formData.sigDate||formData.uid"><i class="icon ion-calendar"></i> <span translate>COMMON.UID</span><h5 class="dark" ng-if=":rebind:formData.sigDate "><span translate>WOT.REGISTERED_SINCE</span> {{:rebind:formData.sigDate|medianDate}}</h5><span class="badge badge-energized">{{:rebind:formData.uid}}</span></ion-item><a id="helptip-wot-view-certifications" class="item item-icon-left item-text-wrap item-icon-right ink" ng-if=":rebind:formData.hasSelf" ng-click="showCertifications()"><i class="icon ion-ribbon-b"></i> <b ng-if=":rebind:formData.requirements.isSentry" class="ion-star icon-secondary" style="color: yellow; font-size: 16px; left: 25px; top: -7px;"></b> <span translate>ACCOUNT.CERTIFICATION_COUNT</span><cs-badge-certification cs-id="helptip-wot-view-certifications-count" requirements="formData.requirements" parameters="{sigQty: formData.sigQty}"></cs-badge-certification><i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm" ng-if=":rebind:formData.hasSelf && formData.isMember" ng-click="showGivenCertifications()"><i class="icon ion-ribbon-a"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span><cs-badge-given-certification identity="formData" parameters="$root.currency.parameters"></cs-badge-given-certification><i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-icon-right ink" ng-if="!loading" ui-sref="app.wot_identity_tx_uid({uid:formData.uid,pubkey:formData.pubkey})"><i class="icon ion-card"></i> <span translate>WOT.ACCOUNT_OPERATIONS</span> <i class="gray icon ion-ios-arrow-right"></i></a><div class="item item-text-wrap item-icon-left item-wallet-event" ng-class="{\'assertive\': event.type==\'error\'}" ng-repeat="event in :rebind:formData.events"><i class="icon" 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> <span trust-as-html="event.message | translate:event.messageParams"></span></div><cs-extension-point name="general"></cs-extension-point><cs-extension-point name="after-general"></cs-extension-point></div><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div></div></ion-content><div class="visible-xs visible-sm" ng-hide="loading"><button id="fab-transfer" class="button button-fab button-fab-bottom-right button-assertive drop hidden-readonly" ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.uid})"><i class="icon ion-android-send"></i></button></div></ion-view>')}]),angular.module("cesium.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{APP_NAME:"Cesium",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",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:",PLEASE_REPORT_ISSUE:"Please report any issue to us!",REPORT_ISSUE:"Report an issue",BTN_OPEN_DEV_WINDOW:"Open the debug window"},HOME:{TITLE:"Cesium",WELCOME:"Welcome to the Cesium application!",WELCOME_READONLY:"Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !",MESSAGE:"Receive and send libre currency {{currency|abbreviate}}",MESSAGE_READONLY:"Real-time monitoring of libre currency {{currency|abbreviate}}",BTN_CURRENCY:"Explore currency {{currency|abbreviate}}",BTN_ABOUT:"about",BTN_HELP:"Help",BTN_NETWORK:"Network status",FREE_SOFTWARE:"Free software",FORK_ME:"Fork me!",SHOW_LICENSE:"Show license",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>.',SHOW_ALL_FEED:"Show all",READ_MORE:"Read more",FEED_SOURCE:"Source"},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",PERSIST_CACHE:"Keep navigation data (experimental)",PERSIST_CACHE_HELP:"Allows faster navigation, locally retaining the data received, for use from one session to another.",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",DISABLE_HELPTIP:"Disable 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 {{sigDate | formatFromNow}}",MEMBER_FROM:"Member since {{memberDate|medianFromNowShort}}",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:"Secret identifier",SALT_HELP:"Secret identifier",SHOW_SALT:"Display secret identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Public key or pseudonym",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 identifier and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key or pseudonym",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:{HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Authentication',BTN_AUTH:"Authenticate",GENERAL_HELP:"Please authenticate yourself:",EXPECTED_UID_HELP:'Please authenticate to the account <i class="ion-person"></i> {{uid}}:',EXPECTED_PUBKEY_HELP:'Please authenticate to the wallet <i class="ion-key"></i> {{pubkey|formatPubkey}}:',SCAN_FORM_HELP:"Scan the QR code of the <b>private key</b> of the wallet."},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 cancelled</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 secret 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 secret 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 secret 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."},SELECT_IDENTITY_MODAL:{TITLE:"Identity selection",HELP:'Several <b>different identities</b> have been sent, for the public key <span class="gray"> <i class="ion-key"></i> {{pubkey | formatPubkey}}</span>.<br/>Please select the identity to use:'},SELECT_WALLET_MODAL:{TITLE:"Wallet selection"},WALLET_LIST:{TITLE:"My wallets",BTN_NEW:"Add a wallet",BTN_DOWNLOAD:"Download the list",BTN_IMPORT_FILE_DOTS:"Import from a file...",NO_WALLET:"No secondary wallet",BTN_DELETE:"Remove a secondary wallet...",BTN_RENAME:"Rename the wallet",EXPORT_FILENAME:"my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv",TOTAL_DOTS:"Total: ",EDIT_POPOVER:{TITLE:"Rename the wallet",HELP:"Fill in the new name",NAME_HELP:"Wallet name"},IMPORT_MODAL:{TITLE:"Import secondary wallets",HELP:"To <b>import secodnary wallets</b>, please drag the file in the box below, or click in the box to search for a file.",WALLET_COUNT:"<b>{{count}}</b> new wallet{{count > 1 ? 's' : ''}}",NO_NEW_WALLET:"No new wallet"}},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.",RECOVER_ID_SELECT_FILE:"Select the <b>backup file of your identifiers</b> to use:",REVOCATION_WITH_FILE:"Revoke 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 secret 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",KEYFILE:{PUBSEC_FORMAT:"PubSec format.",PUBSEC_FORMAT_HELP:"This file format is compatible in particular with Cesium and Gannonce. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.",WIF_FORMAT:"Wallet Import Format (WIF)",WIF_FORMAT_HELP:"This format is used in particular by paper wallets. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.",EWIF_FORMAT:"Encrypted Wallet Import Format (WIF)",EWIF_FORMAT_HELP:"This format is used in particular by paper wallets. However, <b>the keychain is encrypted</b> from a passphrase of your choice.",PASSWORD_POPUP:{TITLE:"Keychain file encrypted",HELP:"Please enter the passphrase:",PASSWORD_HELP:"Passphrase"},ERROR:{BAD_PASSWORD:"Bad passphrase",BAD_CHECKSUM:"Bad checksum"}}},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",SUB_TITLE_ALL:"Empty the account",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add a comment",REST:"Rest of account",REST_TO:"to",WARN_COMMENT_IS_PUBLIC:"Please note that <b>comments are public</b> (not encrypted).",MODAL:{TITLE:"Transfer"}},ERROR:{UNKNOWN_URI_FORMAT:"Unknown URI format",PUBKEY_INVALID_CHECKSUM:"Invalid public key (bad checksum).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",DOWNLOAD_KEYFILE_FAILED:"Failed to generate the keychain file.",EQUALS_TO_PSEUDO:"Must be different from pseudonym",EQUALS_TO_SALT:"Must be different from secret identifier",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"This field value is too short.",FIELD_TOO_SHORT_WITH_LENGTH:"Value is too short (min {{minLength]] characters).",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.",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.",INVALID_PUBKEY_CHECKSUM:"Invalid checksum.",IDENTITY_REVOKED:"This identity <b>has been revoked</b>. It can no longer become a member.",IDENTITY_REVOKED_WITH_TIME:"This identity <b>has been revoked {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). 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",IDENTITY_TX_FAILED:"Error while getting identity's transactions",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_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member (or old 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 secret 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>.",ISSUE_524_TX_FAILED:"Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.",ADD_SECONDARY_WALLET_FAILED:"Unable to add secondary wallet.",REMOVE_SECONDARY_WALLET_FAILED:"Unable to remove secondary wallet.",UPDATE_WALLET_LIST_FAILED:"Unable to refresh the list of wallets.",LOAD_WALLET_LIST_FAILED:"Unable to load the list of wallets.",SAVE_WALLET_LIST_FAILED:"Unable to save the list of wallets.",COULD_NOT_ADD_MAIN_WALLET:"This wallet <b>is the main account</b> with which you are connected. Unable to add it as a secondary wallet.",COULD_NOT_ADD_EXISTING_WALLET:"Wallet already existing in the list.",UNKNOWN_WALLET_ID:"Unknown secondary wallet.",RESTORE_WALLET_LIST_FAILED:"Unable to restore the list of wallets.",INVALID_FILE_FORMAT:"Invalid file format.",SAME_TX_RECIPIENT:"The recipient must be different from the issuer."},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}}).",IDENTITY_NEED_MEMBERSHIP:"This identity did not send a membership request. She will have to if she wishes to become a member.",HAS_ALTERNATIVE_IDENTITIES:"There are <b>multiple identities</b> attached to this public key. <b>Before any certification</b>, please <a ng-click=\"doQuickFix('showSelectIdentities')\">check other identities</a> to choose the correct one, or contact the wallet owner.",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>",TRANSFER_ALL:"<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><br/><li> - Rest : <b>{{restAmount}} {{unit}}</b> to <b>{{restTo}}</b></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>",MEMBERSHIP:"Your membership request 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?",ISSUE_524_SEND_LOG:"The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>"},MODE:{DEMO:{BADGE:"Demo",MODE:"Demonstration mode",FEATURE_NOT_AVAILABLE:"Functionality <b>not available</b> on this demonstration site.",MODE_HELP:"Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.",INSTALL_HELP:"For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."},READONLY:{BADGE:"Monit",MODE:"Monitoring mode",MODE_HELP:"Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.",INSTALL_HELP:"If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."}},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 secret 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 secret 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 secret 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:"Connection methods",METHOD_DEF:"Several options are available to connect to a portfolios: <br/> - The connection <b>with salt (simple or advanced)</b> mixes your password with the secret identifier, to limit the attempts of piracy<br/> - The connection <b>using public key</b> prevents you from entering your credentials, which you will be asked only when an operation need it.<br/> - The connection <b>using keychain file</b> will read the public and private keys of the account from a file without the need to enter credentials. Several file formats are possible."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the secret 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.',WOT:"Web of Trust (WoT)",WOT_DEF:"The Web of Trust is made up of all the members of the currency, and the links of certification which connect them.",DISTANCE_RULE:"Distance rule",DISTANCE_RULE_DEF:"The rule of distance defines <b>a maximum distance to meet</b> between an applicant and a minimum number of referring member. This distance is calculated using the certification links."},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_WALLETS:"The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.",MENU_BTN_TX:"The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, 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_FREE_ACCOUNT'|translate}}</b> below.",END_READONLY:"This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."}},API:{COMMON:{LINK_DOC:"API documentation",LINK_DOC_HELP:"API documentation for developers",LINK_STANDARD_APP:"Standard version",LINK_STANDARD_APP_HELP:"Open standard version of {{'COMMON.APP_NAME'|translate}}",CONNECTION_ERROR:"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or contact the web site administrator."},HOME:{TITLE:"{{'COMMON.APP_NAME'|translate}} API Documentation",MESSAGE:'Welcome to the {{\'COMMON.APP_NAME\'|translate}} <b>API documentation </b>.<br/>Connect your web site to <a href="http://duniter.org" target="_system">Duniter</a> very easily!',MESSAGE_SHORT:'Connect your websites to <a href="http://duniter.org" target="_system">Duniter</a> very easily!',DOC_HEADER:"Available services:"},TRANSFER:{TITLE:"{{'COMMON.APP_NAME'|translate}} - Online payment",TITLE_SHORT:"Online payment",SUMMARY:"Order summary:",AMOUNT:"Amount:",AMOUNTS_HELP:"Please select the amount:",NAME:"Name:",PUBKEY:"Public key of the recipient:",COMMENT:"Order reference:",NODE:"Peer address:",DEMO:{SALT:"demo",PASSWORD:"demo",PUBKEY:"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",HELP:"<b>Demonstration mode</b>: No payment will actually be sent during this simulation.<br/>Please use credentials: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",BAD_CREDENTIALS:"Invalid credentials.<br/>In demonstration mode, credentials should be: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}"},INFO:{SUCCESS_REDIRECTING_WITH_NAME:"Payment sent.<br/>Redirect to <b>{{name}}</b>...",SUCCESS_REDIRECTING:"Payment sent.<br/>Redirect to the seller's website...",CANCEL_REDIRECTING_WITH_NAME:"Payment cancelled.<br/>Redirect to <b>{{name}}</b>...",CANCEL_REDIRECTING:"Payment cancelled.<br/>Redirect to the seller's website..."},ERROR:{TRANSFER_FAILED:"Payment failed"}},DOC:{DESCRIPTION_DIVIDER:"Description",URL_DIVIDER:"Calling address",PARAMETERS_DIVIDER:"Parameters",AVAILABLE_PARAMETERS:"Here is the list of al available parameters:",DEMO_DIVIDER:"Try it !",DEMO_HELP:"To test this service, click on this button. The result content will be display below.",DEMO_RESULT:"Result returned by call:",DEMO_RESULT_PEER:"Peer address used:",DEMO_SUCCEED:'<i class="icon ion-checkmark"></i> Success!',DEMO_CANCELLED:'<i class="icon ion-close"></i> Cancelled by user',INTEGRATE_DIVIDER:"Website integration",INTEGRATE_CODE:"Code:",INTEGRATE_RESULT:"Result preview:",INTEGRATE_PARAMETERS:"Parameters",TRANSFER:{TITLE:"Payments",DESCRIPTION:"From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:",PARAM_PUBKEY:"Recipient's public key",PARAM_PUBKEY_HELP:"Recipient's public key (required)",PARAM_AMOUNT:"Amount",PARAM_AMOUNT_HELP:"Transaction amount (required)",PARAM_COMMENT:"Reference (or comment)",PARAM_COMMENT_HELP:"Reference or comment. You will allow for example to identify the payment in the BlockChain.",PARAM_NAME:"Name (of recipient or website)",PARAM_NAME_HELP:'The name of your website. This can be a readable name (eg "My online site"), or a web address (eg "www.MySite.com").',PARAM_REDIRECT_URL:"URL redirection",PARAM_REDIRECT_URL_HELP:'URL redirection after sending payment, after the payment has been sent. Can contain the following strings, which will be replaced by the values of the transaction: "{tx}", "{hash}", "{comment}", "{amount}" and "{pubkey}".',PARAM_CANCEL_URL:"URL if cancelled",PARAM_CANCEL_URL_HELP:'URL in case of cancellation. Can contain the following strings, which will be replaced: "{comment}", "{amount}" and "{pubkey}".',PARAM_PREFERRED_NODE:"Preferred Duniter peer",PARAM_PREFERRED_NODE_HELP:'Peer address (URL) to use preferably ("g1.domain.com:443" or "https://g1.domain.com")',EXAMPLES_HELP:"Examples of integration:",EXAMPLE_BUTTON:"HTML Button",EXAMPLE_BUTTON_DEFAULT_TEXT:"Pay in {{currency|abbreviate}}",EXAMPLE_BUTTON_DEFAULT_STYLE:"Custom style",EXAMPLE_BUTTON_TEXT_HELP:"Button text",EXAMPLE_BUTTON_BG_COLOR:"Background color",EXAMPLE_BUTTON_BG_COLOR_HELP:"eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)",EXAMPLE_BUTTON_FONT_COLOR:"Font color",EXAMPLE_BUTTON_FONT_COLOR_HELP:"eg: black, orange, rgb(180,180,180)",EXAMPLE_BUTTON_TEXT_ICON:"Icon",EXAMPLE_BUTTON_TEXT_WIDTH:"Width",EXAMPLE_BUTTON_TEXT_WIDTH_HELP:"eg: 200px, 50%",EXAMPLE_BUTTON_ICON_NONE:"No icon",EXAMPLE_BUTTON_ICON_DUNITER:"Duniter logo",EXAMPLE_BUTTON_ICON_CESIUM:"Cesium logo",EXAMPLE_BUTTON_ICON_G1_COLOR:"Ğ1 logo",EXAMPLE_BUTTON_ICON_G1_BLACK:"Ğ1 logo (outline)"}}}}),e.translations("en",{COMMON:{APP_NAME:"Cesium",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",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:",PLEASE_REPORT_ISSUE:"Please report any issue to us!",REPORT_ISSUE:"Report an issue",BTN_OPEN_DEV_WINDOW:"Open the debug window"},HOME:{TITLE:"Cesium",WELCOME:"Welcome to the Cesium application!",WELCOME_READONLY:"Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !",MESSAGE:"Receive and send libre currency {{currency|abbreviate}}",MESSAGE_READONLY:"Real-time monitoring of libre currency {{currency|abbreviate}}",BTN_CURRENCY:"Explore currency {{currency|abbreviate}}",BTN_ABOUT:"about",BTN_HELP:"Help",BTN_NETWORK:"Network status",FREE_SOFTWARE:"Free software",FORK_ME:"Fork me!",SHOW_LICENSE:"Show license",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>.',SHOW_ALL_FEED:"Show all",READ_MORE:"Read more",FEED_SOURCE:"Source"},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",PERSIST_CACHE:"Keep navigation data (experimental)",PERSIST_CACHE_HELP:"Allows faster navigation, locally retaining the data received, for use from one session to another.",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",DISABLE_HELPTIP:"Disable 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 {{sigDate | formatFromNow}}",MEMBER_FROM:"Member since {{memberDate|medianFromNowShort}}",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:"Secret identifier",SALT_HELP:"Secret identifier",SHOW_SALT:"Display secret identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Public key or pseudonym",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 identifier and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key or pseudonym",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:{HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Authentication',BTN_AUTH:"Authenticate",GENERAL_HELP:"Please authenticate yourself:",EXPECTED_UID_HELP:'Please authenticate to the account <i class="ion-person"></i> {{uid}}:',EXPECTED_PUBKEY_HELP:'Please authenticate to the wallet <i class="ion-key"></i> {{pubkey|formatPubkey}}:',SCAN_FORM_HELP:"Scan the QR code of the <b>private key</b> of the wallet."},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 secret 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 secret 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 secret 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."},SELECT_IDENTITY_MODAL:{TITLE:"Identity selection",HELP:'Several <b>different identities</b> have been sent, for the public key <span class="gray"> <i class="ion-key"></i> {{pubkey | formatPubkey}}</span>.<br/>Please select the identity to use:'},SELECT_WALLET_MODAL:{TITLE:"Wallet selection"},WALLET_LIST:{TITLE:"My wallets",BTN_NEW:"Add a wallet",BTN_DOWNLOAD:"Download the list",BTN_IMPORT_FILE_DOTS:"Import from a file...",NO_WALLET:"No secondary wallet",BTN_DELETE:"Remove a secondary wallet...",BTN_RENAME:"Rename the wallet",EXPORT_FILENAME:"my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv",TOTAL_DOTS:"Total: ",EDIT_POPOVER:{TITLE:"Rename the wallet",HELP:"Fill in the new name",NAME_HELP:"Wallet name"},IMPORT_MODAL:{TITLE:"Import secondary wallets",HELP:"To <b>import secodnary wallets</b>, please drag the file in the box below, or click in the box to search for a file.",WALLET_COUNT:"<b>{{count}}</b> new wallet{{count > 1 ? 's' : ''}}",NO_NEW_WALLET:"No new wallet"}},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.",RECOVER_ID_SELECT_FILE:"Select the <b>backup file of your identifiers</b> to use:",REVOCATION_WITH_FILE:"Revoke 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 secret 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",KEYFILE:{PUBSEC_FORMAT:"PubSec format.",PUBSEC_FORMAT_HELP:"This file format is compatible in particular with Cesium and Gannonce. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.",WIF_FORMAT:"Wallet Import Format (WIF)",WIF_FORMAT_HELP:"This format is used in particular by paper wallets. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.",EWIF_FORMAT:"Encrypted Wallet Import Format (WIF)",EWIF_FORMAT_HELP:"This format is used in particular by paper wallets. However, <b>the keychain is encrypted</b> from a passphrase of your choice.",PASSWORD_POPUP:{TITLE:"Keychain file encrypted",HELP:"Please enter the passphrase:",PASSWORD_HELP:"Passphrase"},ERROR:{BAD_PASSWORD:"Bad passphrase",BAD_CHECKSUM:"Bad checksum"}}},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",SUB_TITLE_ALL:"Empty the account",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add a comment",REST:"Rest of account",REST_TO:"to",WARN_COMMENT_IS_PUBLIC:"Please note that <b>comments are public</b> (not encrypted).",MODAL:{TITLE:"Transfer"}},ERROR:{UNKNOWN_URI_FORMAT:"Unknown URI format",PUBKEY_INVALID_CHECKSUM:"Invalid public key (bad checksum).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",DOWNLOAD_KEYFILE_FAILED:"Failed to generate the keychain file.",EQUALS_TO_PSEUDO:"Must be different from pseudonym",EQUALS_TO_SALT:"Must be different from secret identifier",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"This field value is too short.",FIELD_TOO_SHORT_WITH_LENGTH:"Value is too short (min {{minLength]] characters).",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.",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.",INVALID_PUBKEY_CHECKSUM:"Invalid checksum.",IDENTITY_REVOKED:"This identity <b>has been revoked</b>. It can no longer become a member.",IDENTITY_REVOKED_WITH_TIME:"This identity <b>has been revoked {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). 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",IDENTITY_TX_FAILED:"Error while getting identity's transactions",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_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member (or old 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 secret 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>.",ISSUE_524_TX_FAILED:"Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.",ADD_SECONDARY_WALLET_FAILED:"Unable to add secondary wallet.",REMOVE_SECONDARY_WALLET_FAILED:"Unable to remove secondary wallet.",UPDATE_WALLET_LIST_FAILED:"Unable to refresh the list of wallets.",LOAD_WALLET_LIST_FAILED:"Unable to load the list of wallets.",SAVE_WALLET_LIST_FAILED:"Unable to save the list of wallets.",COULD_NOT_ADD_MAIN_WALLET:"This wallet <b>is the main account</b> with which you are connected. Unable to add it as a secondary wallet.",COULD_NOT_ADD_EXISTING_WALLET:"Wallet already existing in the list.",UNKNOWN_WALLET_ID:"Unknown secondary wallet.",RESTORE_WALLET_LIST_FAILED:"Unable to restore the list of wallets.",INVALID_FILE_FORMAT:"Invalid file format.",SAME_TX_RECIPIENT:"The recipient must be different from the issuer."},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}}).",IDENTITY_NEED_MEMBERSHIP:"This identity did not send a membership request. She will have to if she wishes to become a member.",HAS_ALTERNATIVE_IDENTITIES:"There are <b>multiple identities</b> attached to this public key. <b>Before any certification</b>, please <a ng-click=\"doQuickFix('showSelectIdentities')\">check other identities</a> to choose the correct one, or contact the wallet owner.",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>",TRANSFER_ALL:"<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><br/><li> - Rest : <b>{{restAmount}} {{unit}}</b> to <b>{{restTo}}</b></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>",MEMBERSHIP:"Your membership request 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?",ISSUE_524_SEND_LOG:"The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>"},MODE:{DEMO:{BADGE:"Demo",MODE:"Demonstration mode",FEATURE_NOT_AVAILABLE:"Functionality <b>not available</b> on this demonstration site.",MODE_HELP:"Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.",INSTALL_HELP:"For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."},READONLY:{BADGE:"Monit",MODE:"Monitoring mode",MODE_HELP:"Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.",INSTALL_HELP:"If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."}},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 secret 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 secret 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 secret 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:"Connection methods",METHOD_DEF:"Several options are available to connect to a portfolios: <br/> - The connection <b>with salt (simple or advanced)</b> mixes your password with the secret identifier, to limit the attempts of piracy<br/> - The connection <b>using public key</b> prevents you from entering your credentials, which you will be asked only when an operation need it.<br/> - The connection <b>using keychain file</b> will read the public and private keys of the account from a file without the need to enter credentials. Several file formats are possible."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the secret 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.',WOT:"Web of Trust (WoT)",WOT_DEF:"The Web of Trust is made up of all the members of the currency, and the links of certification which connect them.",DISTANCE_RULE:"Distance rule",DISTANCE_RULE_DEF:"The rule of distance defines <b>a maximum distance to meet</b> between an applicant and a minimum number of referring member. This distance is calculated using the certification links."},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_WALLETS:"The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.",MENU_BTN_TX:"The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, 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_FREE_ACCOUNT'|translate}}</b> below.",END_READONLY:"This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."}},API:{COMMON:{LINK_DOC:"API documentation",LINK_DOC_HELP:"API documentation for developers",LINK_STANDARD_APP:"Standard version",LINK_STANDARD_APP_HELP:"Open standard version of {{'COMMON.APP_NAME'|translate}}",
CONNECTION_ERROR:"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or contact the web site administrator."},HOME:{TITLE:"{{'COMMON.APP_NAME'|translate}} API Documentation",MESSAGE:'Welcome to the {{\'COMMON.APP_NAME\'|translate}} <b>API documentation </b>.<br/>Connect your web site to <a href="http://duniter.org" target="_system">Duniter</a> very easily!',MESSAGE_SHORT:'Connect your websites to <a href="http://duniter.org" target="_system">Duniter</a> very easily!',DOC_HEADER:"Available services:"},TRANSFER:{TITLE:"{{'COMMON.APP_NAME'|translate}} - Online payment",TITLE_SHORT:"Online payment",SUMMARY:"Order summary:",AMOUNT:"Amount:",AMOUNTS_HELP:"Please select the amount:",NAME:"Name:",PUBKEY:"Public key of the recipient:",COMMENT:"Order reference:",NODE:"Peer address:",DEMO:{SALT:"demo",PASSWORD:"demo",PUBKEY:"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",HELP:"<b>Demonstration mode</b>: No payment will actually be sent during this simulation.<br/>Please use credentials: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",BAD_CREDENTIALS:"Invalid credentials.<br/>In demonstration mode, credentials should be: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}"},INFO:{SUCCESS_REDIRECTING_WITH_NAME:"Payment sent.<br/>Redirect to <b>{{name}}</b>...",SUCCESS_REDIRECTING:"Payment sent.<br/>Redirect to the seller's website...",CANCEL_REDIRECTING_WITH_NAME:"Payment cancelled.<br/>Redirect to <b>{{name}}</b>...",CANCEL_REDIRECTING:"Payment cancelled.<br/>Redirect to the seller's website..."},ERROR:{TRANSFER_FAILED:"Payment failed"}},DOC:{DESCRIPTION_DIVIDER:"Description",URL_DIVIDER:"Calling address",PARAMETERS_DIVIDER:"Parameters",AVAILABLE_PARAMETERS:"Here is the list of al available parameters:",DEMO_DIVIDER:"Try it !",DEMO_HELP:"To test this service, click on this button. The result content will be display below.",DEMO_RESULT:"Result returned by call:",DEMO_RESULT_PEER:"Peer address used:",DEMO_SUCCEED:'<i class="icon ion-checkmark"></i> Success!',DEMO_CANCELLED:'<i class="icon ion-close"></i> Canceled by user',INTEGRATE_DIVIDER:"Website integration",INTEGRATE_CODE:"Code:",INTEGRATE_RESULT:"Result preview:",INTEGRATE_PARAMETERS:"Parameters",TRANSFER:{TITLE:"Payments",DESCRIPTION:"From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:",PARAM_PUBKEY:"Recipient's public key",PARAM_PUBKEY_HELP:"Recipient's public key (required)",PARAM_AMOUNT:"Amount",PARAM_AMOUNT_HELP:"Transaction amount (required)",PARAM_COMMENT:"Reference (or comment)",PARAM_COMMENT_HELP:"Reference or comment. You will allow for example to identify the payment in the BlockChain.",PARAM_NAME:"Name (of recipient or website)",PARAM_NAME_HELP:'The name of your website. This can be a readable name (eg "My online site"), or a web address (eg "www.MySite.com").',PARAM_REDIRECT_URL:"URL redirection",PARAM_REDIRECT_URL_HELP:'URL redirection after sending payment, after the payment has been sent. Can contain the following strings, which will be replaced by the values of the transaction: "{tx}", "{hash}", "{comment}", "{amount}" and "{pubkey}".',PARAM_CANCEL_URL:"URL if cancelled",PARAM_CANCEL_URL_HELP:'URL in case of cancellation. Can contain the following strings, which will be replaced: "{comment}", "{amount}" and "{pubkey}".',PARAM_PREFERRED_NODE:"Preferred Duniter peer",PARAM_PREFERRED_NODE_HELP:'Peer address (URL) to use preferably ("g1.domain.com:443" or "https://g1.domain.com")',EXAMPLES_HELP:"Examples of integration:",EXAMPLE_BUTTON:"HTML Button",EXAMPLE_BUTTON_DEFAULT_TEXT:"Pay in {{currency|abbreviate}}",EXAMPLE_BUTTON_DEFAULT_STYLE:"Custom style",EXAMPLE_BUTTON_TEXT_HELP:"Button text",EXAMPLE_BUTTON_BG_COLOR:"Background color",EXAMPLE_BUTTON_BG_COLOR_HELP:"eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)",EXAMPLE_BUTTON_FONT_COLOR:"Font color",EXAMPLE_BUTTON_FONT_COLOR_HELP:"eg: black, orange, rgb(180,180,180)",EXAMPLE_BUTTON_TEXT_ICON:"Icon",EXAMPLE_BUTTON_TEXT_WIDTH:"Width",EXAMPLE_BUTTON_TEXT_WIDTH_HELP:"eg: 200px, 50%",EXAMPLE_BUTTON_ICON_NONE:"No icon",EXAMPLE_BUTTON_ICON_DUNITER:"Duniter logo",EXAMPLE_BUTTON_ICON_CESIUM:"Cesium logo",EXAMPLE_BUTTON_ICON_G1_COLOR:"Ğ1 logo",EXAMPLE_BUTTON_ICON_G1_BLACK:"Ğ1 logo (outline)"}}}}),e.translations("eo-EO",{COMMON:{APP_NAME:"Cesium",APP_VERSION:"v{{version}}",APP_BUILD:"date : {{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:"Serĉ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 elekti ĝ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>(Atendado 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:"Pezo:",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",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:",PLEASE_REPORT_ISSUE:"Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn",REPORT_ISSUE:"Sciigi problemon",BTN_OPEN_DEV_WINDOW:"Malfermi la fenestron pri malfuŝigado"},HOME:{TITLE:"Cesium",WELCOME:"Bonvenon ĉe la programo Cesium!",MESSAGE:"Ricevu kaj sendu liberan monon {{currency|abbreviate}}",BTN_CURRENCY:"Esploru la monon {{name|abbreviate}}",BTN_ABOUT:"prie",BTN_HELP:"Reta helpo",REPORT_ISSUE:"fuŝaĵo",NOT_YOUR_ACCOUNT_QUESTION:'Vi ne posedas la konton <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b> ?',BTN_CHANGE_ACCOUNT:"Malkonektu tiun ĉi konton",CONNECTION_ERROR:'Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ elektu alian 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",WALLETS_SETTINGS:"Miaj monujoj",USE_WALLETS_ENCRYPTION:"Sekurigi la liston?",USE_WALLETS_ENCRYPTION_HELP:"Ebligas sekurigi la liston de viaj monujoj (per ĉifrado), postulante aŭtentigado por aliri ilin.",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?",TX_HISTORY_AUTO_REFRESH:"Aktualigi aŭtomate",TX_HISTORY_AUTO_REFRESH_HELP:"Aktualigas la saldon kaj la spezojn aŭtomate, por ĉiu nova bloko de la reto.",AUTHENTICATION_SETTINGS:"Aŭtentigado",KEEP_AUTH:"Aŭtomata malaŭtentigado",KEEP_AUTH_SHORT:"Malaŭtentigado",KEEP_AUTH_HELP:"Difinas la momenton, kiam la aŭtentigado estas forviŝita de la memoro.",KEEP_AUTH_OPTION:{NEVER:"Post ĉiu ago",SECONDS:"Post {{value}}s de neatktiveco",MINUTE:"Post {{value}}min de neatktiveco",MINUTES:"Post {{value}}min de neatktiveco",HOUR:"Post {{value}}h de neatktiveco",ALWAYS:"Fine de la sesio"},KEYRING_FILE:"Dosiero pri ŝlosilaro",KEYRING_FILE_HELP:'Ebligas <b>konektiĝi</b> aŭtomate por ĉiu ekuzo<br/>kaj eĉ <b>aŭtentiĝi</b> (nur se "Finiĝo de la aŭtentiĝo" estas agordita kiel "fine de la sesio").',REMEMBER_ME:"Memori min?",REMEMBER_ME_HELP:"Ebligas resti identigita de sesio al alia, loke konservante la publikan ŝlosilon.",PLUGINS_SETTINGS:"Krom-programoj",BTN_RESET:"Restarigi la originajn valorojn",EXPERT_MODE:"Aktivigi la spertan moduson",EXPERT_MODE_HELP:"Ebligas pli detalan afiŝadon.",BLOCK_VALIDITY_WINDOW:"Limtempo pri necerteco de la blokoj",BLOCK_VALIDITY_WINDOW_SHORT:"Limtempo pri necerteco",BLOCK_VALIDITY_WINDOW_HELP:"Limtempo antaŭ ol taksi, ke iu informo estas validigita",BLOCK_VALIDITY_OPTION:{NONE:"Neniu limtempo",N:"{{time | formatDuration}} ({{count}} blokoj)"},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:"Datenoj",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 depost 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:"Reto de fido",NEWCOMERS:"Novaj membroj",NEWCOMERS_COUNT:"{{count}} membroj",PENDING:"Atendantaj enskribiĝoj",PENDING_COUNT:"{{count}} atendantaj enskribiĝoj",REGISTERED:"Enskribita {{sigDate | formatFromNow}}",MEMBER_FROM:"Membro depost {{memberDate|medianFromNowShort}}",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:"Sekreta identigilo",SALT_HELP:"Sekreta identigilo",SHOW_SALT:"Afiŝi la sekretan identigilon?",PASSWORD:"Pasvorto",PASSWORD_HELP:"Pasvorto",PUBKEY_HELP:"Publika ŝlosilo aŭ pseŭdonimo",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:"Sekreta 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',BTN_AUTH:"Aŭtentiĝi",GENERAL_HELP:"Bonvolu aŭtentiĝi:",EXPECTED_UID_HELP:'Bonvolu aŭtentiĝi ĉe la konto <i class="ion-person"></i> {{uid}} :',EXPECTED_PUBKEY_HELP:'Bonvolu aŭtentiĝi ĉe la monujo <br class="visible-xs"/><i class="ion-key"></i> {{pubkey|formatPubkey}} :',SCAN_FORM_HELP:"Skani la QR-kodon de la <b>privata ŝlosilo</b> de la monujo."},ACCOUNT:{TITLE:"Mia konto",BALANCE:"Saldo",LAST_TX:"Lastaj spezoj validigitaj",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",VALIDATING_TX:"Spezoj traktitaj, ne validigitaj",ERROR_TX:"Spezoj ne realigitaj",ERROR_TX_SENT:"Spezoj malsukcesintaj",PENDING_TX_RECEIVED:"Spezoj atendantaj ricevon",EVENTS:"Okazaĵoj",OUT_DISTANCED:"Viaj nunaj atestaĵoj venas de tro izolita grupo de la <a ng-click=\"showHelpModal('wot')\">Reto de Fido</a> (RdF): al la <a ng-click=\"showHelpModal('distance_rule')\">regulo de maksimuma distanco</a> vi ne konformiĝas.<br/>Vi devas akiri atestaĵojn venantajn de aliaj lokoj de la RdF, aŭ atendi ke tiu ĉi densiĝos.",WAITING_MEMBERSHIP:"Aliĝo-peto sendita. Atendanta akcepton.",WAITING_CERTIFICATIONS:"Vi devas <b>akiri {{needCertificationCount}} atestaĵo(j)n</b> por fariĝi membro kaj produkti la <a ng-click=\"showHelpModal('ud')\">Universalan Dividendon</a>. Via konto tamen estas jam funkcianta, por ricevi kaj efektivigi pagojn.",WAITING_CERTIFICATIONS_HELP:'Por akiri viajn atestaĵojn, petu nur membrojn <b>kiuj sufiĉe konas vin</b>, kiel postulas <a ng-click="showLicenseModal()">la licenco de la mono</a>, kiun vi akceptis.<br/>Se vi ne konas sufiĉe da membroj, sciigu tion ĉe <a ng-click="openLink($event, $root.settings.userForumUrl)">la forumo por uzantoj</a>.',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>.",NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED:"Vi ne plu estas membro de la mono, <b>pro manko da atestaĵoj</b>. Pensu <a ng-click=\"doQuickFix('renew')\">revalidigi vian aliĝon</a>.",NO_WAITING_MEMBERSHIP:"Neniu aliĝo-peto atendanta. Se vi deziras <b>fariĝi membro</b>, pensu <a ng-click=\"doQuickFix('membership')\">sendi la aliĝo-peton</a>.",CERTIFICATION_COUNT:"Ricevitaj atestaĵoj",CERTIFICATION_COUNT_SHORT:"Atestaĵoj",SIG_STOCK:"Senditaj atestaĵoj",BTN_RECEIVE_MONEY:"Enkasigi",BTN_SELECT_ALTERNATIVES_IDENTITIES:"Aliri alian identecon...",BTN_FIX_MEMBERSHIP:"Resendi la aliĝo-peton...",BTN_MEMBERSHIP_RENEW:"Revalidigi la aliĝon",BTN_MEMBERSHIP_RENEW_DOTS:"Revalidigi la aliĝon...",BTN_MEMBERSHIP_OUT_DOTS:"Ĉesigi la aliĝon...",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:"Kreado de konto",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."},SELECT_IDENTITY_MODAL:{TITLE:"Elekto de la identeco",HELP:'Pluraj <b>malsamaj identecoj</b> estis senditaj, por la publika ŝlosilo <span class="gray"><i class="ion-key"></i> {{pubkey|formatPubkey}}</span>.<br/>Bonvolu elekti la dosierujon uzotan:'},SELECT_WALLET_MODAL:{TITLE:"Elekto de la monujo"},WALLET_LIST:{TITLE:"Miaj monujoj",BTN_NEW:"Aldoni monujon",BTN_DOWNLOAD:"Elŝuti la liston",BTN_IMPORT_FILE_DOTS:"Enporti el dosiero...",NO_WALLET:"Neniu kroma monujo",BTN_DELETE:"Forigi kroman monujon...",BTN_RENAME:"Renomi la monujon",EXPORT_FILENAME:"miaj_monujoj-{{pubkey|formatPubkey}}-{{currency}}.csv",TOTAL_DOTS:"Sumo: ",EDIT_POPOVER:{TITLE:"Renomi la monujon",HELP:"Sciigu la novan nomon",NAME_HELP:"Nomo de la monujo"},IMPORT_MODAL:{TITLE:"Enporti monujojn",HELP:"Por <b>enporti monujojn</b>, bonvolu glitigi en la ĉi-suban zonon la dosieron pri la listo de monujoj, aŭ alklaki la zonon por serĉadi dosieron.",WALLET_COUNT:"<b>{{count}}</b> nova{{count > 1 ? 'j' : ''}} monujo{{count > 1 ? 'j' : ''}}",NO_NEW_WALLET:"Neniu nova monujo"}},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.",GENERATE_KEYFILE:"Krei mian dosieron pri ŝlosilaro...",GENERATE_KEYFILE_HELP:"Kreas dosieron, kiu ebligas al vi aŭtentiĝi sen tajpi viajn identigilojn.<br/><b>Atenton:</b> tiu dosiero entenos vian konto-ŝlosilaron (publikan kaj sekretan ŝlosilojn); do tre gravas meti ĝin en sekuran lokon!",KEYFILE_FILENAME:"ŝlosilaro-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey",MEMBERSHIP_IN:"Transformi en membro-konton...",MEMBERSHIP_IN_HELP:"Ebligas <b>transformi</b> simplan monujo-konton <b>en membro-konton</b>, sendante aliĝo-peton. Utilas nur se vi ne havas jam alian membro-konton.",SEND_IDENTITY:"Publikigi sian identecon...",SEND_IDENTITY_HELP:"Ebligas kunligi pseŭdonimon kun tiu ĉi konto, sed <b>sen fari aliĝo-peton</b> por iĝi membro. Tiu kunligo kutime ne utilas, ĉar la valideco de tiu kunligo de pseŭdonimo estas limigita en la tempo.",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_DESCRIPTION:"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_WITH_FILE_HELP:"Por <b>definitive nuligi</b> membro-konton, bonvolu glitigi en la ĉi-suban zonon vian dosieron pri nuligo, aŭ alklaki la zonon por serĉadi dosieron.",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",KEYFILE:{PUBSEC_FORMAT:"Strukturo PubSec.",PUBSEC_FORMAT_HELP:"Tiu strukturo stokas vian ŝlosilaron laŭ tre simpla maniero. Ĝi kongruas aparte kun Cesium, ğannonce kaj Duniter.<br/><b>Atenton:</b>La dosiero <b>ne estas ĉifrita</b> (la sekreta ŝlosilo klare aperas en ĝi); bonvolu do stoki ĝin en sekura loko!",WIF_FORMAT:"Strukturo WIF (Wallet Import Format) - v1",WIF_FORMAT_HELP:"Tiu strukturo stokas vian ŝlosilaron inkluzivante en ĝin kontrol-sumon por kontroli la sendifektecon de la dosiero. Ĝi kongruas aparte kun la paper-monujoj (Duniter paper wallet).<br/><b>Atenton:</b>La dosiero <b>ne estas ĉifrita</b> (la sekreta ŝlosilo klare aperas en ĝi); bonvolu do stoki ĝin en sekura loko!",EWIF_FORMAT:"Strukturo EWIF (Encrypted Wallet Import Format) - v1",EWIF_FORMAT_HELP:"Tiu strukturo stokas vian ŝlosilaron <b>laŭ ĉifrita maniero</b> dank'al sekreta frazo elektita de vi. Ĝi ankaŭ inkluzivas kontrol-sumon por kontroli la sendifektecon de la dosiero.<br/><b>Atenton:</b> Zorgu, ke vi ĉiam rememoru vian sekretan frazon!",PASSWORD_POPUP:{TITLE:"Ĉifrita dosiero pri ŝlosilaro",HELP:"Bonvolu indiki la la sekretan frazon:",PASSWORD_HELP:"Sekreta frazo"},ERROR:{BAD_PASSWORD:"Sekreta frazo malĝusta",BAD_CHECKSUM:"Kontrol-sumo malĝusta"}}},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",SUB_TITLE_ALL:"Malplenigi la konton",FROM:"De",TO:"Al",AMOUNT:"Sumo",AMOUNT_HELP:"Sumo",COMMENT:"Komento",COMMENT_HELP:"Komento",BTN_SEND:"Sendi",BTN_ADD_COMMENT:"Aldoni komenton",REST:"Resto de la konto",REST_TO:"al",WARN_COMMENT_IS_PUBLIC:"Bonvolu noti, ke <b>la komentoj estas publikaj</b> (ne ĉifritaj).",MODAL:{TITLE:"Elspezo"}},ERROR:{UNKNOWN_URI_FORMAT:"URI-strukturo nekonata",PUBKEY_INVALID_CHECKSUM:"Publika ŝlosilo nevalida (bad checksum).",POPUP_TITLE:"Eraro",UNKNOWN_ERROR:"Eraro nekonata",CRYPTO_UNKNOWN_ERROR:"Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.",DOWNLOAD_KEYFILE_FAILED:"Malsukceso por la kreado de la dosiero pri ŝlosilaro.",EQUALS_TO_PSEUDO:"Devas esti malsama ol la pseŭdonimo",EQUALS_TO_SALT:"Devas esti malsama ol la sekreta identigilo",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.",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.",INVALID_PUBKEY_CHECKSUM:"Kontrol-sumo nevalida.",IDENTITY_REVOKED:"Tiu ĉi identeco <b>estis nuligita</b>. Ĝi ne plu povas fariĝi membro.",IDENTITY_REVOKED_WITH_TIME:"Tiu ĉi identeco <b>estis nuligita {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Ĝ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.",IDENTITY_TX_FAILED:"Malsukceso por ŝarĝi la spezojn.",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 atendata ŝlosilo estas <i class="ion-key"></i> {{pubkey|formatPubkey}}...',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_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vi devas <b>esti membro (aŭ eksa 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>.",ISSUE_524_TX_FAILED:"Malsukcesa elspezo.<br/><br/>Mesaĝo estis sendita al la programistoj por faciligi la solvadon de la problemo. <b>Dankon pro via helpo</b>.",ADD_SECONDARY_WALLET_FAILED:"Malsukceso por aldoni kroman monujon.",UPDATE_WALLET_LIST_FAILED:"Malsukceso por ĝisdatigi la kromajn monujojn.",LOAD_WALLET_LIST_FAILED:"Malsukceso por ŝarĝi la kromajn monujojn.",SAVE_WALLET_LIST_FAILED:"Malsukceso por konservi la kromajn monujojn.",COULD_NOT_ADD_MAIN_WALLET:"Tiu ĉi monujo <b>rilatas al la ĉefa konto</b>, kun kiu vi estas konektita.<br/>Ne eblas aldoni ĝin kiel kroman monujon.",COULD_NOT_ADD_EXISTING_WALLET:"Monujo jam ekzistanta en la listo.",UNKNOWN_WALLET_ID:"Kroma monujo nekonata.",RESTORE_WALLET_LIST_FAILED:"Malsukceso por restarigi la kromajn monujojn.",INVALID_FILE_FORMAT:"Strukturo de dosiero nevalida."},INFO:{POPUP_TITLE:"Informo",CERTIFICATION_DONE:"Atestaĵo sendita",NOT_ENOUGH_CREDIT:"Saldo nesufiĉa",TRANSFER_SENT:"Elspezo sendita",COPY_TO_CLIPBOARD_DONE:"Kopiita en la memoreto",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}}).",IDENTITY_NEED_MEMBERSHIP:"Tiu ĉi identeco ne sendis aliĝo-peton. Tion ĝi devos fari, se ĝi deziras fariĝi membro.",HAS_ALTERNATIVE_IDENTITIES:"Ekzistas <b>pluraj identecoj</b> ligitaj kun tiu ĉi publika ŝlosilo. <b>Antaŭ ĉia atestado</b>, pensu <a ng-click=\"doQuickFix('showSelectIdentities')\">trarigardi la aliajn identecojn</a> por elekti la ĝustan, aŭ kontaktu la posedanton de la konto.",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>",TRANSFER_ALL:"<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><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> al <b>{{restTo}}</b></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?",MEMBERSHIP:"Via aliĝo-peto kiel membro tuj estos sendita.<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> ?",ISSUE_524_SEND_LOG:"La spezo estis forĵetita, pro konata anomalio (petslipo #524) sed <b>ne ripetita</b>.<br/><br/>Por helpi la programistojn korekti tiun eraron, <b>ĉu vi akceptas la sendadon de viaj protokolaj dosieroj</b> per mesaĝo?<br/><small>(neniu konfidenca dateno estas sendita)</small>."},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.',WOT:"Reto de Fido (RdF)",WOT_DEF:"La Reto de Fido konsistas el la tuto de la membroj de la mono, kaj el la atesto-ligoj, kiuj kunligas ilin.",DISTANCE_RULE:"Regulo pri distanco",DISTANCE_RULE_DEF:"La regulo pri distanco de la Reto de Fido difinas <b>maksimuman distancon nepran</b> inter petanto kaj minimuma nombro da referencaj membroj (aŭ centraj membroj). Tiu distanco estas kalkulita uzante la ligojn inter atestaĵoj."},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:"La menuo <b>{{'MENU.TRANSACTIONS'|translate}}</b> ebligas konsulti vian konton, la liston de viaj spezoj, kaj sendi pagon.",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."}},API:{COMMON:{LINK_DOC:"Dokumentaro API",LINK_DOC_HELP:"Dokumentaro por la programistoj",LINK_STANDARD_APP:"Klasika versio",LINK_STANDARD_APP_HELP:"Malfermi la klasikan version de {{'COMMON.APP_NAME'|translate}}",CONNECTION_ERROR:"Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian interretan konekton, aŭ kontaktu la administranton de la retejo</a>."},HOME:{TITLE:"Dokumentaro API {{'COMMON.APP_NAME'|translate}}",MESSAGE:'Bonvenon en la <b>dokumentaro de la API</b> {{\'COMMON.APP_NAME\'|translate}}.<br/>Konektu viajn retejojn al <a href="http://duniter.org" target="_system">Duniter</a> tre simple!',MESSAGE_SHORT:'Konektu viajn retejojn al <a href="http://duniter.org" target="_system">Duniter</a> tre simple!',DOC_HEADER:"Servoj disponeblaj:"},TRANSFER:{TITLE:"{{'COMMON.APP_NAME'|translate}} - Reta pago",TITLE_SHORT:"Reta pago",SUMMARY:"Resumo de la pago:",AMOUNT:"Sumo:",AMOUNTS_HELP:"Bonvolu elekti la sumon:",NAME:"Nomo:",PUBKEY:"Publika ŝlosilo de la ricevonto:",COMMENT:"Referenco de la spezo:",NODE:"Adreso de la nodo:",DEMO:{SALT:"demo",PASSWORD:"demo",PUBKEY:"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",HELP:"<b>Demonstra moduso</b>: Neniu pago reale estos sendita dum tiu simulado.<br/>Bonvolu uzi la identigilojn: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",BAD_CREDENTIALS:"Kontrolu vian tajpaĵon.<br/>En demonstra moduso, la identigiloj estas: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}"},INFO:{SUCCESS_REDIRECTING_WITH_NAME:"Pago sendita.<br/>Redirektiĝo al <b>{{name}}</b>...",SUCCESS_REDIRECTING:"Pago sendita.<br/>Redirektiĝo al la retejo de la vendanto...",CANCEL_REDIRECTING_WITH_NAME:"Pago nuligita.<br/>Redirektiĝo al <b>{{name}}</b>...",CANCEL_REDIRECTING:"Pago nuligita.<br/>Redirektiĝo al la retejo de la vendanto..."},ERROR:{TRANSFER_FAILED:"Pago malsukcesa"}},DOC:{DESCRIPTION_DIVIDER:"Priskribo",URL_DIVIDER:"Adreso alvokita",PARAMETERS_DIVIDER:"Parametroj",AVAILABLE_PARAMETERS:"Jen la listo de la eblaj parametroj:",DEMO_DIVIDER:"Testi",DEMO_HELP:"Por testi tiun servon, alklaku la butonon ĉi-apude. La rezulto afiŝiĝos sube.",DEMO_RESULT:"Rezulto sendita de la alvoko:",DEMO_RESULT_PEER:"Adreso de la uzata nodo:",DEMO_SUCCEED:'<i class="icon ion-checkmark"></i> Sukceso!',DEMO_CANCELLED:'<i class="icon ion-close"></i> Nuligita de la uzanto',INTEGRATE_DIVIDER:"Integri",INTEGRATE_CODE:"Kodo:",INTEGRATE_RESULT:"Antaŭvidigo de la rezulto:",INTEGRATE_PARAMETERS:"Parametroj",TRANSFER:{TITLE:"Pagoj",DESCRIPTION:"De retejo (ekz.: ret-vendado) vi povas komisii la pagon en libera mono al Cesium API. Por tio, sufiĉas al vi ekigi la malfermon de paĝo ĉe la sekvanta adreso:",PARAM_PUBKEY:"Publika ŝlosilo de la ricevonto",PARAM_PUBKEY_HELP:"Publika ŝlosilo de la ricevonto (devige)",PARAM_AMOUNT:"Sumo",PARAM_AMOUNT_HELP:"Sumo de la spezo (devige). Pluraj valoroj permesataj, uzante apartigilon (punkto-komo, vertikala streko aŭ spaco).",PARAM_COMMENT:"Referenco (aŭ komento)",PARAM_COMMENT_HELP:"Referenco aŭ komento. Tio ekzemple ebligos al vi identigi la pagon en la blokĉeno.",PARAM_NAME:"Nomo (de la ricevonto aŭ de la retejo)",PARAM_NAME_HELP:'La nomo de la ricevonto, aŭ de la retejo alvokanta. Tio povas estis legebla nomo ("Mia retejo"), aŭ alie pseŭdo-retadreso ("MiaRetejo.com").',PARAM_REDIRECT_URL:"Retadreso por redirektiĝo",PARAM_REDIRECT_URL_HELP:'Retadreso (URL) por redirektiĝo, alvokita kiam la pago estis sendita. Ĝi povas enteni la sekvantajn signojn, kiuj estos anstataŭigitaj per la valoroj de la spezo: "{tx}", "{hash}", "{comment}", "{amount}", "{pubkey}" kaj "{node}".',PARAM_CANCEL_URL:"Retadreso por nuligo",PARAM_CANCEL_URL_HELP:'Retadreso (URL) kaze de nuligo de la pago, fare de la uzanto. Ĝi povas enteni la sekvantajn signojn, kiuj estos anstataŭigitaj lastmomente: "{comment}", "{amount}" kaj {pubkey}.',PARAM_PREFERRED_NODE:"Adreso de la preferata nodo",PARAM_PREFERRED_NODE_HELP:'Adreso (URL) de la nodo Duniter preferinde uzota ("g1.domaine.com:443" aŭ "https://g1.domaine.com").',EXAMPLES_HELP:"Jen ekzemploj pri integrado:",EXAMPLE_BUTTON:"Butono HTML",EXAMPLE_BUTTON_DEFAULT_TEXT:"Pagi en {{currency|currencySymbol}}",EXAMPLE_BUTTON_DEFAULT_STYLE:"Personigita stilo",EXAMPLE_BUTTON_TEXT_HELP:"Buton-teksto",EXAMPLE_BUTTON_BG_COLOR:"Fon-koloro",EXAMPLE_BUTTON_BG_COLOR_HELP:"Ekzemplo: #fbc14c, nigra, helgriza, rgb(180,180,180)",EXAMPLE_BUTTON_FONT_COLOR:"Teksto-koloro",EXAMPLE_BUTTON_FONT_COLOR_HELP:"Ekzemplo: nigra, oranĝa, rgb(180,180,180)",EXAMPLE_BUTTON_TEXT_ICON:"Ikono",EXAMPLE_BUTTON_TEXT_WIDTH:"Larĝeco",EXAMPLE_BUTTON_TEXT_WIDTH_HELP:"Ekzemplo: 200px, 50%",EXAMPLE_BUTTON_ICON_NONE:"Neniu",EXAMPLE_BUTTON_ICON_DUNITER:"Insigno Duniter",EXAMPLE_BUTTON_ICON_CESIUM:"Insigno Cesium",EXAMPLE_BUTTON_ICON_G1_COLOR:"Insigno Ğ1",EXAMPLE_BUTTON_ICON_G1_BLACK:"Insigno Ğ1 (nigra)"}}}}),e.translations("es-ES",{COMMON:{APP_NAME:"Cesium",APP_VERSION:"v{{version}}",APP_BUILD:"fecha: {{build}}",PUBKEY:"Llave pública",MEMBER:"Miembro",BLOCK:"Bloque",BTN_OK:"OK",BTN_YES:"Sí",BTN_NO:"No",BTN_SEND:"Enviar",BTN_SEND_MONEY:"Hacer un pago",BTN_SEND_MONEY_SHORT:"Pago",BTN_SAVE:"Guardar",BTN_YES_SAVE:"Sí, guardar",BTN_YES_CONTINUE:"Sí, continuar",BTN_SHOW:"Ver",BTN_SHOW_PUBKEY:"Ver la llave",BTN_RELATIVE_UNIT:"Mostrar importes en DU",BTN_BACK:"Anterior",BTN_NEXT:"Siguiente",BTN_IMPORT:"Importar",BTN_CANCEL:"Cancelar",BTN_CLOSE:"Cerrar",BTN_LATER:"Más tarde",BTN_LOGIN:"Conectarse",BTN_LOGOUT:"Desconexión",BTN_ADD_ACCOUNT:"Nueva cuenta",BTN_SHARE:"Compartir",BTN_EDIT:"Modificar",BTN_DELETE:"Suprimir",BTN_ADD:"Añadir",BTN_SEARCH:"Buscar",BTN_REFRESH:"Actualizar",BTN_RETRY:"Empezar de nuevo",BTN_START:"Empezar",BTN_CONTINUE:"Continuar",BTN_CREATE:"Crear",BTN_UNDERSTOOD:"Entendido",BTN_OPTIONS:"Opciones",BTN_HELP_TOUR:"Visita guiada",BTN_HELP_TOUR_SCREEN:"Explicar esta pantalla",BTN_DOWNLOAD:"Descargar",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Descargar historial de cuenta",BTN_MODIFY:"Modificar",CHOOSE_FILE:"Arrastre el archivo<br/>o haga clic para seleccionarlo",DAYS:"Días",NO_ACCOUNT_QUESTION:"¿Todavía no es miembro? ¡Crear una cuenta!",SEARCH_NO_RESULT:"Ningún resultado encontrado",LOADING:"Espere por favor…",LOADING_WAIT:"Espere por favor…<br/><small>(Esperando disponibilidad de nodo)</small>",SEARCHING:"Búsqueda en proceso…",FROM:"De",TO:"A",COPY:"Copiar",LANGUAGE:"Idioma",UNIVERSAL_DIVIDEND:"Dividendo universal",UD:"DU",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:"(vacío)",UID:"Seudónimo",ENABLE:"Activado",DISABLE:"Desactivado",RESULTS_LIST:"Resultados:",RESULTS_COUNT:"{{count}} resultados",EXECUTION_TIME:"ejecutado en {{duration|formatDurationMs}}",SHOW_VALUES:"¿Publicar los valores no codificados?",POPOVER_ACTIONS_TITLE:"Opciones",POPOVER_FILTER_TITLE:"Filtros",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(límite actual {{limit}})",POPOVER_SHARE:{TITLE:"Compartir",SHARE_ON_TWITTER:"Compartir en Twitter",SHARE_ON_FACEBOOK:"Compartir en Facebook",SHARE_ON_DIASPORA:"Compartir en Diaspora*",SHARE_ON_GOOGLEPLUS:"Compartir en Google+"},FILE:{DATE:"Fecha:",TYPE:"Tipo:",SIZE:"Tamaño:",VALIDATING:"Validando…"}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Elegir la fuente:",BTN_PICTURE_GALLERY:"Galería",BTN_PICTURE_CAMERA:"<b>Cámara</b>"},MENU:{HOME:"Inicio",WOT:"Directorio",CURRENCY:"Moneda",ACCOUNT:"Mi cuenta",WALLETS:"Mis monederos",SETTINGS:"Ajustes",NETWORK:"Red",TRANSACTIONS:"Mis transacciones"},ABOUT:{BTN_OPEN_DEV_WINDOW:"Abrir ventana de depuración",TITLE:"Acerca de",LICENSE:"Software <b>libre</b> (licencia GNU AGPLv3).",LATEST_RELEASE:"Existe una <b>versión más nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Por favor actualice {{'COMMON.APP_NAME' | translate}} (última versión: <b>v{{version}}</b>)",CODE:"Código fuente:",OFFICIAL_WEB_SITE:"Web oficial:",DEVELOPERS:"Desarrollado por:",FORUM:"Foro:",PLEASE_REPORT_ISSUE:"No dude en informarnos de anomalías encontradas",REPORT_ISSUE:"Reportar un problema"},HOME:{FEED_SOURCE:"Fuente",READ_MORE:"Leer más",SHOW_ALL_FEED:"Ver todo",TITLE:"Cesium",WELCOME:"¡Bienvenida/o a la aplicación Cesium!",MESSAGE:"Reciba y envíe moneda libre {{currency|abbreviate}} fácilmente",BTN_CURRENCY:"Explorar la moneda",BTN_ABOUT:"Acerca de",BTN_HELP:"Ayuda en línea",REPORT_ISSUE:"Reportar anomalía",NOT_YOUR_ACCOUNT_QUESTION:'¿No es suya la cuenta <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Desconectar esta cuenta",CONNECTION_ERROR:'Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Compruebe su conexión a Internet, o nodo de conmutación <a class="positive" ng-click="doQuickFix(\'settings\')">en los ajustes</a>.'},SETTINGS:{TITLE:"Ajustes",DISPLAY_DIVIDER:"Visualización",STORAGE_DIVIDER:"Almacenamiento",NETWORK_SETTINGS:"Red",PEER:"Dirección del nodo Duniter",PEER_CHANGED_TEMPORARY:"Dirección utilizada temporalmente",PEER_SHORT:"Nodo Duniter",PERSIST_CACHE:"Conservar los datos de navegación (experimental)",PERSIST_CACHE_HELP:"Permite una navegación más rápida, conservando localmente los datos recibidos, para usar de una sesión a otra.",USE_LOCAL_STORAGE:"Activar el almacenamiento local",USE_LOCAL_STORAGE_HELP:"Permitir conservar sus ajustes",WALLETS_SETTINGS:"Mis monederos",USE_WALLETS_ENCRYPTION:"Cifrar el listado",USE_WALLETS_ENCRYPTION_HELP:"Permite proteger la lista de sus monederos (mediante cifrado), exigiendo una autenticación para acceder.",ENABLE_HELPTIP:"Activar la ayuda contextual",ENABLE_UI_EFFECTS:"Activar los efectos visuales",HISTORY_SETTINGS:"Transacciones de la cuenta",DISPLAY_UD_HISTORY:"Mostrar los DU creados",TX_HISTORY_AUTO_REFRESH:"Activar actualización automática",TX_HISTORY_AUTO_REFRESH_HELP:"Actualizar el saldo y las transacciones automáticamente, con cada nuevo bloque.",AUTHENTICATION_SETTINGS:"Autenticación",KEEP_AUTH:"Caducidad de la autenticación",KEEP_AUTH_SHORT:"Caducidad",KEEP_AUTH_HELP:"Defina cuándo expira su sesión",KEEP_AUTH_OPTION:{NEVER:"Después de cada operación",SECONDS:"Después de {{value}} segundos de inactividad",MINUTE:"Después de {{value}}min de inactividad",MINUTES:"Después de {{value}}mins de inactividad",HOUR:"Después de {{value}}h de inactividad",ALWAYS:"Al finalizar la sesión"},KEYRING_FILE:"Archivo de llaves",KEYRING_FILE_HELP:'Le permite <b>conectarse</b> automáticamente en cada inicio <br/>e incluso de <b>autenticarse</b> (solo si "Caducidad de la autenticación" está configurada en modo: "al finalizar la sesión").',REMEMBER_ME:"Recordarme",REMEMBER_ME_HELP:"Permite mantenerse siempre conectado (no recomendado), conservando localmente la llave pública.",PLUGINS_SETTINGS:"Extensiones",BTN_RESET:"Restaurar los valores por defecto",EXPERT_MODE:"Modo experto",EXPERT_MODE_HELP:"Permite una visualización más detallada",BLOCK_VALIDITY_WINDOW:"Tiempo de incertitud de los bloques",DISABLE_HELPTIP:"Desactivar la opción de ayuda contextual",BLOCK_VALIDITY_WINDOW_SHORT:"Tiempo de incertitud",BLOCK_VALIDITY_WINDOW_HELP:"Tiempo de espera antes de considerar una información como validada",BLOCK_VALIDITY_OPTION:{NONE:"Sin espera",N:"{{time | formatDuration}} ({{count}} bloques)"},POPUP_PEER:{TITLE:"Nodo Duniter",HOST:"Dirección",HOST_HELP:"Dirección: servidor:puerto",USE_SSL:"Conexión segura",USE_SSL_HELP:"(Cifrado SSL)",BTN_SHOW_LIST:"Lista de nodos"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Bloque #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Bloque actual",TITLE:"Bloque #{{number|formatInteger}}",COMPUTED_BY:"Calculado por el nodo de",SHOW_RAW:"Ver el fichero en bruto",TECHNICAL_DIVIDER:"Informaciones técnicas",VERSION:"Versión del formato",HASH:"Hash calculado",UNIVERSAL_DIVIDEND_HELP:"Moneda co-producida por cada uno de los {{membersCount}} miembros",EMPTY:"Ningún dato en este bloque",POW_MIN:"Dificultad mínima",POW_MIN_HELP:"Dificultad impuesta por el cálculo del hash",DATA_DIVIDER:"Datos",IDENTITIES_COUNT:"Nuevas identidades",JOINERS_COUNT:"Nuevos miembros",ACTIVES_COUNT:"Renovaciones",ACTIVES_COUNT_HELP:"Miembros que han renovado sus adhesiones",LEAVERS_COUNT:"Miembros salientes",LEAVERS_COUNT_HELP:"Miembros salientes que ya no quieren estar certificados",EXCLUDED_COUNT:"Miembros excluidos",EXCLUDED_COUNT_HELP:"Antiguos miembros excluidos por no renovación o falta de certificaciones",REVOKED_COUNT:"Identidades revocadas",REVOKED_COUNT_HELP:"Estas cuentas no podrán ser miembros",TX_COUNT:"Transacciones",CERT_COUNT:"Certificaciones",TX_TO_HIMSELF:"Operación de cambio",TX_OUTPUT_UNLOCK_CONDITIONS:"Condiciones de desbloqueo",TX_OUTPUT_OPERATOR:{AND:"y",OR:"o"},TX_OUTPUT_FUNCTION:{SIG:"<b>Firma</b> de ",XHX:"<b>Contraseña</b>, cuyo SHA256 =",CSV:"Bloqueado durante",CLTV:"Bloqueado hasta"}},LOOKUP:{TITLE:"Bloques",NO_BLOCK:"Ningún bloque",LAST_BLOCKS:"Últimos bloques:",BTN_COMPACT:"Compactar"}},CURRENCY:{VIEW:{TITLE:"Moneda",TAB_CURRENCY:"Moneda",TAB_WOT:"Red de confianza",TAB_NETWORK:"Red",TAB_BLOCKS:"Bloques",CURRENCY_SHORT_DESCRIPTION:"{{currency|abbreviate}} es una <b>moneda libre</b>, originada {{firstBlockTime|formatFromNow}}. Cuenta actualmente con <b>{{N}} miembros</b>, que producen y reciben un <a ng-click=\"showHelpModal('ud')\">Dividendo Universal</a> (DU) cada {{dt|formatPeriod}}.",NETWORK_RULES_DIVIDER:"Reglas de la red",CURRENCY_NAME:"Nombre de la moneda",MEMBERS:"Cantidad de miembros",MEMBERS_VARIATION:"Variación desde último DU",MONEY_DIVIDER:"Moneda",MASS:"Masa monetaria",SHARE:"Masa media por miembro",UD:"Dividendo Universal",C_ACTUAL:"Crecimiento actual",MEDIAN_TIME:"Hora de la cadena de bloques",POW_MIN:"Nivel mínimo de dificultad de cálculo",MONEY_RULES_DIVIDER:"Reglas de la moneda",C_RULE:"Crecimiento teórico objetivo",UD_RULE:"Cálculo del dividendo universal",DT_REEVAL:"Periodo de revalorización del DU",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Todos los <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Fecha de la primera revalorización",SIG_QTY_RULE:"Certificaciones requeridas para ser miembro",SIG_STOCK:"Máximo de certificaciones emitibles por miembros",SIG_PERIOD:"Espera mínima entre 2 certificaciones sucesivas emitidas por la misma persona",SIG_WINDOW:"Límite para tener en cuenta una certificación",SIG_VALIDITY:"Duración de una certificación tenida en cuenta",MS_WINDOW:"Límite para aprobar una solicitud de membresía",MS_VALIDITY:"Duración de una membresía aprobada",STEP_MAX:"Distancia máxima entre una nueva candidatura y cada miembro referente",WOT_RULES_DIVIDER:"Reglas de la red de confianza",SENTRIES:"Certificaciones necesarias para ser miembro referente",SENTRIES_FORMULA:"Fórmula de las certificaciones necesarias para ser miembro referente",XPERCENT:"Porcentaje mínimo necesario de miembros referentes respentando la regla de distancia máxima",AVG_GEN_TIME:"Tiempo medio entre dos bloques",CURRENT:"actual",MATH_CEILING:"TECHO",DISPLAY_ALL_RULES:"¿Ver todas las reglas?",BTN_SHOW_LICENSE:"Ver la licencia",WOT_DIVIDER:"Red de confianza"},LICENSE:{TITLE:"Licencia de la moneda",BTN_DOWNLOAD:"Descargar el fichero",NO_LICENSE_FILE:"Fichero de licencia no encontrado."}},NETWORK:{VIEW:{MEDIAN_TIME:"Hora de la cadena de bloques",LOADING_PEERS:"Cargando nodos…",NODE_ADDRESS:"Dirección:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Prelanzamiento (última versión estable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Versión <b>{{version}}</b> disponible",WS2PID:"ID:",PRIVATE_ACCESS:"Acceso privado",POW_PREFIX:"Prefijo de la prueba de trabajo:",ENDPOINTS:{BMAS:"Interfaz segura (SSL)",BMATOR:"Interfaz red TOR",WS2P:"Interfaz WS2P",ES_USER_API:"Nodo de datos Cesium+"}},INFO:{ONLY_SSL_PEERS:"La visualización de los nodos sin SSL está deteriorada porque Cesium funciona en modo HTTPS."}},PEER:{PEERS:"Nodos",SIGNED_ON_BLOCK:"Firmado sobre el bloque",MIRROR:"espejo",MIRRORS:"Espejo",MIRROR_PEERS:"Nodos espejo",PEER_LIST:"Lista de nodos",MEMBERS:"Miembro",MEMBER_PEERS:"Nodos miembro",ALL_PEERS:"Todos los nodos",DIFFICULTY:"Dificultad",API:"API",CURRENT_BLOCK:"Bloque #",POPOVER_FILTER_TITLE:"Filtro",OFFLINE:"Fuera de línea",OFFLINE_PEERS:"Nodos fuera de línea",BTN_SHOW_PEER:"Ver nodo",VIEW:{TITLE:"Nodo",OWNER:"Propiedad de",SHOW_RAW_PEERING:"Ver la ficha del par",SHOW_RAW_CURRENT_BLOCK:"Ver el último bloque (formato bruto)",LAST_BLOCKS:"Bloques recientes",KNOWN_PEERS:"Nodos conocidos:",GENERAL_DIVIDER:"Información general",ERROR:{LOADING_TOR_NODE_ERROR:"No se pudo obtener la información del nodo usando la red TOR.",LOADING_NODE_ERROR:"No se pudo obtener la información del nodo"}}},WOT:{SEARCH_HELP:"Buscar (seudónimo o llave pública)",SEARCH_INIT_PHASE_WARNING:"Durante la etapa de preinscripción, el tiempo de búsqueda de las candidaturas en espera <b>puede tardar</b>. Por favor espere…",REGISTERED_SINCE:"Se registró en",REGISTERED_SINCE_BLOCK:"Se registró en el bloque #",NO_CERTIFICATION:"Ninguna certificación validada",NO_GIVEN_CERTIFICATION:"Ninguna certificación emitida",NOT_MEMBER_PARENTHESIS:"(no miembro)",IDENTITY_REVOKED_PARENTHESIS:"(identidad revocada)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(revocación en proceso)",EXPIRE_IN:"Expira",NOT_WRITTEN_EXPIRE_IN:"Fecha límite<br/>de procesamiento",EXPIRED:"Expirado",PSEUDO:"Seudónimo",SIGNED_ON_BLOCK:"Emitida en el bloque #{{block}}",WRITTEN_ON_BLOCK:"Escrita en el bloque #{{block}}",GENERAL_DIVIDER:"Informaciones generales",NOT_MEMBER_ACCOUNT:"Cuenta no miembro",NOT_MEMBER_ACCOUNT_HELP:"Se trata de un monedero simple, sin solicitud de membresía en espera",TECHNICAL_DIVIDER:"Informaciones técnicas",BTN_CERTIFY:"Certificar",BTN_YES_CERTIFY:"Sí, certificar",BTN_SELECT_AND_CERTIFY:"Nueva certificación",ACCOUNT_OPERATIONS:"Transacciones de la cuenta",VIEW:{POPOVER_SHARE_TITLE:"Identidad {{title}}"},LOOKUP:{TITLE:"Directorio",NEWCOMERS:"Nuevos miembros:",NEWCOMERS_COUNT:"{{count}} miembros",PENDING:"Inscripciones en espera:",PENDING_COUNT:"{{count}} inscripciones en espera",REGISTERED:"Se inscribió {{sigDate | formatFromNow}}",MEMBER_FROM:"Miembro desde {{memberDate|medianFromNowShort}}",BTN_NEWCOMERS:"Miembros recientes",BTN_PENDING:"Candidaturas en espera",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(mostrar solo {{limit}})",NO_PENDING:"Ninguna candidatura en espera.",NO_NEWCOMERS:"Sin miembros."},CONTACTS:{TITLE:"Contactos"},MODAL:{TITLE:"Buscar"},CERTIFICATIONS:{TITLE:"{{uid}} - Certificaciones",SUMMARY:"Certificaciones recibidas",LIST:"Detalle de las certificaciones recibidas",PENDING_LIST:"Certificaciones en espera de tratamiento",RECEIVED:"Certificaciones recibidas",RECEIVED_BY:"Certificaciones recibidas por {{uid}}",ERROR:"Certificaciones recibidas por error",SENTRY_MEMBER:"Miembro referente"},OPERATIONS:{TITLE:"{{uid}} - Transacciones"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certificaciones emitidas",SUMMARY:"Certificaciones emitidas",LIST:"Detalle de las certificaciones emitidas",PENDING_LIST:"Certificaciones en espera a ser procesadas",SENT:"Certificaciones emitidas",SENT_BY:"Certificaciones emitidas por {{uid}}",ERROR:"Certificaciones emitidas por error"}},LOGIN:{TITLE:'<i class="icon ion-locked"></i> Conexión',SCRYPT_FORM_HELP:"Ingrese sus credenciales.<br>Recuerde comprobar que la llave pública pertenece a su cuenta.",PUBKEY_FORM_HELP:"Por favor ingrese una llave pública de cuenta:",FILE_FORM_HELP:"Elija el archivo de llaves a usar:",SCAN_FORM_HELP:"Escanee el código QR de un monedero.",SALT:"Identificador secreto",SALT_HELP:"Identificador secreto",SHOW_SALT:"Mostrar el identificador secreto",PASSWORD:"Contraseña",PASSWORD_HELP:"Contraseña",PUBKEY_HELP:"llave pública",NO_ACCOUNT_QUESTION:"¿Aún no tiene cuenta? ",HAVE_ACCOUNT_QUESTION:"¿Ya tiene cuenta?",CREATE_ACCOUNT:"Crear una cuenta",CREATE_FREE_ACCOUNT:"Crear una cuenta gratis",FORGOTTEN_ID:"¿Olvidó su contraseña?",ASSOCIATED_PUBKEY:"Llave pública del archivo de llaves:",BTN_METHODS:"Otros métodos",BTN_METHODS_DOTS:"Otras vías…",METHOD_POPOVER_TITLE:"Métodos",MEMORIZE_AUTH_FILE:"Memorizar las llaves durante la sesión de navegación",SCRYPT_PARAMETERS:"Ajustes (Scrypt) :",AUTO_LOGOUT:{TITLE:"Información",MESSAGE:'<i class="ion-android-time"></i> Se ha <b>desconectado</b> de forma automática, después de un periodo de inactividad prolongada.',BTN_RELOGIN:"Volver a conectarme",IDLE_WARNING:"Será desconectado en… {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Estándar (por defecto)",SCRYPT_ADVANCED:"Aleatoriedad avanzada",FILE:"Archivo de llaves",PUBKEY:"Llave pública o seudónimo",SCAN:"Escanear un código QR"},SCRYPT:{SIMPLE:"Ligero",DEFAULT:"Predeterminado",SECURE:"Seguro",HARDEST:"El más seguro",EXTREME:"Extremo",USER:"Personalizado",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{HELP:"Formato de archivo esperado: <b>.yml</b> o <b>.dunikey</b> (tipo PubSec, WIF o EWIF)."}},API:{COMMON:{CONNECTION_ERROR:"Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Verifique su conexión a Internet, o contacte con la administración del sitio.</a>.",LINK_DOC:"Documentación API",LINK_DOC_HELP:"Documentación para desarrolladores",LINK_STANDARD_APP:"Versión clásica",LINK_STANDARD_APP_HELP:"Abrir la versión clásica de {{'COMMON.APP_NAME'|translate}}"},DOC:{AVAILABLE_PARAMETERS:"Lista de parámetros disponibles :",DEMO_CANCELLED:'<i class="icon ion-close"></i> Cancelado por el usuario',DEMO_DIVIDER:"Probar",DEMO_HELP:"Para probar este servicio, haga clic en este botón. El resultado se mostrará debajo.",DEMO_RESULT:"Resultado retornado por la llamada :",DEMO_RESULT_PEER:"Dirección del nodo utilizado :",DEMO_SUCCEED:'<i class="icon ion-checkmark"></i> ¡ Éxito !',DESCRIPTION_DIVIDER:"Descripción",INTEGRATE_CODE:"Código :",INTEGRATE_DIVIDER:"Integrar",INTEGRATE_PARAMETERS:"Parámetros",INTEGRATE_RESULT:"Previsualización del resultado :",PARAMETERS_DIVIDER:"Parámetros",TRANSFER:{DESCRIPTION:"Desde una web (ej: tienda online) puede delegar el pago en moneda libre con la API de Cesium. Para eso, simplemente ponga un link a la siguiente dirección :",EXAMPLE_BUTTON:"Botón HTML",EXAMPLE_BUTTON_BG_COLOR:"Color de fondo",EXAMPLE_BUTTON_BG_COLOR_HELP:"Ejemplo : #fbc14c, black, lightgrey, rgb(180,180,180)",EXAMPLE_BUTTON_DEFAULT_STYLE:"Estilo personalizado",EXAMPLE_BUTTON_DEFAULT_TEXT:"Pagar en {{currency|currencySymbol}}",EXAMPLE_BUTTON_FONT_COLOR:"Color del texto",EXAMPLE_BUTTON_FONT_COLOR_HELP:"Ejemplo : black, orange, rgb(180,180,180)",EXAMPLE_BUTTON_ICON_CESIUM:"Logo Cesium",EXAMPLE_BUTTON_ICON_DUNITER:"Logo Duniter",EXAMPLE_BUTTON_ICON_G1_BLACK:"Logo Ğ1 (negro)",EXAMPLE_BUTTON_ICON_G1_COLOR:"Logo Ğ1",EXAMPLE_BUTTON_ICON_NONE:"Ninguno",EXAMPLE_BUTTON_TEXT_HELP:"Texto del botón",EXAMPLE_BUTTON_TEXT_ICON:"Icono",EXAMPLE_BUTTON_TEXT_WIDTH:"Anchura",EXAMPLE_BUTTON_TEXT_WIDTH_HELP:"Ejemplo : 200px, 50%",EXAMPLES_HELP:"Ejemplos de integración :",PARAM_AMOUNT:"Cuantía",PARAM_AMOUNT_HELP:"Cuantía de la transición (obligatorio). Valores múltiples permitidos utilizando un separador (punto y coma, barra vertical o espacio).",PARAM_CANCEL_URL:"Dirección web de cancelación",PARAM_CANCEL_URL_HELP:'Dirección web (URL) en caso de anulación del pago por parte del usuario. Puede contener las siguientes palabras que serán remplazadas por sus valores dinámicamente en cada caso: "{comment}", "{amount}" y "{pubkey}".',PARAM_COMMENT:"Concepto (o comentario)",PARAM_COMMENT_HELP:"Concepto o comentario. Le permitirá por ejemplo identificar el pago en la cadena de bloques (blockchain).",PARAM_NAME:"Nombre (del destinatario o de su sitio web)",PARAM_NAME_HELP:'El nombre del destinatario, o de su sitio web. Puede ser un nombre leíble ("Mi tienda en línea"), o un dominio ("Mitienda.com").',PARAM_PREFERRED_NODE:"Dirección del nodo preferido",PARAM_PREFERRED_NODE_HELP:'Dirección (URL) del nodo Duniter a utilizar preferentemente ("g1.domaine.com:443" o "https://g1.domaine.com").',PARAM_PUBKEY:"Llave pública del destinatario",PARAM_PUBKEY_HELP:"La llave pública del destinatario (obligatoria)",PARAM_REDIRECT_URL:"Dirección web de redirección",PARAM_REDIRECT_URL_HELP:'Dirección web (URL) de redirección, llamada cuanda el pago ha sido enviado. Puede contener las palabras siguientes, que serán remplazadas por los valores de la transacción dinámicanente : "{tx}", "{hash}", "{comment}", "{amount}", "{pubkey}" y "{node}".',TITLE:"Pagos"},URL_DIVIDER:"Dirección de llamada"},HOME:{DOC_HEADER:"Servicios disponibles :",MESSAGE:'Bienvenido/a a la <b>documentación de la API</b> {{\'COMMON.APP_NAME\'|translate}}.<br/>Conecte sus sitios webs a la cadena de bloques <a href="http://duniter.org" target="_system">Duniter</a> muy fácilmente !',MESSAGE_SHORT:'Conecte sus sitios a <a href="http://duniter.org" target="_system">Duniter</a> muy fácilmente !',TITLE:"Documentación API {{'COMMON.APP_NAME'|translate}}"},TRANSFER:{AMOUNT:"Cuantía :",AMOUNTS_HELP:"Elija la cuantía :",COMMENT:"Concepto/Comentario de la operación :",DEMO:{BAD_CREDENTIALS:"Verifique sus credenciales.<br/>En modo demostración, las credenciales son : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}",HELP:"<b>Modo demostración</b> : Ningún pago será enviado realmente durante esta simulación.<br/>Utilice las credenciales : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",PASSWORD:"demo",PUBKEY:"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",SALT:"demo"},ERROR:{TRANSFER_FAILED:"Error en el pago"},INFO:{CANCEL_REDIRECTING:"Pago cancelado.<br/>Redirigiendo al sitio del vendedor...",CANCEL_REDIRECTING_WITH_NAME:"Pago cancelado.<br/>Redirigiendo a <b>{{name}}</b>...",SUCCESS_REDIRECTING:"Pago enviado.<br/>Redirigiendo al sitio del vendedor...",SUCCESS_REDIRECTING_WITH_NAME:"Pago enviado.<br/>Redirigiendo a <b>{{name}}</b>..."},NAME:"Nombre :",NODE:"Dirección del nodo :",PUBKEY:"Llave pública del destinatario :",SUMMARY:"Resumen del pago :",TITLE:"{{'COMMON.APP_NAME'|translate}} - Pago en línea",TITLE_SHORT:"Pago en línea"}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Autenticación',BTN_AUTH:"Autenticar",GENERAL_HELP:"Por favor, autentíquese:",EXPECTED_UID_HELP:'Por favor inicie sesión en la cuenta de <i class="ion-person"></i> {{uid}}:',EXPECTED_PUBKEY_HELP:'Por favor, autentíquese en el monedero <br class="visible-xs"/><i class="ion-key"></i> {{pubkey|formatPubkey}} :',SCAN_FORM_HELP:"Escanee el código QR de la <b>llave privada</b> del monedero."},ACCOUNT:{TITLE:"Mi cuenta",BALANCE:"Saldo",LAST_TX:"Últimas transacciones validadas",BALANCE_ACCOUNT:"Saldo de la cuenta",NO_TX:"Ninguna transacción",SHOW_MORE_TX:"Mostrar más",SHOW_ALL_TX:"Mostrar todo",TX_FROM_DATE:"(mostrar solo {{fromTime|medianFromNowShort}})",OUT_DISTANCED:"Sus certificaciones recibidas provienen de un grupo demasiado aislado de la <a ng-click=\"showHelpModal('wot')\">Red de Confianza</a> (RdC) : la <a ng-click=\"showHelpModal('distance_rule')\">regla de distancia máxima</a> no se cumple.<br/>Deberá obtener certificaciones provinientes de otros sectores de la RdC, o esperar a que ésta estreche sus vínculos.",PENDING_TX:"Transacciones pendientes",VALIDATING_TX:"Transacciones validadas",ERROR_TX:"Transacciones no ejecutadas",ERROR_TX_SENT:"Transacciones ejecutadas fallidas",PENDING_TX_RECEIVED:"Tansacciones en espera de recepción",EVENTS:"Eventos",WAITING_MEMBERSHIP:"Solicitud de membresía emitida. En espera de aceptación.",WAITING_CERTIFICATIONS:"Debe obtener {{needCertificationCount}} certificación(es) para ser miembro.",WAITING_CERTIFICATIONS_HELP:'Para obtener sus certificaciones, solicitelas únicamente a miembros <b>que le conozcan bien (y en persona)</b>, como exige <a ng-click="showLicenseModal()">la licencia de la moneda</a> que usted ha aceptado.<br/>Si no conoce lo suficiente a miembros, hágalo saber en <a ng-click="openLink($event, $root.settings.userForumUrl)">el foro</a> para conocerlos en persona o asistir a algún encuentro.',WILL_MISSING_CERTIFICATIONS:"Pronto le van a <b>faltar certificaciones</b> (al menos {{willNeedCertificationCount}} son necesarias)",WILL_NEED_RENEW_MEMBERSHIP:"Su adhesión como miembro <b>va a expirar {{membershipExpiresIn|formatDurationTo}}</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a> mientras tanto.",NEED_RENEW_MEMBERSHIP:"Ya no es miembro porque su adhesión <b>ha expirado</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a>.",NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED:"Ya no es miembro de la moneda, <b>por falta de certificaciones</b>. Considere <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a>.",NO_WAITING_MEMBERSHIP:"No hay adhesión miembro en espera. Si desea <b>convertirse en miembro</b>, por favor <a ng-click=\"doQuickFix('membership')\">envíe su adhesión como miembro</a>.",CERTIFICATION_COUNT:"Certificaciones recibidas",CERTIFICATION_COUNT_SHORT:"Certificaciones",SIG_STOCK:"Certificaciones emitidas",BTN_RECEIVE_MONEY:"Recibir",BTN_SELECT_ALTERNATIVES_IDENTITIES:"Cambiar a otra identidad…",BTN_FIX_MEMBERSHIP:"Volver a enviar la candidatura…",BTN_MEMBERSHIP_RENEW:"Renovar la membresía",BTN_MEMBERSHIP_RENEW_DOTS:"Renovar la membresía…",BTN_MEMBERSHIP_OUT_DOTS:"Cancelar la membresía…",BTN_SECURITY_DOTS:"Cuenta y seguridad…",BTN_SHOW_DETAILS:"Publicar la información técnica",LOCKED_OUTPUTS_POPOVER:{TITLE:"Importe bloqueado",DESCRIPTION:"Aquí están las condiciones para desbloquear este importe:",DESCRIPTION_MANY:"Esta transacción esta compuesta de varias partes, cuyas condiciones de desbloqueo son:",LOCKED_AMOUNT:"Condiciones del importe:"},NEW:{TITLE:"Registrarse",INTRO_WARNING_TIME:"Crear una cuenta en {{name|capitalize}} es muy simple. Sin embargo, por favor tome el tiempo suficiente para hacerlo correctamente (generar y memorizar bien las credenciales, etc.)",INTRO_WARNING_SECURITY:"Asegúrese de que el dispositivo actual (ordenador, tablet, teléfono) <b>es seguro y de confianza</b>.",INTRO_WARNING_SECURITY_HELP:"Antivirus, cortafuegos, sesión protegida por contraseña o número PIN, etc.",INTRO_HELP:"Haga clic en <b>{{'COMMON.BTN_START'|translate}}</b> para iniciar la creación de la cuenta. Se le guiará paso a paso.",REGISTRATION_NODE:"Su registro será grabado a través del nodo Duniter <b>{{server}}</b>, que luego se transmitirá al resto del sistema de la moneda.",REGISTRATION_NODE_HELP:"Si no confía en este nodo, <a ng-click=\"doQuickFix('settings')\">cambie los ajustes</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Elegir el tipo de cuenta a crear:",MEMBER_ACCOUNT:"Cuenta miembro",MEMBER_ACCOUNT_TITLE:"Crear una cuenta miembro",MEMBER_ACCOUNT_HELP:"Si todavía no tiene membresía (solamente una cuenta miembro posible por persona).",WALLET_ACCOUNT:"Simple monedero",WALLET_ACCOUNT_TITLE:"Crear una cuenta simple",WALLET_ACCOUNT_HELP:"Monedero simple para todos los otros casos, por ejemplo si necesita una cuenta suplementaria.<br/>El Dividendo Universal no será producido para esta cuenta.",SALT_WARNING:"Elija su identificador secreto.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien este identificador secreto</b>.<br/>¡En caso de pérdida, nadie podrá acceder a su cuenta!",PASSWORD_WARNING:"Elija su contraseña.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien esta contraseña</b>.<br/>¡En caso de pérdida, nadie podrá acceder su cuenta!",PSEUDO_WARNING:"Elija un seudónimo.<br/>Sirve para que los otros miembros puedan encontrarlo más fácilmente.<br/><br/>No debe contener <b>ni espacios ni caracteres acentuados</b>.<div class='hidden-xs'><br/>Ejemplo: <span class='gray'>SophieDupond, MarcelChemin, etc.</span>",PSEUDO:"Seudónimo",PSEUDO_HELP:"Seudónimo",SALT_CONFIRM:"Confirmación",SALT_CONFIRM_HELP:"Confirmación del identificador secreto",PASSWORD_CONFIRM:"Confirmación",PASSWORD_CONFIRM_HELP:"Confirmación de la contraseña",SLIDE_6_TITLE:"Confirmación:",COMPUTING_PUBKEY:"Cálculo en proceso…",LAST_SLIDE_CONGRATULATION:"<b>¡Bien!</b> Ha introducido todas los datos necesarios.<br/><b>Puede solicitar</b> la creación de su cuenta.</b><br/><br/>Para su información, la llave pública que se muestra más abajo identificará su futura cuenta.<br/>Esta podrá ser comunicada a terceros para recibir pagos.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Advertencia:</b> el identificador secreto, la contraseña y el seudónimo no podrán ser modificados.<br/><b>¡Asegúrese siempre de recordarlos!</b><br/><br/><b>¿Desea</b> solicitar la inscripción?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Advertencia:</b> el identificador secreto y la contraseña no podrán ser modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Desea</b> continuar?',CHECKING_PSEUDO:"Verificando…",PSEUDO_AVAILABLE:"Este nombre está disponible",PSEUDO_NOT_AVAILABLE:"Este nombre de usuario no está disponible",INFO_LICENSE:"Para unirse a la moneda, le pedimos leer y aceptar esta licencia.",BTN_ACCEPT:"Acepto",BTN_ACCEPT_LICENSE:"Acepto la licencia"},POPUP_REGISTER:{TITLE:"Elija un seudónimo",HELP:"Un seudónimo es obligatorio para ser miembro."},SELECT_IDENTITY_MODAL:{TITLE:"Selección de identidad",HELP:'Se han enviado varias <b>identidades diferentes</b> para la llave pública <span class="gray"><i class="ion-key"></i>{{pubkey | formatPubkey}}</span>.<br/>Por favor, selecciona la carpeta para usar:'},SELECT_WALLET_MODAL:{TITLE:"Selección de monedero"},WALLET_LIST:{IMPORT_MODAL:{HELP:"Para <b>importar monederos</b>, haga clic para seleccionar o arrastre en la zona de abajo el archivo con la lista de monederos.",NO_NEW_WALLET:"Ningún monedero nuevo",TITLE:"Importar monederos",WALLET_COUNT:"<b>{{count}}</b> nuevo{{count > 1 ? 's' : ''}} monedero{{count > 1 ? 's' : ''}}"},TITLE:"Mis monederos",BTN_NEW:"Añadir un monedero",BTN_DOWNLOAD:"Descargue el listado",BTN_IMPORT_FILE_DOTS:"Importar desde fichero…",NO_WALLET:"Sin monedero secundario",BTN_DELETE:"Eliminar un monedero secundario…",BTN_RENAME:"Renombrar el monedero",EXPORT_FILENAME:"monederos-{{pubkey|formatPubkey}}-{{currency}}.csv",TOTAL_DOTS:"Total : ",EDIT_POPOVER:{TITLE:"Renombrar el monedero",HELP:"Escribe el nuevo nombre",NAME_HELP:"Nombre del monedero"}},SECURITY:{KEYFILE:{ERROR:{BAD_CHECKSUM:"Suma de control (checksum) incorrecta",BAD_PASSWORD:"Frase secreta incorrecta"},EWIF_FORMAT:"Formato EWIF (Encrypted Wallet Import Format) - v1",EWIF_FORMAT_HELP:"Este formato almacena su archivo de llaves <b>de forma cifrada</b> a partir de una frase secreta de su elección. También guarda una suma de control (checksum) para verificar la integridad del archivo.<br/><b>Atención :</b>¡ Asegúrese siempre de recordar su frase secreta !",PASSWORD_POPUP:{HELP:"Indique la frase secreta :",PASSWORD_HELP:"Frase secreta",TITLE:"Archivo de llaves cifrado"},PUBSEC_FORMAT:"Formato PubSec",PUBSEC_FORMAT_HELP:"Este formato almacena su archivo de llaves de forma simple. Es compatible con Cesium, ğannonce y Duniter.<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !",WIF_FORMAT:"Formato WIF (Wallet Import Format) - v1",WIF_FORMAT_HELP:"Este formato almacena su archivo de llaves con una suma de control (checksum) para verificar la integridad del archivo. Es compatible con los monederos en papel (Duniter paper wallet).<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !"},ADD_QUESTION:"Añadir pregunta personalizada",BTN_CLEAN:"Limpiar",BTN_RESET:"Reiniciar",DOWNLOAD_REVOKE:"Guardar un archivo de revocación",DOWNLOAD_REVOKE_HELP:"Tener un archivo de revocación es importante, en caso de perdida de las credenciales. Le permitirá <b>invalidar y sacar su cuenta miembro fuera de la Red de Confianza</b>, convirtíendose en un monedero simple.",RECOVER_ID_SELECT_FILE:"Elija el <b>archivo para salvaguardar sus credenciales</b> a utilizar :",GENERATE_KEYFILE:"Generar mi archivo de llaves…",GENERATE_KEYFILE_HELP:"Genera un archivo que le permitirá atenticarse sin tener que introducir las credenciales.<br/><b>Cuidado:</b> este archivo contendrá su llave secreta; ¡Es muy importante conservarlo en un lugar seguro!",KEYFILE_FILENAME:"llavero-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey",MEMBERSHIP_IN:"Registrarse como miembro…",MEMBERSHIP_IN_HELP:"Le permite <b>transformar</b> una cuenta de monedero simple <b>en una cuenta miembro</b>, enviando una petición de membresía. Solo si todavía no tiene una cuenta miembro.",SEND_IDENTITY:"Publicar identidad…",SEND_IDENTITY_HELP:"Le permite asociar un seudónimo a esta cuenta, pero <b>sin pedir ser miembro</b>. La validez de este seudónimo tiene un plazo limitado.",HELP_LEVEL:"Elija <strong> al menos {{nb}} preguntas:</strong>",LEVEL:"Nivel de seguridad",LOW_LEVEL:'Bajo <span class="hidden-xs">(2 preguntas min.)</span>',MEDIUM_LEVEL:'Medio <span class="hidden-xs">(4 preguntas min.)</span>',QUESTION_1:"¿Cómo se llamaba su mejor amigo de la adolescencia?",QUESTION_2:"¿Cómo se llamaba su primer animal de compañía?",QUESTION_3:"¿Cuál es el primer plato que aprendió a cocinar?",QUESTION_4:"¿Cuál es la primera película que vió en un cine?",QUESTION_5:"¿Cuál era el destino del primer avión que cogió?",QUESTION_6:"¿Cómo se llamaba su docente favorito en la escuela primaria?",QUESTION_7:"¿Cuál sería para usted el mejor oficio?",QUESTION_8:"¿Cuál es su libro infantil preferido?",QUESTION_9:"¿Cuál fue el modelo de su primer vehículo?",QUESTION_10:"¿Cuál fue su sobrenombre durante su infancia?",QUESTION_11:"¿Cuál fue su personaje o actor/actriz preferido/a cuando era estudiante?",QUESTION_12:"¿Cuál fue su cantante o grupo preferido cuando era estudiante?",QUESTION_13:"¿En qué ciudad sus padres se encontraron?",QUESTION_14:"¿Cómo se llamaba su primer jefe/a?",QUESTION_15:"¿Cómo se llama la calle donde creció?",QUESTION_16:"¿Cómo se llama la primera playa donde se bañó?",QUESTION_17:"¿Cuál es el primer álbum que compró?",QUESTION_18:"¿Cuál es el nombre de su equipo deportivo preferido?",QUESTION_19:"¿Cuál fue el oficio de su abuelo?",RECOVER_ID:"Recuperar sus credenciales",REVOCATION_WITH_FILE:"Revocar una identidad a partir de un fichero",REVOCATION_WITH_FILE_DESCRIPTION:"Si ha perdido de forma permanente las credenciales de su cuenta miembro (o la seguridad de la cuenta se ve comprometida), puede usar <b>el archivo de revocación de la cuenta</b> para forzar la salida de la Red de Confianza.",REVOCATION_WITH_FILE_HELP:"Para <b>revocar permanentemente</b> una cuenta miembro, arrastre el archivo de revocación en el cuadro siguiente o haga clic en el cuadro para seleccionar un archivo.",REVOCATION_FILENAME:"revocacion-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",REVOCATION_WALLET:"Revocar esta identidad",SAVE_ID:"Guardar mis credenciales",STRONG_LEVEL:'Alto <span class="hidden-xs ">(6 preguntas min.)</span>',TITLE:"Cuenta y seguridad",RECOVER_ID_HELP:"Si dispone de un <b>archivo de recuperación de sus credenciales</b>, las puede reobtener respondiendo correctamente a las preguntas personales elegidas en su momento.",REVOCATION_WALLET_HELP:"Pedir la revocación de vuestra identidad comporta la <b>salida de la red de confianza</b> (definitiva para el seudónimo y la llave pública asociada). La cuenta no producirá ya más el Dividendo Universal.<br/>Podrá seguir usándola como monedero simple.",SAVE_ID_HELP:"Creación de un archivo de recuperación, para <b>reobtener su contraseña</b> (e identificador secreto) en caso de olvido. El archivo se <b>cifra</b> con ayuda de las preguntas personales elegidas."},FILE_NAME:"{{currency}}_HistorialDeCuenta_{{pubkey|formatPubkey}}_{{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Fecha",AMOUNT:"Cantidad",COMMENT:"Comentario"}},TRANSFER:{TITLE:"Transferencia",SUB_TITLE:"Hacer una transferencia",FROM:"De",TO:"A",AMOUNT:"Importe",AMOUNT_HELP:"Importe",COMMENT:"Comentario",COMMENT_HELP:"Comentario",BTN_SEND:"Enviar",BTN_ADD_COMMENT:"Añadir un comentario",REST:"Resto de cuenta",REST_TO:"a",WARN_COMMENT_IS_PUBLIC:"Tenga en cuenta que los <b>comentarios son públicos</b> (sin encriptar).",MODAL:{TITLE:"Transferencia"}},ERROR:{ADD_SECONDARY_WALLET_FAILED:"Error añadiendo el monedero secundario.",COULD_NOT_ADD_EXISTING_WALLET:"Monedero ya existe en la lista.",COULD_NOT_ADD_MAIN_WALLET:"Este monedero <b>corresponde a la cuenta principal</b> con la que se conecta.<br/>Imposible añadirlo como monedero secundario.",ISSUE_524_TX_FAILED:"Error en la transferencia.<br/><br/>Un mensaje ha sido enviado a los/as desarrolladores/as para facilitar la resolución del problema. <b>Gracias por su ayuda</b>.",LOAD_WALLET_LIST_FAILED:"Error cargando los monederos secundarios.",ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION:"Usted debe <b>ser miembro (o haber sido miembro)</b> para poder efectuar esta acción.",RESTORE_WALLET_LIST_FAILED:"Error en la restauración de los monederos secundarios.",SAVE_WALLET_LIST_FAILED:"Error al guardar los monederos secundarios.",UNKNOWN_WALLET_ID:"Monedero secundario desconocido.",UPDATE_WALLET_LIST_FAILED:"Error en la actualización de los monederos secundarios.",UNKNOWN_URI_FORMAT:"Formato URI desconocido",PUBKEY_INVALID_CHECKSUM:"Llave pública no válida (suma de comprobación incorrecta).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Error desconocido",CRYPTO_UNKNOWN_ERROR:"Su navegador parece incompatible con las funcionalidades de cryptografía.",DOWNLOAD_KEYFILE_FAILED:"Error al generar el archivo de llaves.",EQUALS_TO_PSEUDO:"Debe ser diferente del seudónimo.",EQUALS_TO_SALT:"Debe ser diferente del identificador secreto.",FIELD_REQUIRED:"Campo obligatorio.",FIELD_TOO_SHORT:"Valor demasiado corta.",FIELD_TOO_SHORT_WITH_LENGTH:"Valor demasiado corta ({{minLength}} carácteres mín)",FIELD_TOO_LONG:"Valor demasiado largo",FIELD_TOO_LONG_WITH_LENGTH:"Valor demasiado largo, ({{maxLength}} carácteres máx)",FIELD_MIN:"Valor mínimo: {{min}}",FIELD_MAX:"Valor máximo: {{max}}",FIELD_ACCENT:"Caracteres acentuados y comas no autorizados",FIELD_NOT_NUMBER:"Valor numérico esperado",FIELD_NOT_INT:"Valor entero esperado",FIELD_NOT_EMAIL:"Correo electrónico no válido",PASSWORD_NOT_CONFIRMED:"No coincide con la contraseña anterior.",SALT_NOT_CONFIRMED:"No corresponde al identificador secreto anterior.",SEND_IDENTITY_FAILED:"Error de la inscripción.",SEND_CERTIFICATION_FAILED:"Error de la certificación.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"No se puede certificar, porque su cuenta no <b>es miembro</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"No se puede certificar, porque su cuenta todavía no es miembro.<br/><br/>Todavía faltan certificaciones para serlo.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Esta cuenta no se pudo certificar. No se ha solicitado la membresía, o se necesita renovarla.",LOGIN_FAILED:"Error durante la autentificación.",LOAD_IDENTITY_FAILED:"Error de carga de la identidad.",LOAD_REQUIREMENTS_FAILED:"Error de carga de las condiciones de la identidad.",SEND_MEMBERSHIP_IN_FAILED:"Error en el intento de entrada en la comunidad.",SEND_MEMBERSHIP_OUT_FAILED:"Error en la interrupción de adhesión.",REFRESH_WALLET_DATA:"Error en la actualización del monedero.",GET_CURRENCY_PARAMETER:"Error en la recuperación de las reglas de moneda.",GET_CURRENCY_FAILED:"Carga de la moneda imposible. Por favor, intente más tarde.",SEND_TX_FAILED:"Error en la transferencia.",ALL_SOURCES_USED:"Por favor, espera el cálculo del bloque siguiente (Todas sus fuentes de moneda fueron utilizada).",NOT_ENOUGH_SOURCES:"No lo bastante cambio para mandar este importe en una sola transacción.<br/>Importe máximo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Error en la creación de la cuenta miembro.",RESTORE_WALLET_DATA_ERROR:"Error en la recarga de los ajustes desde el almacenamiento local",LOAD_WALLET_DATA_ERROR:"Error en la carga de los datos del monedero.",COPY_CLIPBOARD_FAILED:"Copia de la valor imposible.",TAKE_PICTURE_FAILED:"Error en la recuperación de la foto.",SCAN_FAILED:"Error en el escán del Codigo QR",SCAN_UNKNOWN_FORMAT:"Codigo no reconocido.",WOT_LOOKUP_FAILED:"Error en la búsqueda",LOAD_PEER_DATA_FAILED:"Lectura del nodo Duniter imposible. Por favor, intente más tarde.",NEED_LOGIN_FIRST:"Por favor, conéctese en primer lugar.",AMOUNT_REQUIRED:"El importe es obligatorio.",AMOUNT_NEGATIVE:"Importe negativo no autorizado.",NOT_ENOUGH_CREDIT:"Crédito insuficiente.",INVALID_NODE_SUMMARY:"Nodo ilocalizable o dirección inválida.",INVALID_USER_ID:"El seudónimo no debe contener ni espacios ni caracteres especiales o acentuado.",INVALID_COMMENT:"El campo 'referencia no debe contener carácteres acentuados.",INVALID_PUBKEY:"La llave pública no tiene el formato esperado.",INVALID_PUBKEY_CHECKSUM:"Suma de comprobación inválida.",IDENTITY_REVOKED:"Esta identidad <b>fue revocada</b>. No puede volver a convertirla en miembro.",IDENTITY_REVOKED_WITH_TIME:"Esta identidad <b>fue revocada {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). No puede volver a convertirla en miembro.",IDENTITY_PENDING_REVOCATION:"La <b>revocación de esta identidad</b> fue solicitado y esta en espera de tratamiento. Por lo que, la certificación es desactivada.",IDENTITY_INVALID_BLOCK_HASH:"Esta solicitud de adhesión no es valida (porque denomina un bloque los nodos de la red han anulado): esta persona debe renovelar su solicitud de adhesión <b>antes que</b> estar certificada.",IDENTITY_EXPIRED:"La publicación de esta identidad ha caducada: esta persona debe realizar una nueva solicitud de adhesión <b>antes que</b> estar certificada.",IDENTITY_SANDBOX_FULL:"EL nodo Duniter utilizado por Cesium ya no puede recibir más nuevas identidades, porque la fila de espera es llena.<br/><br/>Por favor, intenta ulteriormente o cambia de nodo (vía el menú <b>Ajustes</b>).",IDENTITY_NOT_FOUND:"Identidad no encontrada",IDENTITY_TX_FAILED:"Error cargando las transacciones de la identidad",WOT_PENDING_INVALID_BLOCK_HASH:"Adhesión no validada.",WALLET_INVALID_BLOCK_HASH:"Su solicitud de adhesión ya no está validada (porque denomina un bloque los nodos de la red han anulado).<br/>Debe <a ng-click=\"doQuickFix('fixMembership')\">mandar una nueva solicitud</a> para resolver este problema.",WALLET_IDENTITY_EXPIRED:"La publicación de <b>su identidad ha caducada</b>.<br/>Debe <a ng-click=\"doQuickFix('fixIdentity')\">publicar une outra vez su identidad</a> para resolver este problema.",WALLET_REVOKED:"Su identidad fue <b>revocada</b>: ni su seudónimo ni su llave pública podrán estar utilizados en el futuro por una cuenta miembro.",WALLET_HAS_NO_SELF:"Su identidad debe en primer lugar haber estado publicado, y no estar caducada.",AUTH_REQUIRED:"Autenticación requerida.",AUTH_INVALID_PUBKEY:"La llave pública no se corresponde con la cuenta conectada",AUTH_INVALID_SCRYPT:"De usuario o contraseña no válidos.",AUTH_INVALID_FILE:"archivo de llave no válido.",AUTH_FILE_ERROR:"No se pudo abrir el archivo de llave",IDENTITY_ALREADY_CERTIFY:"Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación todavía es valida (expiration {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación está en espera de tratamiento (fecha límite de tratamiento {{expiresIn|formatDurationTo}}).",UNABLE_TO_CERTIFY_TITLE:"Certificación imposible",LOAD_NEWCOMERS_FAILED:"No se pudo cargar las nuevas membresías.",LOAD_PENDING_FAILED:"No se pudo cargar las inscripciones pendientes.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Debe <b>ser miembro</b> para poder realizar esta acción.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Debe haber <b>publicado su identidad</b> para poder realizar esta acción.",GET_BLOCK_FAILED:"Error en la recuperación del bloque",INVALID_BLOCK_HASH:"Bloque no encontrado (hash diferente)",DOWNLOAD_REVOCATION_FAILED:"Debe seleccionar un fichero de texto",REVOCATION_FAILED:"Error en la revocación.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Identificador secreto o contraseña incorrectos",RECOVER_ID_FAILED:"Error en la recuperación de las credenciales",LOAD_FILE_FAILED:"Error en la carga del archivo",NOT_VALID_REVOCATION_FILE:"Archivo de revocación no válido (formato de archivo erróneo)",NOT_VALID_SAVE_ID_FILE:"Archivo no válido (formato de archivo erróneo)",NOT_VALID_KEY_FILE:"Archivo no válido (formato de archivo erróneo)",EXISTING_ACCOUNT:"Sus credenciales corresponden a una cuenta existente, la <a ng-click=\"showHelpModal('pubkey')\">llave pública</a> es:",EXISTING_ACCOUNT_REQUEST:"Por favor, cambie sus credenciales para que coincida con una cuenta sin usar.",GET_LICENSE_FILE_FAILED:"Error al obtener el archivo de licencia",CHECK_NETWORK_CONNECTION:"No se puede conectar a ningún nodo.<br/><br/><b>Compruebe la conexión a Internet</b>.",INVALID_FILE_FORMAT:"Formato de archivo inválido.",SAME_TX_RECIPIENT:"El destinatario debe ser diferente del emisor."},INFO:{POPUP_TITLE:"Información",CERTIFICATION_DONE:"Certificación enviada",NOT_ENOUGH_CREDIT:"Crédito insuficiente",TRANSFER_SENT:"Transferencia enviada",COPY_TO_CLIPBOARD_DONE:"Copia realizada",MEMBERSHIP_OUT_SENT:"Anulación enviada",NOT_NEED_MEMBERSHIP:"Ya es miembro.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).",IDENTITY_NEED_MEMBERSHIP:"Esta identidad no envió una solicitud de membresía. Ella tendrá que hacerlo si desea hacerse miembro.",HAS_ALTERNATIVE_IDENTITIES:"Hay <b>identidades múltiples</b> adjuntas a esta llave pública. <b>Antes de cualquier certificación</b>, <a ng-click=\"doQuickFix('showSelectIdentities')\">verifique otras identidades</a> para elegir la correcta o comuníquese con el propietario de la cuenta.",REVOCATION_SENT:"Revocación enviada",REVOCATION_SENT_WAITING_PROCESS:"La <b>revocación de esta identidad</b> fue solicitada y está en espera de ser procesada.",FEATURES_NOT_IMPLEMENTED:"Esta funcionalidad todavía está en proceso de desarrollo.<br/><br/>¿Por qué no <b>contribuir a Cesium</b>, para obtenerla más rápido? ;)",EMPTY_TX_HISTORY:"Ninguna operación a exportar"},CONFIRM:{POPUP_TITLE:"<b>Confirmación</b>",POPUP_WARNING_TITLE:"<b>Advertencia</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Advertencia de seguridad</b>',CERTIFY_RULES_TITLE_UID:"Certificar {{uid}}",CERTIFY_RULES:'<b class="assertive">NO CERTIFICAR</b> una cuenta si piensa que :<br/><br/><ul><li>1.) no corresponde a una persona <b>física y viva</b>.<li>2.) su propietario <b>posee otra cuenta</b> ya certificada.<li>3.) su propietario viola (voluntariamente o no) la regla 1 o 2 (por ejemplo certificando cuentas falsas o duplicadas).</ul><br/><b>¿Desea</b> todavía certificar esta identidad?',FULLSCREEN:"¿ Mostrar la aplicación en pantalla completa ?",EXIT_APP:"¿ Cerrar la aplicación ?",TRANSFER:"<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li></ul><br/><b>Desea realizar esta transferencia?</b>",TRANSFER_ALL:"<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> para <b>{{restTo}}</b></li></ul><br/><b>¿Desea realizar esta transferencia?</b>",MEMBERSHIP_OUT:"Esta operación es <b>irreversible</b>.<br/></br/>¿Desea <b>anular su cuenta miembro</b>?",MEMBERSHIP_OUT_2:"¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>anular su candidatura</b> como miembro?",LOGIN_UNUSED_WALLET_TITLE:"¿Error de introducción de datos?",LOGIN_UNUSED_WALLET:"Las credenciales introducidas corresponden a una cuenta que parece <b>inactiva</b>.<br/></br/><b>¿Quiere sin embargo continuar con esta cuenta?</b>",FIX_IDENTITY:"El seudónimo <b>{{uid}}</b> va a ser publicado de nuevo, en reemplazo del antiguo que caducó.<br/></br/><b>¿Desea</b> continuar?",FIX_MEMBERSHIP:"Su solicitud de adhesión como miembro va a ser enviada de nuevo.<br/></br/><b>¿Desea</b> continuar?",MEMBERSHIP:"Se enviará su solicitud de membresía como miembro.<br/></br/><b>¿Desea</b> continuar?",RENEW_MEMBERSHIP:"Su adhesión como miembro va a estar renovada.<br/></br/><b>¿Desea</b> continuar?",REVOKE_IDENTITY:"Va a <b>revocar definitivamente esta identidad</b>.<br/><br/>La llave pública y el seudónimo asociados <b>jamás podrán ser utilizados</b> (para una cuenta miembro). <br/><br/><b>¿Desea</b> revocar definitivamente esta cuenta?",REVOKE_IDENTITY_2:"¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>revocar definitivamente</b> esta cuenta?",NOT_NEED_RENEW_MEMBERSHIP:"Su membresía no necesita ser renovada actualmente (caducará en {{membershipExpiresIn|formatDuration}}).<br/></br/><b>¿Confirma</b> querer renovar su membresía?",SAVE_BEFORE_LEAVE:"¿Desea <b>guardar sus cambios</b> antes de abandonar la página?",SAVE_BEFORE_LEAVE_TITLE:"Cambios no registrados",LOGOUT:"¿Desea desconectarse?",USE_FALLBACK_NODE:"Nodo <b>{{old}}</b> inalcanzable o dirección inválida.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{new}}</b>?",ISSUE_524_SEND_LOG:"La transacción ha sido rechazada a causa de una anomalía conocida (ticket #524) pero todavía <b>no replicable</b>.<br/><br/>Para ayudar a los/as desarrolladores/as a corregir este error, ¿ <b>acepta el envío de los logs(trazas del programa)</b> ?<br/><small>(ningún dato confidencia será enviado)</small>."},MODE:{DEMO:{BADGE:"Demo",MODE:"Modo de demostración",FEATURE_NOT_AVAILABLE:"Funcionalidad <b>no disponible</b> en este sitio de demostración.",MODE_HELP:"Cesium funciona en <b> modo de demostración </b>: la consulta está disponible, pero no se puede realizar ninguna operación.",INSTALL_HELP:"Por <b>razones de seguridad</b> recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda."},READONLY:{BADGE:"Monit",MODE:"Modo de supervisión",MODE_HELP:"Cesium funciona en <b> modo de supervisión </b>: solo están disponibles las funciones de monitoreo de divisas.",INSTALL_HELP:"Si desea <b>crear una cuenta</b> para enviar o recibir dinero, le recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda."}},DOWNLOAD:{POPUP_TITLE:"<b>Revocación del archivo</b>",POPUP_REVOKE_MESSAGE:"Para proteger su cuenta, descargue el <b>documento de revocación de cuenta</b>. Le permitirá cancelar su cuenta (en caso de robo, cambio de identificador, cuenta creada incorrectamente, etc.).<br/><br/><b>Por favor, almacénelo en un lugar seguro.</b>"},HELP:{TITLE:"Ayuda en línea",JOIN:{SECTION:"Inscripción",SALT:'El identificador secreto es muy importante. Sirve para mezclar(<span class="text-italic">hash</span>) la contraseña, antes de calcular la <span class="text-italic">llave pública</span> (el número de cuenta) y la <span class="text-italic">llave privada</span> para acceder a esta.<br/><b>Por favor, memorícelo muy bien</b> porque no existe ninguna forma de recuperarlo en caso de pérdida.<br/>No puede ser modificado. Deberá crear una nueva cuenta si lo pierde o se olvida.<br/><br/>Un buen identificador secreto debe ser suficientemente largo (al menos 8 carácteres) y lo más original posible.',PASSWORD:'La contraseña es muy importante. Junto al identificador secreto, sirve para calcular la llave pública (el número de cuenta), y la llave privada para acceder a ella.<br/><b>Por favor, memorícela muy bien</b> porque no existe ninguna forma de recuperarla en caso de pérdida (excepto si se tuviese un fichero de respaldo o <span class="text-italic">backup</span>.).<br/>No puede ser modificada. Deberá crear una nueva cuenta si la pierde o se olvida.<br/><br/>Una buena contraseña contiene al menos 8 carácteres, con al menos una mayúscula y un dígito.',PSEUDO:'El seudónimo se utiliza solamente en caso de inscripción como <span class="text-italic">miembro</span>. Siempre está asociado a un monedero (vía su <span class="text-italic">llave pública</span>).<br/>Este se publica en la red para que los demás usuarios puedan identificar, certificar o enviar dinero a la cuenta.<br/>Un seudónimo debe ser único para cada miembro (actuales y antiguos).'},LOGIN:{SECTION:"Autenticación",PUBKEY:"Llave pública",PUBKEY_DEF:'La llave pública del archivo de llaves es generada de las credenciales introducidas (cualquiera que sean), sin estar obligatoriamente vinculadas o contrastadas con ninguna cuenta ya usada. <br/><b>Asegúrese por lo tanto de que la llave pública es la misma con la que se creó originalmente su cuenta</b>. De lo contrario, se autogenerará una cuenta vacía que probablemente nunca ha sido usada, ya que el riesgo de coincidir con las credenciales de otra cuenta ajena es muy pequeño.<br/><a href="https://es.wikipedia.org/wiki/Criptograf%C3%ADa_de_curva_el%C3%ADptica" target="_ system">Conozca más sobre criptografía</a> con llaves públicas.',METHOD:"Métodos de autenticación",METHOD_DEF:"Diversas opciones están disponibles para conectar a las cuentas: <br/> - La conexión <b>con aleatoriedad (estándar o avanzada)</b> mezcla su contraseña con su identificador secreto, para limitar los intentos de ataque<br/> - La conexión <b>usando llave pública</b> le permite entrar sin credenciales, las cuales solo se le pedirán cuando alguna operación lo necesite.<br/> - La conexión <b>usando archivo de llaves</b> leerá las llave pública y privada de la cuenta desde un archivo sin necesitar sus credenciales. Varios formatos son posibles."},GLOSSARY:{SECTION:"Glosario",PUBKEY_DEF:"Una llave pública identifica un monedero, que puede estar asociado a un miembro o ser un monedero anónimo. En Cesium se calcula a partir del identificador secreto y la contraseña.",MEMBER:"Miembro",MEMBER_DEF:'Cada miembro es una persona humana física y viva, deseosa de participar libremente en la comunidad monetaria. Percibe un dividendo universal, de acuerdo a un periodo e importe definido en las <span class="text-italic">reglas de la moneda</span>',CURRENCY_RULES:"Reglas de la moneda",CURRENCY_RULES_DEF:'Las reglas de la moneda se han definido una vez y para siempre. Establecen el funcionamiento de la moneda: el cálculo del dividendo universal, la cantidad de certificaciones necesarias para ser miembro, la cantidad máxima de certificaciones que cada miembro puede emitir, etc. <a href="#/app/currency">Ver las reglas actuales</a>.<br/> Sus parámetros no pueden alterarse gracias a una <span class="text-italic">Cadena de Bloques</span> que soporta, implementa y verifica la buena aplicación de estas reglas.',BLOCKCHAIN:'Cadena de bloques (<span class="text-italic">Blockchain</span>)',BLOCKCHAIN_DEF:'La cadena de bloques es un sistema descentralizado, que en el caso de Duniter, sirve para mantener e implementar las <span class="text-italic">reglas de la moneda</span>.<br/><a href="http://duniter.org" target="_system">Más información</a> acerca de Duniter y el funcionamiento de su cadena de bloques.',UNIVERSAL_DIVIDEND_DEF:'El Dividendo Universal (DU) es la cantidad de moneda co-creada por cada miembro, dependiendo del periodo y del cálculo definidos en las <span class="text-italic">reglas de la moneda</span>.<br/>En cada periodo, los miembros reciben en sus cuentas la misma cantidad de moneda.<br/><br/>El DU crece regularmente, para ser justo entre cada miembro (actualmente y en el futuro), y calculado en función de la esperanza de vida media, como se demuestra en la <span class="text-italic">Teoría Relativa de la Moneda</span> (TRM, de Stéphane Laborde).<br/><a href="http://trm.creationmonetaire.info">Más información</a> sobre la TRM y las monedas libres.',WOT:"Red de Confianza (RdC)",WOT_DEF:"La Red de Confianza se compone del conjunto de miembros de la moneda, y de los enlaces de certificaciones que los conectan.",DISTANCE_RULE:"Regla de distancia",DISTANCE_RULE_DEF:"La regle de distancia de la Red de Confianza define <b>una distancia máxima a respetar</b> entre una candidatura y número mínimo miembros referentes (aquellos más conectados). Esta distancia es calculada utilizando los enlaces de certificación."},TIP:{MENU_BTN_CURRENCY:"El menú <b>{{'MENU.CURRENCY'|translate}}</b> permite consultar las <b>reglas de la moneda</b> y su estado.",CURRENCY_WOT:"El <b>número de miembros</b> muestra el peso de la comunidad y permite <b>seguir su evolución</b>.",CURRENCY_MASS:"Siga aquí la <b>cantidad total de moneda</b> existente y su <b>distribución media</b> por miembro.<br/><br/>Esto permite juzgar la <b>relevancia de un importe</b>, en relación con lo que <b>poseen los demás</b> en sus cuentas (de media).",
CURRENCY_UNIT_RELATIVE:"La unidad utilizada (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa que los importes en {{currency|capitalize}} han sido divididos entre el valor del <b>Dividendo Universal</b> (DU).<br/><br/><small> Esta unidad relativa es <b>pertinente</b>, porque permanece estable, independiente de la cantidad de moneda que aumenta constantemente.</small>",CURRENCY_CHANGE_UNIT:"Este botón permite <b>cambiar la unidad</b>, para visualizar los importes <b>directamente en {{currency|capitalize}}</b> (en lugar de &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",CURRENCY_CHANGE_UNIT_TO_RELATIVE:"Este botón permite <b>cambiar la unidad</b>, para visualizar los importes en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, es decir, relativo al Dividendo Universal (el monto co-producido por cada miembro).",CURRENCY_RULES:"Las <b>reglas</b> de la moneda fijan su funcionamiento <b>exacto y previsible</b>.<br/><br/>Es el propio ADN de la moneda, que hace que su código monetario sea <b>legible y transparente</b>.",MENU_BTN_NETWORK:"El menú <b>{{'MENU.NETWORK'|translate}}</b> permite consultar el estado de la red.",NETWORK_BLOCKCHAIN:"Todas las transacciones de la moneda están registradas dentro de un gran libro de contabilidad <b>público e infalsificable</b>, conocido como la <b>cadena de bloques</b> (<em>BlockChain</em> en inglés).",NETWORK_PEERS:"Los <b>nodos</b> visibles aquí corresponden a los <b>dispositivos de miembros que actualizan y validan</b> la cadena de bloques.<br/><br/>Cuanto más nodos haya conectados, la moneda tendrá una gestión más <b>descentralizada</b> y digna de confianza.",NETWORK_PEERS_BLOCK_NUMBER:"Este <b>número</b> (en verde) indica el <b>último bloque validado</b> por este nodo (última página escrita en la cadena de bloques).<br/><br/>El color verde indica que este bloque ha sido también validado por <b>la mayoría del resto de nodos</b>.",NETWORK_PEERS_PARTICIPATE:'<b>Cada miembro</b>, equipado de un dispositivo conectado a Internet, <b>puede contribuir añadiendo un nodo</b>. Necesita <b>instalar el programa Duniter</b> (libre y gratuito). <a href="{{installDocUrl}}" target="_system">Ver manual de uso &gt;&gt;</a>.',MENU_BTN_ACCOUNT:"<b>{{'ACCOUNT.TITLE'|translate}}</b> permite acceder a la gestión y al historial de su cuenta.",MENU_BTN_ACCOUNT_MEMBER:"Consulte aquí el estado de su cuenta y la información sobre sus certificaciones.",WALLET_CERTIFICATIONS:"Haga clic aquí para consultar el detalle de sus certificaciones (recibidas y emitidas).",WALLET_RECEIVED_CERTIFICATIONS:"Haga clic aquí para consultar el detalle de sus <b>certificaciones recibidas</b>.",WALLET_GIVEN_CERTIFICATIONS:"Haga clic aquí para consultar el detalle de sus <b>certificaciones emitidas</b>.",WALLET_BALANCE:"El <b>saldo</b> de su cuenta se visualiza aquí.",WALLET_BALANCE_RELATIVE:"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>La unidad utilizada (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa que el importe en {{currency|capitalize}} fue dividido entre el <b>Dividendo Universal</b> (DU) co-producido por cada miembro.<br/><br/>Actualmente un DU vale {{currentUD|formatInteger}} {{currency|capitalize}}s.",WALLET_BALANCE_CHANGE_UNIT:"Podrá <b>cambiar la unidad</b> de visualización de los importes en los <b><i class=\"icon ion-android-settings\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Por ejemplo, para visualizar los importes <b>directamente en {{currency|capitalize}}</b>, en lugar de unidad relativa.",WALLET_PUBKEY:"Esta es la llave pública de su cuenta. Puede comunicarla a un tercero para que pueda identificar su cuenta de forma simple.",WALLET_SEND:"Realizar un pago en algunos clics",WALLET_SEND_NO_MONEY:"Realizar un pago en algunos clics.<br/>(Su saldo ya no lo permite)",WALLET_OPTIONS:"Este botón permite acceder a las <b>acciones de adhesión</b> y de seguridad.<br/><br/>¡No olvide echar un vistazo!",WALLET_RECEIVED_CERTS:"Se exhibirá aquí la lista de las personas que le han certificado.",WALLET_CERTIFY:"El botón <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permite seleccionar una identidad y certificarla.<br/><br/>Solo quienes son <b>miembros</b> pueden certificar a otras personas.",WALLET_CERT_STOCK:"Su stock de certificaciones (emitidas) es limitado a <b>{{sigStock}} certificaciones</b>.<br/><br/>Este stock se renueva con el tiempo, a medida que las certificaciones caducan.",MENU_BTN_TX:"El menú <b>{{'MENU.TRANSACTIONS'|translate}}</b> permite consultar su saldo, el historial de transacciones y realizar nuevos pagos.",MENU_BTN_WALLETS:"El menú <b>{{'MENU.WALLETS'|translate}}</b> permite añadir monederos complementarios que usted maneja.",MENU_BTN_WOT:"El menú <b>{{'MENU.WOT'|translate}}</b> permite buscar <b>usuarios</b> de la moneda (miembro o no).",WOT_SEARCH_TEXT_XS:"Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública).<br/><br/>La búsqueda se iniciará automáticamente.",WOT_SEARCH_TEXT:"Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública). <br/><br/>Luego, pulse en la tecla <b>Intro</b> para iniciar la búsqueda.",WOT_SEARCH_RESULT:"Visualice la ficha detallada <b>haciendo clic</b> sobre una fila.",WOT_VIEW_CERTIFICATIONS:"La opción <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> muestra qué miembros han validado esta identidad.<br/><br/>Estas certificaciones atestiguan que la cuenta pertenece a <b>una persona humana viva</b> y que no posee <b>ninguna otra cuenta miembro</b>.",WOT_VIEW_CERTIFICATIONS_COUNT:"Necesita al menos <b>{{sigQty}} certificaciones</b> para ser miembro y recibir el <b>Dividendo Universal</b>.",WOT_VIEW_CERTIFICATIONS_CLICK:"Un clic aquí permite abrir <b>la lista de todas las certificaciones</b> de la identidad (recibidas y emitidas).",WOT_VIEW_CERTIFY:"El botón <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permite añadir su certificación a esta identidad.",CERTIFY_RULES:"<b>Atención:</b> Certifique solamente <b>personas físicas vivas</b>, que no posean ya ninguna otra cuenta miembro.<br/><br/>¡La seguridad de la red de la moneda depende del cuidado de cada persona!",MENU_BTN_SETTINGS:"En <b>{{'MENU.SETTINGS'|translate}}</b> podrá configurar la aplicación.",HEADER_BAR_BTN_PROFILE:"Haga clic aquí para acceder a su <b>perfil</b>",SETTINGS_CHANGE_UNIT:"Podrá <b>cambiar la unidad de visualización</b> de los importes haciendo clic aquí.<br/><br/>- Desactive la opción para mostrar los importes en {{currency|capitalize}}.<br/>- Actívela para importes relativos al {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (las cantidades de los importes se mostrarán <b>divididos</b> entre el Dividendo Universal actual).",END_LOGIN:"La visita guiada ha <b>terminado</b>.<br/><br/>¡Buena suerte en este nuevo mundo de la <b>economía libre</b> !",END_NOT_LOGIN:"La visita guiada ha <b>terminado</b>.<br/><br/>Si quiere utilizar la moneda {{currency|capitalize}}, tiene que hacer un clic en <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> más abajo.",END_READONLY:"La visita guiada ha <b>terminado</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."}}}),e.translations("fr-FR",{COMMON:{APP_NAME:"Cesium",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>(Cesium interroge le nœud Duniter)</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",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 :",PLEASE_REPORT_ISSUE:"N'hésitez pas à nous remonter les anomalies rencontrées",REPORT_ISSUE:"Remonter un problème",BTN_OPEN_DEV_WINDOW:"Ouvrir la fenêtre de debuggage"},HOME:{TITLE:"Cesium",WELCOME:"Bienvenue dans l'application Cesium !",WELCOME_READONLY:"Bienvenue dans Cesium <span class='badge badge-balanced'>Monit</span> !",MESSAGE:"Recevez et envoyez de la monnaie libre {{currency|abbreviate}}",MESSAGE_READONLY:"Suivez l'état de la monnaie libre {{currency|abbreviate}} en temps réel.",BTN_CURRENCY:"Explorer la monnaie {{currency|abbreviate}}",BTN_ABOUT:"à propos",BTN_HELP:"Aide en ligne",BTN_NETWORK:"État du réseau",FREE_SOFTWARE:"Logiciel libre",FORK_ME:"Cloner moi !",SHOW_LICENSE:"Voir la license de l'application",REPORT_ISSUE:"anomalie",NOT_YOUR_ACCOUNT_QUESTION:'Vous n\'êtes pas propriétaire du compte <b class="ion-key"> {{pubkey|formatPubkey}}</b>&nbsp;?',BTN_CHANGE_ACCOUNT:"Déconnecter ce compte",CONNECTION_ERROR:'Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changer de nœud <a class="positive" ng-click="doQuickFix(\'settings\')">dans les paramètres</a>.',SHOW_ALL_FEED:"Voir tout",READ_MORE:"Lire la suite",FEED_SOURCE:"Source"},SETTINGS:{TITLE:"Paramètres",DISPLAY_DIVIDER:"Affichage",STORAGE_DIVIDER:"Stockage",NETWORK_SETTINGS:"Réseau",PEER:"Nœud Duniter",PEER_SHORT:"Nœud Duniter",PEER_CHANGED_TEMPORARY:"Adresse utilisée temporairement",PERSIST_CACHE:"Conserver les données de navigation (expérimental)",PERSIST_CACHE_HELP:"Permet une navigation plus rapide, en conservant localement les données reçues, pour les utiliser d'une session à l'autre.",USE_LOCAL_STORAGE:"Activer le stockage local",USE_LOCAL_STORAGE_HELP:"Permet de sauvegarder vos paramètres",WALLETS_SETTINGS:"Mes portefeuilles",USE_WALLETS_ENCRYPTION:"Sécuriser la liste ?",USE_WALLETS_ENCRYPTION_HELP:"Permet de sécuriser la liste de vos portefeuilles (par chiffrement), en exigeant une authentification pour y accéder.",ENABLE_HELPTIP:"Activer les bulles d'aide contextuelles",DISABLE_HELPTIP:"Désactiver les bulles d'aide contextuelles",ENABLE_UI_EFFECTS:"Activer les effets visuels",HISTORY_SETTINGS:"Mes opérations",DISPLAY_UD_HISTORY:"Afficher les dividendes produits ?",TX_HISTORY_AUTO_REFRESH:"Rafraîchir automatiquement",TX_HISTORY_AUTO_REFRESH_HELP:"Rafraîchit le solde et les opérations automatiquement, à chaque nouveau bloc du réseau.",AUTHENTICATION_SETTINGS:"Authentification",KEEP_AUTH:"Désauthentification automatique",KEEP_AUTH_SHORT:"Désauthentification",KEEP_AUTH_HELP:"Définit le moment où l'authentification est nettoyée de la mémoire.",KEEP_AUTH_OPTION:{NEVER:"Après chaque opération",SECONDS:"Après {{value}}s d'inactivité",MINUTE:"Après {{value}}min d'inactivité",MINUTES:"Après {{value}}min d'inactivité",HOUR:"Après {{value}}h d'inactivité",ALWAYS:"A la fin de la session"},KEYRING_FILE:"Fichier de trousseau",KEYRING_FILE_HELP:'Permet de vous <b>connecter</b> automatiquement à chaque lancement<br/>et même de vous <b>authentifier</b> (seulement si "Expiration de l\'authentification" est configurée "à la fin de la session").',REMEMBER_ME:"Se souvenir de moi ?",REMEMBER_ME_HELP:"Permet de rester identifié d'une session à l'autre, en conservant localement la clé publique.",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é.",BLOCK_VALIDITY_WINDOW:"Délai d'incertitude des blocs",BLOCK_VALIDITY_WINDOW_SHORT:"Délai d'incertitude",BLOCK_VALIDITY_WINDOW_HELP:"Délai avant de considérer qu'une information est validée",BLOCK_VALIDITY_OPTION:{NONE:"Aucun délai",N:"{{time | formatDuration}} ({{count}} blocs)"},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:"Toile de confiance",NEWCOMERS:"Nouveaux membres",NEWCOMERS_COUNT:"{{count}} membres",PENDING:"Inscriptions en attente",PENDING_COUNT:"{{count}} inscriptions en attente",REGISTERED:"Inscrit {{sigDate | formatFromNow}}",MEMBER_FROM:"Membre depuis {{memberDate|medianFromNowShort}}",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 secret",SALT_HELP:"Identifiant secret",SHOW_SALT:"Afficher l'identifiant secret ?",PASSWORD:"Mot de passe",PASSWORD_HELP:"Mot de passe",PUBKEY_HELP:"Clé publique ou pseudonyme",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 secret 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',BTN_AUTH:"S'authentifier",GENERAL_HELP:"Veuillez vous authentifier :",EXPECTED_UID_HELP:'Veuillez vous authentifier sur le compte <i class="ion-person"></i> {{uid}} :',EXPECTED_PUBKEY_HELP:'Veuillez vous authentifier sur le portefeuille <br class="visible-xs"/><i class="ion-key"></i> {{pubkey|formatPubkey}} :',SCAN_FORM_HELP:"Scanner le QR code de la <b>clef privée</b> du portefeuille."},ACCOUNT:{TITLE:"Mon compte",BALANCE:"Solde",LAST_TX:"Dernières transactions validées",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|medianFromNowShort}})",PENDING_TX:"Transactions en attente de traitement",VALIDATING_TX:"Transactions traitées, non validées",ERROR_TX:"Transactions non executées",ERROR_TX_SENT:"Transactions envoyées en échec",PENDING_TX_RECEIVED:"Transactions en attente de réception",EVENTS:"Evénements",OUT_DISTANCED:"Vos certifications actuelles proviennent d'un groupe trop isolé de la <a ng-click=\"showHelpModal('wot')\">Toile de Confiance</a> (TdC) : la <a ng-click=\"showHelpModal('distance_rule')\">règle de distance maximale</a> n'est pas respectée.<br/>Vous devez obtenir des certifications provenant d'autres secteurs de la TdC, ou bien attendre que celle-ci se resserre.",WAITING_MEMBERSHIP:"Demande d'adhésion envoyée. En attente d'acceptation.",WAITING_CERTIFICATIONS:"Vous devez <b>obtenir {{needCertificationCount}} certification(s)</b> pour devenir membre et produire le <a ng-click=\"showHelpModal('ud')\">Dividende Universel</a>. Votre compte est cependant déjà opérationnel, pour recevoir et effectuer des paiements.",WAITING_CERTIFICATIONS_HELP:'Pour obtenir vos certifications, sollicitez uniquement des membres <b>qui vous connaissent suffisamment</b>, comme l\'exige <a ng-click="showLicenseModal()">la licence de la monnaie</a> que vous avez acceptée.<br/>Si vous ne connaissez pas suffisamment de membres, faites-le savoir sur <a ng-click="openLink($event, $root.settings.userForumUrl)">le forum utilisateur</a>.',WILL_MISSING_CERTIFICATIONS:"Vous allez bientôt <b>manquer de certifications</b> (au moins {{willNeedCertificationCount}} sont requises)",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 de la monnaie, car <b>votre adhésion a expiré</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED:"Vous n'êtes plus membre de la monnaie, <b>pour manque de certifications</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",NO_WAITING_MEMBERSHIP:"Aucune demande d'adhésion en attente. Si vous souhaitez <b>devenir membre</b>, pensez à <a ng-click=\"doQuickFix('membership')\">envoyer la demande d'adhésion</a>.",CERTIFICATION_COUNT:"Certifications reçues",CERTIFICATION_COUNT_SHORT:"Certifications",SIG_STOCK:"Certifications envoyées",BTN_RECEIVE_MONEY:"Encaisser",BTN_SELECT_ALTERNATIVES_IDENTITIES:"Basculer vers une autre identité...",BTN_FIX_MEMBERSHIP:"Renvoyer la demande d'adhésion...",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_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é de plusieurs parties, dont voici les conditions de déverrouillage :",LOCKED_AMOUNT:"Conditions pour le montant :"},NEW:{TITLE:"Création de compte",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érifiez 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 en 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 secret.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez le bien</b> : 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 : 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 secret",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 leurs paiements.<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 secret, 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 secret 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."},SELECT_IDENTITY_MODAL:{TITLE:"Sélection de l'identité",HELP:'Plusieurs <b>identités différentes</b> ont été envoyées, pour la clé publique <span class="gray"><i class="ion-key"></i> {{pubkey|formatPubkey}}</span>.<br/>Veuillez sélectionner le dossier à utiliser :'},SELECT_WALLET_MODAL:{TITLE:"Sélection du portefeuille"},WALLET_LIST:{TITLE:"Mes portefeuilles",BTN_NEW:"Ajouter un portefeuille",BTN_DOWNLOAD:"Télécharger la liste",BTN_IMPORT_FILE_DOTS:"Importer depuis un fichier...",NO_WALLET:"Aucun portefeuille secondaire",BTN_DELETE:"Retirer un portefeuille secondaire...",BTN_RENAME:"Renommer le portefeuille",EXPORT_FILENAME:"mes_portefeuilles-{{pubkey|formatPubkey}}-{{currency}}.csv",TOTAL_DOTS:"Total : ",EDIT_POPOVER:{TITLE:"Renommer le portefeuille",HELP:"Renseignez le nouveau nom",NAME_HELP:"Nom du portefeuille"},IMPORT_MODAL:{TITLE:"Importer des portefeuilles",HELP:"Pour <b>importer des porftefeuilles</b>, veuillez glisser dans la zone ci-dessous le fichier de la liste des portefeuilles, ou bien cliquer dans la zone pour rechercher un fichier.",WALLET_COUNT:"<b>{{count}}</b> nouveau{{count > 1 ? 'x' : ''}} portefeuille{{count > 1 ? 's' : ''}}",NO_NEW_WALLET:"Aucun nouveau portefeuille"}},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.",GENERATE_KEYFILE:"Générer mon fichier de trousseau...",GENERATE_KEYFILE_HELP:"Génère un fichier permettant de vous authentifier sans saisir vos identifiants.<br/><b>Attention :</b> ce fichier contiendra votre trousseau de compte (clefs publique et secrète) ; il est donc très important de le mettre en lieu sûr !",KEYFILE_FILENAME:"trousseau-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey",MEMBERSHIP_IN:"Transformer en compte membre...",MEMBERSHIP_IN_HELP:"Permet de <b>transformer</b> un compte simple portefeuille <b>en compte membre</b>, en envoyant une demande d'adhésion. Utile uniquement si vous n'avez pas déjà un autre compte membre.",SEND_IDENTITY:"Publier son identité...",SEND_IDENTITY_HELP:"Permet d'associer un pseudonyme à ce compte, mais <b>sans faire de demande d'adhésion</b> pour devenir membre. Cette association n'est généralement pas utile, car la validité de cette association de pseudonyme est limitée dans le temps.",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.",RECOVER_ID_SELECT_FILE:"Choisissez le <b>fichier de sauvegarde de vos identifiants</b> à utiliser :",REVOCATION_WITH_FILE:"Révoquer mon compte membre...",REVOCATION_WITH_FILE_DESCRIPTION:"Si vous avez <b>définitivement perdus 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_WITH_FILE_HELP:"Pour <b>révoquer définitivement</b> un compte membre, veuillez glisser dans la zone ci-dessous votre fichier de révocation, ou bien cliquer dans la zone pour rechercher un fichier.",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 secret) <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é",KEYFILE:{PUBSEC_FORMAT:"Format PubSec.",PUBSEC_FORMAT_HELP:"Ce format stocke votre trousseau de manière très simple. Il est compatible notamment avec Cesium, ğannonce et Duniter.<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !",WIF_FORMAT:"Format WIF (Wallet Import Format) - v1",WIF_FORMAT_HELP:"Ce format stocke votre trousseau en y intégrant une somme de contrôle pour vérifier l'intégrité du fichier. Il est compatible notamment avec les portefeuilles papier (Duniter paper wallet).<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !",EWIF_FORMAT:"Format EWIF (Encrypted Wallet Import Format) - v1",EWIF_FORMAT_HELP:"Ce format stocke votre trousseau <b>de manière chiffrée</b> à partir d'une phrase secrète de votre choix. Il intègre aussi une somme de contrôle pour vérifier l'intégrité du fichier.<br/><b>Attention :</b> Veillez à toujours vous souvenir de votre phrase secrète !",PASSWORD_POPUP:{TITLE:"Fichier de trousseau chiffré",HELP:"Veuillez indiquer la phrase secrète :",PASSWORD_HELP:"Phrase secrète"},ERROR:{BAD_PASSWORD:"Phrase secrète incorrecte",BAD_CHECKSUM:"Somme de contrôle incorrecte"}}},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",SUB_TITLE_ALL:"Vider le compte",FROM:"De",TO:"À",AMOUNT:"Montant",AMOUNT_HELP:"Montant",COMMENT:"Commentaire",COMMENT_HELP:"Commentaire",BTN_SEND:"Envoyer",BTN_ADD_COMMENT:"Ajouter un commentaire",REST:"Reste du compte",REST_TO:"à",WARN_COMMENT_IS_PUBLIC:"Veuillez noter que <b>les commentaires sont publics</b> (non chiffrés).",MODAL:{TITLE:"Virement"}},ERROR:{UNKNOWN_URI_FORMAT:"Format d'URI inconnu",PUBKEY_INVALID_CHECKSUM:"Clé publique invalide (bad checksum).",POPUP_TITLE:"Erreur",UNKNOWN_ERROR:"Erreur inconnue",CRYPTO_UNKNOWN_ERROR:"Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.",DOWNLOAD_KEYFILE_FAILED:"Échec de la génération du fichier de trousseau.",EQUALS_TO_PSEUDO:"Doit être différent du pseudonyme",EQUALS_TO_SALT:"Doit être différent de l'identifiant secret",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 secret",SEND_IDENTITY_FAILED:"Échec de l'inscription",SEND_CERTIFICATION_FAILED:"Échec de la certification",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Vous ne pouvez pas effectuer de certification, car ce compte n'est <b>pas membre</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"Vous ne pouvez pas effectuer de certification, car ce 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.",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:"Échec de la tentative d'entrée dans la communauté.",SEND_MEMBERSHIP_OUT_FAILED:"Échec de l'arrêt de l'adhésion.",REFRESH_WALLET_DATA:"Échec du rafraîchissement du portefeuille.",GET_CURRENCY_PARAMETER:"Échec 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:"Échec 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:"Échec de la création du compte membre.",RESTORE_WALLET_DATA_ERROR:"Échec du rechargement des paramètres depuis le stockage local",LOAD_WALLET_DATA_ERROR:"Échec du chargement des données du portefeuille.",COPY_CLIPBOARD_FAILED:"Copie de la valeur impossible.",TAKE_PICTURE_FAILED:"Échec de la récupération de la photo.",SCAN_FAILED:"Échec du scan de QR-code.",SCAN_UNKNOWN_FORMAT:"Code non reconnu.",WOT_LOOKUP_FAILED:"Échec 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.",INVALID_PUBKEY_CHECKSUM:"Somme de contrôle invalide.",IDENTITY_REVOKED:"Cette identité <b>a été révoquée</b>. Elle ne peut plus devenir membre.",IDENTITY_REVOKED_WITH_TIME:"Cette identité <b>a été révoquée {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). 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.",IDENTITY_TX_FAILED:"Échec du chargement des opérations.",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ée</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 pourra être utilisé à 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 clef attendue est <i class="ion-key"></i> {{pubkey|formatPubkey}}...',AUTH_INVALID_SCRYPT:"Identifiant ou mot de passe invalide.",AUTH_INVALID_FILE:"Fichier de trousseau invalide.",AUTH_FILE_ERROR:"Échec 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:"Échec du chargement des nouveaux membres.",LOAD_PENDING_FAILED:"Échec du chargement des inscriptions en attente.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vous devez <b>être membre</b> pour pouvoir effectuer cette action.",ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vous devez <b>être membre (ou ancien 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:"Échec de la récupération du bloc.",INVALID_BLOCK_HASH:"Bloc non trouvé (hash différent).",DOWNLOAD_REVOCATION_FAILED:"Échec du téléchargement du fichier de révocation.",REVOCATION_FAILED:"Échec de la révocation.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Identifiant secret ou mot de passe incorrect.",RECOVER_ID_FAILED:"Échec de la récupération des identifiants",LOAD_FILE_FAILED:"Échec 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>.",ISSUE_524_TX_FAILED:"Échec du virement.<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>.",ADD_SECONDARY_WALLET_FAILED:"Échec de l'ajout du portefeuille secondaire.",REMOVE_SECONDARY_WALLET_FAILED:"Échec de la suppression du portefeuille secondaire.",UPDATE_WALLET_LIST_FAILED:"Échec du rafraîchissement des portefeuilles secondaires.",LOAD_WALLET_LIST_FAILED:"Échec du chargement des portefeuilles secondaires.",SAVE_WALLET_LIST_FAILED:"Échec de la sauvegarde des portefeuilles secondaires.",COULD_NOT_ADD_MAIN_WALLET:"Ce portefeuille <b>correspond au compte principal</b> avec lequel vous êtes connecté.<br/>Impossible de l'ajouter comme portefeuille secondaire.",COULD_NOT_ADD_EXISTING_WALLET:"Portefeuille déjà existant dans la liste.",UNKNOWN_WALLET_ID:"Portefeuille secondaire inconnu.",RESTORE_WALLET_LIST_FAILED:"Échec de la restauration des portefeuilles secondaires.",INVALID_FILE_FORMAT:"Format de fichier invalide.",SAME_TX_RECIPIENT:"Le destinataire doit être différent de l'émetteur."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Certification envoyée",NOT_ENOUGH_CREDIT:"Crédit insuffisant",TRANSFER_SENT:"Virement envoyé",COPY_TO_CLIPBOARD_DONE:"Copié dans le presse-papier",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}}).",IDENTITY_NEED_MEMBERSHIP:"Cette identité n'a pas envoyée de demande d'adhésion. Elle le devra si elle souhaite devenir membre.",HAS_ALTERNATIVE_IDENTITIES:"Il existe <b>plusieurs identités</b> rattachées à cette clé publique. <b>Avant toute certification</b>, pensez à <a ng-click=\"doQuickFix('showSelectIdentities')\">consulter les autres identités</a> pour choisir la bonne, ou bien contacter le propriétaire du compte.",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>",TRANSFER_ALL:"<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><br/><li> - Reste : <b>{{restAmount}} {{unit}}</b> à <b>{{restTo}}</b></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>irreversible</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ée à nouveau, en remplacement de l'ancienne publication qui a expirée.<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 ?",MEMBERSHIP:"Votre demande d'adhésion comme membre va être envoyé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>revoquer 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 sûr 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> ?",ISSUE_524_SEND_LOG:"La transaction a été rejetée, à cause d'une anomalie connue (ticket #524) mais <b>non reproduite</b>.<br/><br/>Pour aider les développeurs à corriger cette erreur, <b>acceptez-vous la transmission de vos logs</b> par message ?<br/><small>(aucune donnée confidentielle n'est envoyée)</small>."},MODE:{DEMO:{BADGE:"Démo",MODE:"Mode démonstration",FEATURE_NOT_AVAILABLE:"Fonctionnalité <b>non disponible</b> sur ce site de démonstration.",MODE_HELP:"Cesium fonctionne en <b>mode démonstration</b> : la consultation de compte est possible, mais aucune opération ne pourra être réalisée.",INSTALL_HELP:"Pour des <b>raisons de sécurité</b> nous vous recommandons <b>d'installer</b> votre copie de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide."},READONLY:{BADGE:"Monit",MODE:"Mode monitoring",MODE_HELP:"Cesium fonctionne en <b>mode monitoring</b> : sono disponibili solo le funzionalità di monitoraggio della valuta.",INSTALL_HELP:"Si vous souhaitez <b>créer un compte portefeuille</b> pour envoyer ou recevoir de la monnaie, nous vous recommandons <b>d'installer votre copie</b> de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide."}},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 secret est très important. Il sert à mélanger le mot de passe, avant qu'il ne serve à calculer la <span class=\"text-italic\">clé publique</span> de votre compte (son numéro) et la clé secrète pour y accéder.<br/><b>Veillez à bien la mémoriser</b>, car aucun moyen n'est actuellement prévu pour la 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 secret doit être suffisamment long (au moins 8 caractères) et le plus original possible.",PASSWORD:"Le mot de passe est très important. Avec l'identifiant secret, il sert à calculer le numéro (la clé publique) de votre compte, et la clé secrète pour y accéder.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est prévu de 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 secret, 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é 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 portefeuille de monnaie, qui peut identifier un membre ou correspondre à un portefeuille anonyme. Dans Cesium la clé publique est calculée (par défaut) grâce à l\'identifiant secret et au mot de passe.<br/><a href="https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique" target="_system">En savoir plus sur la cryptographie</a> par clé publique.',MEMBER:"Membre",MEMBER_DEF:'Un membre est une personne humaine physique et vivante, désireuse de participer librement à la communauté monétaire. Elle co-produit 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écessaire pour être membre, le nombre de certification maximum 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 recoivent sur leur compte la meme 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.',WOT:"Toile de Confiance (TdC)",WOT_DEF:"La Toile de Confiance est constituée de l'ensemble des membres de la monnaie, et des liens de certification qui les relient.",DISTANCE_RULE:"Règle de distance",DISTANCE_RULE_DEF:"La règle de distance de la Toile de Confiance définie <b>une distance maximale à respecter</b> entre un postulant et un nombre minimum de membres référents (ou membres centraux). Cette distance est calculée en utilisant les liens de certification."},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>chaine 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 chaine 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>{{'MENU.ACCOUNT'|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_WALLETS:"Le menu <b>{{'MENU.WALLETS'|translate}}</b> permet d'ajouter des portefeuilles supplémentaires que vous gérer.",MENU_BTN_TX:"Le menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> permet de consulter votre solde, l'historique vos transactions et d'envoyer un paiement.",MENU_BTN_WOT:"Le menu <b>{{'MENU.WOT'|translate}}</b> permet de rechercher parmi les <b>utilisateurs</b> de la monnaie (membres 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 certifiez 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_FREE_ACCOUNT'|translate}}</b> ci-dessous.",END_READONLY:"Cette visite guidée est <b>terminée</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."}},API:{COMMON:{LINK_DOC:"Documentation API",LINK_DOC_HELP:"Documentation pour les développeurs",LINK_STANDARD_APP:"Version classique",LINK_STANDARD_APP_HELP:"Ouvrir la version classique de {{'COMMON.APP_NAME'|translate}}",CONNECTION_ERROR:"Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou contactez l'administrateur du site."},HOME:{TITLE:"Documentation API {{'COMMON.APP_NAME'|translate}}",MESSAGE:'Bienvenue dans la <b>documentation de l\'API</b> {{\'COMMON.APP_NAME\'|translate}}.<br/>Connectez vos sites web à <a href="http://duniter.org" target="_system">Duniter</a> très simplement !',MESSAGE_SHORT:'Connectez vos sites à <a href="http://duniter.org" target="_system">Duniter</a> très simplement !',DOC_HEADER:"Services disponibles :"},TRANSFER:{TITLE:"{{'COMMON.APP_NAME'|translate}} - Paiement en ligne",TITLE_SHORT:"Paiement en ligne",SUMMARY:"Récapitulatif du paiement :",AMOUNT:"Montant :",AMOUNTS_HELP:"Veuillez choisir le montant :",NAME:"Nom :",PUBKEY:"Clé publique du destinataire :",COMMENT:"Référence de l'opération :",NODE:"Adresse du nœud :",DEMO:{SALT:"demo",PASSWORD:"demo",PUBKEY:"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",HELP:"<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",BAD_CREDENTIALS:"Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}"},INFO:{SUCCESS_REDIRECTING_WITH_NAME:"Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...",SUCCESS_REDIRECTING:"Paiement envoyé.<br/>Redirection vers le site du vendeur...",CANCEL_REDIRECTING_WITH_NAME:"Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...",CANCEL_REDIRECTING:"Paiement annulé.<br/>Redirection vers le site du vendeur..."},ERROR:{TRANSFER_FAILED:"Échec du paiement"}},DOC:{DESCRIPTION_DIVIDER:"Description",URL_DIVIDER:"Adresse d'appel",PARAMETERS_DIVIDER:"Paramètres",AVAILABLE_PARAMETERS:"Voici la liste des paramètres possibles :",DEMO_DIVIDER:"Tester",DEMO_HELP:"Pour tester ce service, cliquez sur le bouton ci-contre. Le résultat s'affichera en dessous.",DEMO_RESULT:"Résultat retourné par l'appel :",DEMO_RESULT_PEER:"Adresse du nœud utilisé :",DEMO_SUCCEED:'<i class="icon ion-checkmark"></i> Succès !',DEMO_CANCELLED:'<i class="icon ion-close"></i> Annulé par l\'utilisateur',INTEGRATE_DIVIDER:"Intégrer",INTEGRATE_CODE:"Code :",INTEGRATE_RESULT:"Prévisualisation du résultat :",INTEGRATE_PARAMETERS:"Paramètres",TRANSFER:{TITLE:"Paiements",DESCRIPTION:"Depuis un site (ex: vente en ligne) vous pouvez déléguer le paiement en monnaie libre à Cesium API. Pour cela, il vous suffit de déclencher l'ouverture d'une page sur l'adresse suivante :",PARAM_PUBKEY:"Clé publique du destinataire",PARAM_PUBKEY_HELP:"Clé publique du destinataire (obligatoire)",PARAM_AMOUNT:"Montant",PARAM_AMOUNT_HELP:"Montant de la transaction (obligatoire). Valeurs multiples autorisées, en utilisant un séparateur (point-virgule, barre verticale ou espace).",PARAM_COMMENT:"Référence (ou commentaire)",PARAM_COMMENT_HELP:"Référence ou commentaire. Vous permettra par exemple d'identifier le paiement dans la BlockChain.",PARAM_NAME:"Nom (du destinataire ou du site web)",PARAM_NAME_HELP:'Le nom du destinataire, ou du site web appelant. Cela peut être un nom lisible ("Mon site en ligne"), ou encore une pseudo-adresse web ("MonSite.com").',PARAM_REDIRECT_URL:"Adresse web de redirection",PARAM_REDIRECT_URL_HELP:'Adresse web (URL) de redirection, appelé quand le paiement a été envoyé. Peut contenir les chaînes suivantes, qui seront remplacées par les valeurs de la transaction : "{tx}", "{hash}", "{comment}", "{amount}", "{pubkey}" et "{node}".',PARAM_CANCEL_URL:"Adresse web d'annulation",PARAM_CANCEL_URL_HELP:'Adresse web (URL) en cas d\'annulation du paiement, par l\'utilisateur. Peut contenir les chaînes suivantes, qui seront remplacées dynamiquement : "{comment}", "{amount}" et "{pubkey}".',PARAM_PREFERRED_NODE:"Adresse du nœud préféré",PARAM_PREFERRED_NODE_HELP:'Adresse (URL) du nœud Duniter à utiliser de préférence ("g1.domaine.com:443" ou "https://g1.domaine.com").',EXAMPLES_HELP:"Voici des exemples d'intégration :",EXAMPLE_BUTTON:"Bouton HTML",EXAMPLE_BUTTON_DEFAULT_TEXT:"Payer en {{currency|currencySymbol}}",EXAMPLE_BUTTON_DEFAULT_STYLE:"Style personnalisé",EXAMPLE_BUTTON_TEXT_HELP:"Texte du bouton",EXAMPLE_BUTTON_BG_COLOR:"Couleur du fond",EXAMPLE_BUTTON_BG_COLOR_HELP:"Exemple : #fbc14c, black, lightgrey, rgb(180,180,180)",EXAMPLE_BUTTON_FONT_COLOR:"Couleur du texte",EXAMPLE_BUTTON_FONT_COLOR_HELP:"Exemple : black, orange, rgb(180,180,180)",EXAMPLE_BUTTON_TEXT_ICON:"Icône",EXAMPLE_BUTTON_TEXT_WIDTH:"Largeur",EXAMPLE_BUTTON_TEXT_WIDTH_HELP:"Exemple : 200px, 50%",EXAMPLE_BUTTON_ICON_NONE:"Aucune",EXAMPLE_BUTTON_ICON_DUNITER:"Logo Duniter",EXAMPLE_BUTTON_ICON_CESIUM:"Logo Cesium",EXAMPLE_BUTTON_ICON_G1_COLOR:"Logo Ğ1",EXAMPLE_BUTTON_ICON_G1_BLACK:"Logo Ğ1 (noir)"}}}}),e.translations("it-IT",{COMMON:{APP_NAME:"Cesium",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Chiave privata",MEMBER:"Membro",BLOCK:"Blocco",BTN_OK:"OK",BTN_YES:"Si",BTN_NO:"No",BTN_SEND:"Inviare",BTN_SEND_MONEY:"Trasferire soldi",BTN_SEND_MONEY_SHORT:"Trasferire",BTN_SAVE:"Salvare",BTN_YES_SAVE:"Si, salvare",BTN_YES_CONTINUE:"Si, continuare",BTN_SHOW:"Mostrare",BTN_SHOW_PUBKEY:"Mostrare chiave pubblica",BTN_RELATIVE_UNIT:"Mostra importi in DU?",BTN_BACK:"Indietro",BTN_NEXT:"Avanti",BTN_IMPORT:"Importazione",BTN_CANCEL:"Cancellare",BTN_CLOSE:"Chiudere",BTN_LATER:"Più tardi",BTN_LOGIN:"Accedi",BTN_LOGOUT:"Log out",BTN_ADD_ACCOUNT:"Nuovo conto",BTN_SHARE:"Condividere",BTN_EDIT:"Modificare",BTN_DELETE:"Eliminare",BTN_ADD:"Aggiungere",BTN_SEARCH:"Cercare",BTN_REFRESH:"Aggiornare",BTN_RETRY:"Riprovare",BTN_START:"Iniziare",BTN_CONTINUE:"Continuare",BTN_CREATE:"Creare",BTN_UNDERSTOOD:"Ho capito",BTN_OPTIONS:"Opzioni",BTN_HELP_TOUR:"Mostrami le funzionalità",BTN_HELP_TOUR_SCREEN:"Scoprire questo schermo",BTN_DOWNLOAD:"Scaricare",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Scaricare estratto conto",BTN_MODIFY:"Modificare",CHOOSE_FILE:"Trascini un file <br/>o cliccare per selezionare",DAYS:"giorni",NO_ACCOUNT_QUESTION:"Non sei ancora membro? Registrati subito!",SEARCH_NO_RESULT:"Nessun risultato trovato",LOADING:"Caricando...",LOADING_WAIT:"Caricando...<br/><small>(Cesium interroga dal nodo peer Duniter)</small>",SEARCHING:"Cercando...",FROM:"Da",TO:"A",COPY:"Copiare",LANGUAGE:"Lingua",UNIVERSAL_DIVIDEND:"Dividendo universale",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:"Pseudonimo",ENABLE:"Attivato",DISABLE:"Disattivato",RESULTS_LIST:"Risultati:",RESULTS_COUNT:"{{count}} risultati",EXECUTION_TIME:"eeseguit in {{duration|formatDurationMs}}",SHOW_VALUES:"Mostrare valori in modo trasparente?",POPOVER_ACTIONS_TITLE:"Opzioni",POPOVER_FILTER_TITLE:"Filtri",SHOW_MORE:"Mostrare di più",SHOW_MORE_COUNT:"(limite attuale di {{limit}})",POPOVER_SHARE:{TITLE:"Condividere",SHARE_ON_TWITTER:"Condividere su Twitter",SHARE_ON_FACEBOOK:"Condividere su Facebook",SHARE_ON_DIASPORA:"Condividere su Diaspora*",SHARE_ON_GOOGLEPLUS:"Condividere su Google+"},FILE:{DATE:"Data:",TYPE:"Tipo:",SIZE:"Dimensioni del file:",VALIDATING:"Validazione in corso..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Scegliere un file:",BTN_PICTURE_GALLERY:"Galleria",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Home",WOT:"Annuario",CURRENCY:"Moneta",ACCOUNT:"Mio conto",WALLETS:"I miei portafogli",SETTINGS:"Impostazioni",NETWORK:"Rete",TRANSACTIONS:"Miei pagamenti"},ABOUT:{TITLE:"A proposito",LICENSE:"<b>Free/libre software</b> (License GNU AGPLv3).",CODE:"Codice sorgente:",OFFICIAL_WEB_SITE:"Sito ufficiale:",DEVELOPERS:"Sviluppatori:",FORUM:"Forum:",PLEASE_REPORT_ISSUE:"Non esitate a parlarci delle anomalie riscontrate",REPORT_ISSUE:"Segnalare un bug"},HOME:{TITLE:"Cesium",WELCOME:"Benvenuti nell'Cesium App!",WELCOME_READONLY:"Benvenuti nell'Cesium <span class='badge badge-balanced'>Monit</span>!",MESSAGE:"Scambiate in moneta libera {{currency|abbreviate}}",MESSAGE_READONLY:"Monitoraggio in tempo reale di moneta libera {{currency|abbreviate}}",BTN_CURRENCY:"Esplorare la moneta {{currency|abbreviate}}",BTN_ABOUT:"a proposito",BTN_HELP:"Aiuto",BTN_NETWORK:"Stato della rete",FREE_SOFTWARE:"Free software",FORK_ME:"Fork me!",SHOW_LICENSE:"Mostra licenza",REPORT_ISSUE:"Segnalare un bug",NOT_YOUR_ACCOUNT_QUESTION:'Non sei proprietario del conto <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Disconettere questo conto",CONNECTION_ERROR:'Peer <b>{{server}}</b> irraggiungibile o indirizzo invalido. <br/><br/> Verifica tua connessione or cambia nodo. <a class="positive" ng-click="doQuickFix(\'settings\')">nell impostazioni. </a>.',SHOW_ALL_FEED:"Mostra tutto",READ_MORE:"Leggi di più",FEED_SOURCE:"Fonte"},SETTINGS:{TITLE:"Impostazioni",DISPLAY_DIVIDER:"Schermo",STORAGE_DIVIDER:"Conservazione",NETWORK_SETTINGS:"Rete",PEER:"Indirizzo peer Duniter",PEER_SHORT:"Indirizzo peer",PEER_CHANGED_TEMPORARY:"Indirizzo usato per un tempo determinato",PERSIST_CACHE:"Conserva i dati di navigazione (sperimentale)",USE_LOCAL_STORAGE:"Abilitare local storage",USE_LOCAL_STORAGE_HELP:"Permette di salvare tue impostazioni",ENABLE_HELPTIP:"Abilitare consigli dinamici",ENABLE_UI_EFFECTS:"Abilitare effetti visivi",HISTORY_SETTINGS:"Mio conto",DISPLAY_UD_HISTORY:"Mostrare dividendi prodotti?",AUTHENTICATION_SETTINGS:"Autenticazione",KEEP_AUTH:"Scadenza dell'autenticazione",KEEP_AUTH_SHORT:"Scadenza",KEEP_AUTH_HELP:"Definire quando l'autenticazione verrà eliminata dalla memoria.",KEEP_AUTH_OPTION:{NEVER:"Dopo ogni operazione",SECONDS:"Dopo {{value}}s d'inattività",MINUTE:"Dopo{{value}}min d'inattività",MINUTES:"Dopo {{value}}min d'inattività",HOUR:"Dopo {{value}}h d'inattività",ALWAYS:"Alla fine della sessione"},REMEMBER_ME:"Ricordarsi di me?",REMEMBER_ME_HELP:"Rimanere identificato/a da una sessione all'altra, conservando la chiave localmente.",PLUGINS_SETTINGS:"Estensioni",BTN_RESET:"Ripristini valori predefiniti",EXPERT_MODE:"Abilitare modlità eseperto",EXPERT_MODE_HELP:"Permette di vedere più dettagli",POPUP_PEER:{TITLE:"Peer Duniter",HOST:"Indirizzo",HOST_HELP:"Indirizzo: server:port",USE_SSL:"Securizzato?",USE_SSL_HELP:"(SSL Encryption)",BTN_SHOW_LIST:"Lista dei peers"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Blocco #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Blocco attuale",TITLE:"Blocco #{{number|formatInteger}}",COMPUTED_BY:"Calcolato da",SHOW_RAW:"Mostrare dati grezzi",TECHNICAL_DIVIDER:"Informazioni tecniche",VERSION:"Versione di formatto",HASH:"Hash calcolato",UNIVERSAL_DIVIDEND_HELP:"Moneta co-prodotta da ciasciun dei {{membersCount}} membri",EMPTY:"Nessun dati in questo blocco",POW_MIN:"Difficoltà minimale",POW_MIN_HELP:"Difficoltà imposta nel calcolo del hash",DATA_DIVIDER:"Dati",IDENTITIES_COUNT:"Nuove identità",JOINERS_COUNT:"Nuovi membri",ACTIVES_COUNT:"Rinnovi",ACTIVES_COUNT_HELP:"Membri che hanno rinnovato la loro presenza nella rete",LEAVERS_COUNT:"",LEAVERS_COUNT_HELP:"Membri che si sono fatti escludere dalla rete",EXCLUDED_COUNT:"Membri esclusi",EXCLUDED_COUNT_HELP:"Vecchi membri, esclusi per certificazione non rinnovata o soglia di certificazioni non raggiunta.",REVOKED_COUNT:"Identità revocate",REVOKED_COUNT_HELP:"Può essere che questi conti non siano più attivi",TX_COUNT:"Transazioni",CERT_COUNT:"Certificazioni",TX_TO_HIMSELF:"Cambio",TX_OUTPUT_UNLOCK_CONDITIONS:"Sbloccare condizioni",TX_OUTPUT_OPERATOR:{AND:"e",OR:"o"},TX_OUTPUT_FUNCTION:{SIG:"<b>Firma</b> della chive pubblica",XHX:"<b>Password</b>, incluso SHA256 =",CSV:"Bloccato per",CLTV:"Bloccato fino a"}},LOOKUP:{TITLE:"Blocchi",NO_BLOCK:"Nessun blocco",LAST_BLOCKS:"Ultimi blocchi:",BTN_COMPACT:"Compact"}},CURRENCY:{VIEW:{TITLE:"Moneta",TAB_CURRENCY:"Moneta",TAB_WOT:"Web of trust",TAB_NETWORK:"Rete",TAB_BLOCKS:"Blocchi",CURRENCY_SHORT_DESCRIPTION:"{{currency|capitalize}} è <b>una moneta libera</b>, {{firstBlockTime | formatFromNow}}. La rete comprende <b>{{N}} membri </b>, che produccono e ricevono un <a ng-click=\"showHelpModal('ud')\">Dividendo Universale</a> (DU), ogni {{dt | formatPeriod}}.",NETWORK_RULES_DIVIDER:"Regole della rete",CURRENCY_NAME:"Nome della moneta",MEMBERS:"Numero di membri",MEMBERS_VARIATION:"Variazione da {{duration|formatDuration}} (dall' ultimo UD)",MONEY_DIVIDER:"Moneta",MASS:"Massa monetaria",SHARE:"Quantità a testa",UD:"Dividendo universale",C_ACTUAL:"Crescita attuale",MEDIAN_TIME:"Current blockchain time",POW_MIN:"Difficoltà commune",MONEY_RULES_DIVIDER:"Regole della moneta",C_RULE:"Obbietivo teorico di crescità",UD_RULE:"Dividendo universale (formula)",DT_REEVAL:"Periodo tra due re-evaluazioni del UD",REEVAL_SYMBOL:"reeval",DT_REEVAL_VALUE:"Ogni <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Data della prima re-evaluzione del UD",SIG_QTY_RULE:"Numero di certificazioni requisiti per diventare membro",SIG_STOCK:"Numero massimo di certificazioni inviate da un membro",SIG_PERIOD:"Tempo minimo tra 2 certificazioni inviate da un unico membro.",SIG_WINDOW:"Periodo massimo prima che una certificazione venga studiata",SIG_VALIDITY:"Durata di vita di una certificazione che è state presa in conto",MS_WINDOW:"Periodo massimo prima che una certificazione pendente sia validata",MS_VALIDITY:"Durata di vita di un'adesione che è state presa in conto",STEP_MAX:"Distanza massima tra un nuovo membro e ogni membro referente.",WOT_RULES_DIVIDER:"Regole della Web of Trust",SENTRIES:"Numero di certificazioni (date <b>e</b> ricevute) per diventare membro referente ",SENTRIES_FORMULA:"Numero di certificazioni necessarie per diventare membro (formula)",XPERCENT:"Percentaggio minimino di membri referenti per rispettare la regola di distanza tra i membri",AVG_GEN_TIME:"Tempo medio tra due blocchi",CURRENT:"attuale",MATH_CEILING:"CEILING",DISPLAY_ALL_RULES:"Mostrare tutte le regole?",BTN_SHOW_LICENSE:"Mostrare licenza",WOT_DIVIDER:"Web of trust"},LICENSE:{TITLE:"Licensa attuale",BTN_DOWNLOAD:"Scaricare il file",NO_LICENSE_FILE:"File di licenza non trovato ."}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain time",LOADING_PEERS:"Caricando peers...",NODE_ADDRESS:"Indirizzo del peer",SOFTWARE:"Software",WARN_PRE_RELEASE:"Pre-versione (ultima versione stabile: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Versione <b>{{version}}</b> disponibile",WS2PID:"Identificativo :",PRIVATE_ACCESS:"Accesso privato",POW_PREFIX:"Prefisso Prova di Lavoro :",ENDPOINTS:{BMAS:"Endpoint sicuro (SSL)",BMATOR:"Interfaccia rete TOR",WS2P:"Interfaccia WS2P",ES_USER_API:"Cesium+ data node"}},INFO:{ONLY_SSL_PEERS:"I nodi non-SSL hanno un display semplificato perche Cesium funziona in modalità HTTPS."}},PEER:{PEERS:"Peers-Nodi",SIGNED_ON_BLOCK:"Firmato nel blocco",MIRROR:"Specchio",MIRRORS:"Specchio",MIRROR_PEERS:"Peers specchio",PEER_LIST:"Lista dei peers",MEMBERS:"Membri",MEMBER_PEERS:"Peers membri",ALL_PEERS:"Tutti i peers",DIFFICULTY:"Difficoltà",API:"API",CURRENT_BLOCK:"Blocco #",POPOVER_FILTER_TITLE:"Filtro",OFFLINE:"Sconessi",OFFLINE_PEERS:"Peers sconessi",BTN_SHOW_PEER:"Mostrare peer",VIEW:{TITLE:"Peer",OWNER:"Proprietà di ",SHOW_RAW_PEERING:"Vedere il documento di peering",SHOW_RAW_CURRENT_BLOCK:"Vedere l'utimo blocco (formatto grezzo)",LAST_BLOCKS:"Ultimi blocchi",KNOWN_PEERS:"Peers conosciuti :",GENERAL_DIVIDER:"Informazioni generali",ERROR:{LOADING_TOR_NODE_ERROR:"Impossibile ottenere i dati del peer, periodo di attesa scaduto.",LOADING_NODE_ERROR:"Impossibile ottenere i dati del peer"}}},WOT:{SEARCH_HELP:"Cercare (membro o chiave pubblica)",SEARCH_INIT_PHASE_WARNING:"La ricerca per le certificazioni pendenti <b>può essere lunga</b> durante la fase di pre-certificazione. La preghiamo di attendere...",REGISTERED_SINCE:"Certificato/a dal",REGISTERED_SINCE_BLOCK:"Certificato/a dal blocco #",NO_CERTIFICATION:"Nessuna certificazione valida",NO_GIVEN_CERTIFICATION:"Nessuna certificazione data",NOT_MEMBER_PARENTHESIS:"(non-membro)",IDENTITY_REVOKED_PARENTHESIS:"(identità revocata)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(Cancellazione dell'identità pendente)",EXPIRE_IN:"Scade",NOT_WRITTEN_EXPIRE_IN:"Scadenza <br/> ",EXPIRED:"Scaduto",PSEUDO:"Pseudonimo",SIGNED_ON_BLOCK:"Emessa nel blocco #{{block}}",WRITTEN_ON_BLOCK:"Scritta nel blocco #{{block}}",GENERAL_DIVIDER:"Informazioni generali",NOT_MEMBER_ACCOUNT:"Conto non-membro",NOT_MEMBER_ACCOUNT_HELP:"Questo è un semplice portafoglio osservatore, senza richiesta di certificazione emessa.",TECHNICAL_DIVIDER:"Dati tecnici",BTN_CERTIFY:"Certificare",BTN_YES_CERTIFY:"Si, certificare",BTN_SELECT_AND_CERTIFY:"Nuova certificazione",ACCOUNT_OPERATIONS:"Operazioni sul conto",VIEW:{POPOVER_SHARE_TITLE:"Identità {{title}}"},LOOKUP:{TITLE:"Annuario",NEWCOMERS:"Nuovi membri:",NEWCOMERS_COUNT:"{{count}} membri",PENDING:"Registrazioni pendenti",PENDING_COUNT:"{{count}} inscrizioni pendenti",REGISTERED:"Registrato {{sigDate | formatFromNow}}",MEMBER_FROM:"Membro dal {{memberDate|medianFromNowShort}}",BTN_NEWCOMERS:"Ultimi membri",BTN_PENDING:"Registrazioni pendenti",SHOW_MORE:"Vedere di più",SHOW_MORE_COUNT:"(limite attuale di {{limit}})",NO_PENDING:"Nessuna certificazione pendente.",NO_NEWCOMERS:"Nessun membro."},CONTACTS:{TITLE:"Contatti"},MODAL:{TITLE:"Ricerca"},CERTIFICATIONS:{TITLE:"{{uid}} - Certificazioni",SUMMARY:"Certificazioni ricevute",LIST:"Dettagli delle certificazioni ricevute",PENDING_LIST:"Certificazioni pendenti",RECEIVED:"Certificazioni ricevute",RECEIVED_BY:"Certifications ricevute da {{uid}}",ERROR:"Certificazioni ricevute per errore",SENTRY_MEMBER:"Membro referente"},OPERATIONS:{TITLE:"{{uid}} - Operazioni"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certificazioni inviate",SUMMARY:"Certificazioni inviate",LIST:"Dettagli delle certificazioni inviate",PENDING_LIST:"Certificazioni ",SENT:"Certificazioni inviate",SENT_BY:"Certificazioni inviate da {{uid}}",ERROR:"Certificazioni inviate per errore"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Accedi',SCRYPT_FORM_HELP:"Accedi con tuoi dati <br> Ricordati di verificare che stai utilizzando la chiave del tuo conto.",PUBKEY_FORM_HELP:"Scrivi qui la tua chiave privata:",FILE_FORM_HELP:"Scegliere un portachiavi da utilizzare:",SCAN_FORM_HELP:"Scansiona il codice QR di un portafoglio.",SALT:"Identificativo segreto",SALT_HELP:"Identificativo segreto",SHOW_SALT:"Mostrare identificativo segreto?",PASSWORD:"Passsord",PASSWORD_HELP:"Password",PUBKEY_HELP:"Chiave pubblica, pseudonimo",NO_ACCOUNT_QUESTION:"Ancora non hai un conto?",HAVE_ACCOUNT_QUESTION:"Hai già un account?",CREATE_ACCOUNT:"Creare un conto",CREATE_FREE_ACCOUNT:"Crea un conto gratuito",FORGOTTEN_ID:"Non ricordi la password?",ASSOCIATED_PUBKEY:"Chiave pubblica:",BTN_METHODS:"Altri metodi",BTN_METHODS_DOTS:"Cambiare metodo...",METHOD_POPOVER_TITLE:"Metodi",MEMORIZE_AUTH_FILE:"Memorizzare questo portachiavi per la durata di questa sessione",SCRYPT_PARAMETERS:"Parametri (Scrypt) :",AUTO_LOGOUT:{TITLE:"Informazioni",MESSAGE:'<i class="ion-android-time"></i> Sei stato <b>sconesso/ b> automaticamente, per un periodo di inattività prolongata',BTN_RELOGIN:"Accedi",IDLE_WARNING:"Sarai disconesso in... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Salatura standard (imp. predefinita)",SCRYPT_ADVANCED:"Salatura avanzata",FILE:"File del portachiavi",PUBKEY:"Chiave pubblica soltanto",SCAN:"Scansiona un codice QR"},SCRYPT:{SIMPLE:"Salatura leggera",DEFAULT:"Salatura standard",SECURE:"Salatura sicura",HARDEST:"Salatura più sicura",EXTREME:"Salatura estrema",USER:"Salatura personalizzata",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{HELP:"Format del file atteso: <b>.dunikey</b> (type PubSec). Altri formati in sviluppo (EWIF, WIF)."}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Autenticazione',BTN_AUTH:"Autenticarsi",GENERAL_HELP:"Autenticati :",EXPECTED_UID_HELP:'Effettua il login nell\'account <i class="ion-person"></i> {{uid}}:',EXPECTED_PUBKEY_HELP:'Si prega di autenticarsi sul portafoglio <i class="ion-key"></i> {{pubkey|formatPubkey}}:',SCAN_FORM_HELP:"Scansiona il codice QR della <b>chiave privata</b> del portafoglio."},ACCOUNT:{TITLE:"Mio conto",BALANCE:"Saldo",LAST_TX:"Ultime transazioni",BALANCE_ACCOUNT:"Saldo del conto",NO_TX:"Nessuna transazione",SHOW_MORE_TX:"Mostrare di più",SHOW_ALL_TX:"Mostrare tutte",TX_FROM_DATE:"(limite attuale del {{fromTime|medianFromNowShort}})",PENDING_TX:"Transazioni pendenti",VALIDATING_TX:"Transazioni in corso di convalida",ERROR_TX:"Transaction non eseguite",ERROR_TX_SENT:"Transazioni inviate",PENDING_TX_RECEIVED:"Transazioni in attesa di recezione",EVENTS:"Eventi",WAITING_MEMBERSHIP:"Richiesta di certificazione inviata. In attesa di validazione.",WAITING_CERTIFICATIONS:"Hai bisogno di {{needCertificationCount}} certificazione(i) per diventare membro.",WILL_MISSING_CERTIFICATIONS:"Mancherai a breve <b>di certificazioni</b> (occorrono almeno {{willNeedCertificationCount}} altre certificazioni)",WILL_NEED_RENEW_MEMBERSHIP:"Tua certificazione <b>scaderà{{membershipExpiresIn|formatDurationTo}}</b>. Ricordati di <a ng-click=\"doQuickFix('renew')\">rinnovarla</a> prima.",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>.",NO_WAITING_MEMBERSHIP:"Nessuna domanda di adesione pendente. Se desideri <b>diventare membro</b>, ricordati di <a ng-click=\"doQuickFix('membership')\">inviare tua domanda di adesione</a>.",CERTIFICATION_COUNT:"Certificazioni ricevute",CERTIFICATION_COUNT_SHORT:"Certificazioni",SIG_STOCK:"Stock di certificazioni da inviare",BTN_RECEIVE_MONEY:"Ricevere",BTN_SELECT_ALTERNATIVES_IDENTITIES:"Usare un'altra identità..",BTN_FIX_MEMBERSHIP:"Invia nuovamente di adesione...",BTN_MEMBERSHIP_RENEW:"Rinnovare adesione",BTN_MEMBERSHIP_RENEW_DOTS:"Rinnovare adesione ...",BTN_MEMBERSHIP_OUT_DOTS:"Revocare adesione...",BTN_SECURITY_DOTS:"Login e securità...",BTN_SHOW_DETAILS:"Visualizzare dati tecnici",LOCKED_OUTPUTS_POPOVER:{TITLE:"Importo bloccata",DESCRIPTION:"Ecco le condizioni per sbloccare questo importo:",DESCRIPTION_MANY:"Questa transazione è fatta da diverse parti, di cui queste sono le condizioni di sblocco:",LOCKED_AMOUNT:"Condizioni per l'importo:"},NEW:{TITLE:"Registrazione",INTRO_WARNING_TIME:"Crearsi un conto su {{name|capitalize}} è molto semplice. E consigliato prendere il giusto tempo per farlo correttamente (per evitare di dimenticare passwords, pseudonimi etc.).",INTRO_WARNING_SECURITY:"Occorre verificare che il hardware che stai utilizzando (computer, tablet, cellulare) <b>è sicuro e affidabile</b>.",INTRO_WARNING_SECURITY_HELP:"Anti-virus aggiornato, firewall abilitato, session protteta da un password o codice PIN...",INTRO_HELP:"Cliccare <b> {{'COMMON.BTN_START'|translate}}</b> per avviare la creazione del conto. Ti accompagniamo passo alla volta.",REGISTRATION_NODE:"Tua iscrizione verrà salvata dal nodo peer Duniter <b>{{server}}</b>, è verrà poi condivisa nella rete della moneta.",REGISTRATION_NODE_HELP:"Se non ti fidi di questo peer, per favore cambialo <a ng-click=\"doQuickFix('settings')\">nelle impostazioni/a> di Cesium.",SELECT_ACCOUNT_TYPE:"Scegliere un tipo di conto:",MEMBER_ACCOUNT:"Conto membro",MEMBER_ACCOUNT_TITLE:"Creare un conto membro",MEMBER_ACCOUNT_HELP:"Se non sei ancora registrato come individuo (un conto a persona soltanto).",WALLET_ACCOUNT:"Semplice portafoglio",WALLET_ACCOUNT_TITLE:"Creare un portafoglio",WALLET_ACCOUNT_HELP:"Se rappresenti un'azienda, associazione, altra ente o hai necessita di un altro portafoglio. Nessun Dividendo Universale sarà prodotto da questo conto.",SALT_WARNING:"Scegliere un identificativo segreto.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarlo!</b>.<br/>Se lo dimentichi non ti potrà aiutare nessuno!",PASSWORD_WARNING:"Scegliere una password.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarla!</b>.<br/>Se la dimentichi non ti potrà aiutare nessuno!",PSEUDO_WARNING:"Segliere uno pseudonimo.<br/>Puo essere utile per chi ti cerca nella rete.<br/><br/>.L'utilizzo delle<b>virgole, spazi e accenti</b> è vietato.<br/><div class='hidden-xs'><br/>Esempio: <span class='gray'>JohnDalton, JackieChan, etc.</span>",PSEUDO:"Pseudonimo",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Confermare",SALT_CONFIRM_HELP:"Confermare l'identificativo segreto",PASSWORD_CONFIRM:"Confermare",PASSWORD_CONFIRM_HELP:"Confermare la password",SLIDE_6_TITLE:"Conferma:",COMPUTING_PUBKEY:"Calcolando...",LAST_SLIDE_CONGRATULATION:"Hai riempito tutti i campi richiesti.<br/><b>Puoi inviare la richiesta di creazione del conto</b>.<br/><br/>Per tua informazione, la chiave pubblica qui sotto identifica il tuo futuro conto.<br/>Puo essere communicata a chi ti deve pagare per esempio.<br/>Quando tuo conto verrà approvato potrai trovare la chiave qui <b>{{'ACCOUNT.TITLE'|translate}}</b>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare.<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b>di voler inviare questa richiesta di creazione di conto?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare..<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b> di voler continuare?',CHECKING_PSEUDO:"Verificazione in corso...",PSEUDO_AVAILABLE:"Pseudonimo disponibile",PSEUDO_NOT_AVAILABLE:"Pseudonimo indisponibile",INFO_LICENSE:"TPer aderire alla moneta, ti chiediamo di leggere e accetare le condizioni della licenza.",BTN_ACCEPT:"Accetto",BTN_ACCEPT_LICENSE:"Accetto la licenza"},POPUP_REGISTER:{TITLE:"Pseudonimo",HELP:"Un pseudonimo è necessario per che gli altri ti possino trovare."},SELECT_IDENTITY_MODAL:{TITLE:"Selezionare una identità",HELP:'Più <b>identità diverse</b> sono state inviate per la chiave pubblica <span class="gray"><i class="ion-key"></i> {{pubkey|formatPubkey}}</span>.<br/>Seleziona un dossier da usare :'},SELECT_WALLET_MODAL:{TITLE:"Selezione del portafoglio"},WALLET_LIST:{TITLE:"Portafoglio secondario",BTN_NEW:"Aggiungi un portfolio",NO_WALLET:"Nessun portafoglio secondario",BTN_DELETE:"Rimuovi un portafoglio secondario ...",BTN_RENAME:"Rinominare il portafoglio",EDIT_POPOVER:{TITLE:"Rinominare il portafoglio",HELP:"Compila il nuovo nome",NAME_HELP:"Nome del portafoglio"}},SECURITY:{ADD_QUESTION:"Aggiungere domanda personalizzata",BTN_CLEAN:"Svuotare",BTN_RESET:"Reset",DOWNLOAD_REVOKE:"Salvare un file di revoca",DOWNLOAD_REVOKE_HELP:"Avere une file di revoca è necessario in caso di smarrimento dei tuoi credenziali. Ti permette <b> di rimuovere tuo conto dalla Web Of Trust</b>, per farlo tornare ad essere un semplice portafoglio.",HELP_LEVEL:"Scegliere <strong> almeno{{nb}} domande </strong> :",LEVEL:"Livello di sicurezza",LOW_LEVEL:'Basso <span class="hidden-xs">(minimo di 2 domande)</span>',MEDIUM_LEVEL:'Medio <span class="hidden-xs">(minimo di 4 domande)</span>',QUESTION_1:"Qual'era il nome del tuo miglior amico quando eri adolescente ?",QUESTION_2:"Qual'era il nome del tuo primo animale domestico?",QUESTION_3:"Qual'è il primo piatto che imparasti a cucinare?",QUESTION_4:"Qual'è il primo film che hai visto al cinema?",QUESTION_5:"Qual'era la destinazione del tuo primo volo?",QUESTION_6:"Qual'era il nome del tuo professore preferito in scuola ?",QUESTION_7:"Quale sarebbe il tuo lavoro preferito?",QUESTION_8:"Qual'è il tuo libro per bimbi preferito?",QUESTION_9:"Qual'era il marchio della tua prima macchina?",QUESTION_10:"Qual'era il tuo nomignolo da ragazzino/a ?",QUESTION_11:"Qual'era il tuo personaggio di film o attore preferito quand eri studente?",QUESTION_12:"Qual'era il tuo musicista/cantante/grupo preferito quand eri studente ?",QUESTION_13:"In che città si sono conosciuti tuoi genitori ?",QUESTION_14:"Qual'era il nome del tuo primo capo ?",QUESTION_15:"Qual'è il nome della strada dove sei cresciuto/a ?",QUESTION_16:"Qual'è il nome della tua spiaggia preferita ?",QUESTION_17:"Qual'è il primo album che ti sei comprato ?",QUESTION_18:"Qual'è il nome della squadra di sport preferita ?",QUESTION_19:"Cosa faceva tuo nonno ?",RECOVER_ID:"Ricuperare mia password...",RECOVER_ID_HELP:"Se hai un<b<file di backup dei tuoi credenziali</b>, li puoi trovare rispondendo correttamente alle tue domande personalizzate.",REVOCATION_WITH_FILE:"Revocare il mio conto membro...",REVOCATION_WITH_FILE_DESCRIPTION:"Se pensi di aver perso <b>definitivamente tuoi credenziali</b> di conto membro (o che la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per forzare la sua uscita permanente dalla Tela di Fiducia</b>.",REVOCATION_WITH_FILE_HELP:"Se hai <b>definitivamente perso tuoi credenziali (o se la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per uscire dalla Web Of Trust</b>.",REVOCATION_WALLET:"Revocare questo conto subito",REVOCATION_WALLET_HELP:"Richiedere la cancellazione dell'identità <b>revocherà la tua adesione alla tua rete</ b> (con certezza per il pseudonimo e la chiave pubblica associata). Il conto non potrà più produrre il Dividendo Universale.<br/>Nonostante ciò, puoi ancora usare il conto come semplice portafoglio.",REVOCATION_FILENAME:"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",SAVE_ID:"Salvare miei credenziali...",SAVE_ID_HELP:"Creare un file di backup, per <b>ricuperare vostra password</b> (e l'identificativo segreto) <b> in caso di smarrimento</b>. Il file è <b>sicuro</ b> (cryptato) utilizzando le domande personalizzate.",STRONG_LEVEL:'Alto <span class="hidden-xs ">(minimo di 6 domande)</span>',TITLE:"Conto e sicurezza"},FILE_NAME:"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Date",AMOUNT:"Amount",COMMENT:"Comment"}},TRANSFER:{TITLE:"Bonifico",SUB_TITLE:"Fare un bonifico",FROM:"Da",TO:"A",AMOUNT:"Importo",AMOUNT_HELP:"Importo",COMMENT:"Commenti",COMMENT_HELP:"Commenti",BTN_SEND:"Inviare",BTN_ADD_COMMENT:"Scrivere un comento ?",WARN_COMMENT_IS_PUBLIC:"Ti avvertiamo <b>che i commenti sono pubblici</b> (non cifrati).",MODAL:{TITLE:"Bonifico"}},ERROR:{UNKNOWN_URI_FORMAT:"Formato URI sconosciuto",POPUP_TITLE:"Errore",UNKNOWN_ERROR:"Errore",CRYPTO_UNKNOWN_ERROR:"Suo navigatore non sembra compatibile con le funzionalità di cryptografia.",EQUALS_TO_PSEUDO:"Deve essere diverso dal pseudonimo",EQUALS_TO_SALT:"Deve essere diverso dal identificativo segreto",FIELD_REQUIRED:"Campo obbligatorio.",FIELD_TOO_SHORT:"Valore troppo corto.",FIELD_TOO_SHORT_WITH_LENGTH:"Valore troppo corto ({{minLength}} caratteri min)",FIELD_TOO_LONG:"Valore troppo lungo",FIELD_TOO_LONG_WITH_LENGTH:"Valore troppo lungo ({{maxLength}} caractteri max)",FIELD_MIN:"Valore minimo : {{min}}",FIELD_MAX:"Valore massimo : {{max}}",FIELD_ACCENT:"Virgole e caratteri accentati vietati",FIELD_NOT_NUMBER:"Valore numerico atteso",FIELD_NOT_INT:"Valore intero atteso",FIELD_NOT_EMAIL:"Indirizzo mail non valido",PASSWORD_NOT_CONFIRMED:"Non corrisponde alla password.",SALT_NOT_CONFIRMED:"Non corrisponde al identificativo segreto.",SEND_IDENTITY_FAILED:"Iscrizione fallita.",SEND_CERTIFICATION_FAILED:"Certificazione fallita.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Non puoi inviare certificazioni perche tuo conto <b>non è ancora un conto membro</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"Non puoi inviare certificazioni adesso perche <b>non sei ancora membro</b>.<br/><br/>Devi ancora entrare nella WOT.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Impossibile certificare questo conto. Nessuna richiesta di certificazione trovata o bisogna rinnovarla.",LOGIN_FAILED:"Errore di login.",LOAD_IDENTITY_FAILED:"Impossibile caricare la tua identità.",LOAD_REQUIREMENTS_FAILED:"Impossibile caricare i prerequisiti dell'identità.",SEND_MEMBERSHIP_IN_FAILED:"Ingresso nella WOT fallito.",SEND_MEMBERSHIP_OUT_FAILED:"Errore nel invio della revocazione.",REFRESH_WALLET_DATA:"Impossibile aggiornare il portafoglio.",GET_CURRENCY_PARAMETER:"Impossibile ricuperare i parametri della moneta.",GET_CURRENCY_FAILED:"Impossibile caricare la moneta. Riprovare più tardi.",SEND_TX_FAILED:"Impossibile eseguire la transazione.",ALL_SOURCES_USED:"Per favore aspetta il calcolo del prossimo blocco (Tutte le tue fonti di moneta sono state utilizzate).",NOT_ENOUGH_SOURCES:"Non hai abbastanza cambio per inviare questo importo in una sola transazione.<br/>Importo massimo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Errore nella creazione del tuo conto membro.",RESTORE_WALLET_DATA_ERROR:"Errore nel aggiornamento delle impostazioni definite in local storage.",LOAD_WALLET_DATA_ERROR:"Errore nel caricamento dei dati del portafoglio.",COPY_CLIPBOARD_FAILED:"Impossibile copiare al clipboard",TAKE_PICTURE_FAILED:"Impossibile ricuperare foto.",SCAN_FAILED:"Impossibile scansionare il codice QR.",SCAN_UNKNOWN_FORMAT:"Codice non riconosciuto.",WOT_LOOKUP_FAILED:"Ricerca fallita.",LOAD_PEER_DATA_FAILED:"Peer Duniter non accessibile. Riprovare più tardi.",NEED_LOGIN_FIRST:"Accedi al tuo conto prima.",AMOUNT_REQUIRED:"Importo necessario.",AMOUNT_NEGATIVE:"Importo negativo non consentito.",NOT_ENOUGH_CREDIT:"Saldo insufficiente",INVALID_NODE_SUMMARY:"Impossibile comunicare col peer o indirizzo non valido",INVALID_USER_ID:"Il campo del 'pseudonimo' non deve avere spazi vuoti o caratteri speciali.",INVALID_COMMENT:"Il formato del campo 'reference' è errato.",INVALID_PUBKEY:"If formato della chiave pubblica è errato.",INVALID_PUBKEY_CHECKSUM:"Checkum non valido.",IDENTITY_REVOKED:"Questa identità <b>è stata revocata</b>. Non puo più diventare membro.",IDENTITY_REVOKED_WITH_TIME:"Questa identità <b>è stata revocata {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Non puo più diventare membro.",IDENTITY_PENDING_REVOCATION:"L'<b>annulamento di questa identità</b> è stata richiesta ed è in corso di evaluazione. Capacità ad inviare certificazioni disabilitata",IDENTITY_INVALID_BLOCK_HASH:"Questa richiesta di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers): la persona deve rinnovare la sua domanda di certificazione <b>prima</b> di essere certificata.",IDENTITY_EXPIRED:"Questa identità è scaduta: la persona deve fare una nuova domanda di certificazione <b>prima di</b> essere certificata.",IDENTITY_SANDBOX_FULL:"Il nodo Duniter utilizzato da Cesium non puo ricevere altre domande di certificazione per ora, la lista d'attesa è piena.<br/><br/>Riprova più tardi o scegli un'altro peer Duniter (nelle <b>Impostazioni</b>).",IDENTITY_NOT_FOUND:"Identità non trovata",IDENTITY_TX_FAILED:"Impossibile caricare le operazioni",WOT_PENDING_INVALID_BLOCK_HASH:"Adesione non valida.",WALLET_INVALID_BLOCK_HASH:"Tua domanda di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers).<br/>Devi <a ng-click=\"doQuickFix('renew')\">rinnvoare la tua richiesta di adesione alla WOT</a> per risolvere il problema.",WALLET_IDENTITY_EXPIRED:"La pubblicazione della tua identità <b>è scaduta</b>.<br/>Devi <a ng-click=\"doQuickFix('fixIdentity')\">ripubblicare la tua identità</a> per risolvere il problema.",WALLET_REVOKED:"La tua identità è stata <b>revocata</b>: ne tuo pseudonimo ne tua chiave pubblica sarano utilizzati in futuro.",WALLET_HAS_NO_SELF:"La tua identità deve prima essere stata pubblicata e non essere ancora scaduta.",AUTH_REQUIRED:"Autenticazione necessaria.",AUTH_INVALID_PUBKEY:"La chiave pubblica non corrisponde al conto conesso.",AUTH_INVALID_SCRYPT:"Password o nome di utente non valido.",AUTH_INVALID_FILE:"File di portachiavi non valido.",AUTH_FILE_ERROR:"Impossibile aprire il file di portachiavi",IDENTITY_ALREADY_CERTIFY:"Hai <b>già certificato</b> questa identità.<br/><br/>Tuo certificato è ancora valido (scade {{expiresIn|formatDuration}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Hai <b>già certificato</b> questa identità.<br/><br/>Tua certificazione è ancora pendente (Scadenza del periodo di treatment {{expiresIn|formatDuration}}).",UNABLE_TO_CERTIFY_TITLE:"Impossibile certificare",LOAD_NEWCOMERS_FAILED:"Impossibile caricare i nuovi membri.",LOAD_PENDING_FAILED:"Impossibile caricare le certificazioni pendenti.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Devi <b>essere membro</b> per poter fare questo.",ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION:"Devi <b>essere membro</b> (o era un membro) per poter fare questo.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Devi aver <b>publiccato tua identità</b> per poter fare questo.",GET_BLOCK_FAILED:"Impossibile caricare il blocco",INVALID_BLOCK_HASH:"Blocco non trovato (hash errato)",DOWNLOAD_REVOCATION_FAILED:"Errore avvenuto nel download del file di cancellazione d'identità.",REVOCATION_FAILED:"Errore avvenuto durante la richiesta di cancellazione dell'identità.",SALT_OR_PASSWORD_NOT_CONFIRMED:"identificativo segreto o password sbagliati",RECOVER_ID_FAILED:"Impossibile ricuperare la password",LOAD_FILE_FAILED:"Impossibile caricare il file",NOT_VALID_REVOCATION_FILE:"File di cancellazione dell'identità errato (formato di file incorreto)",NOT_VALID_SAVE_ID_FILE:"File di backup dei credenziali errato (formato di file incorreto)",NOT_VALID_KEY_FILE:"File di portachiavi non valido (formato non riconosciuto)",EXISTING_ACCOUNT:"Tuoi credenziali corrispondono a quelli di un conto già esistente,di cui <a ng-click=\"showHelpModal('pubkey')\">la chiave pubblica</a> è:",EXISTING_ACCOUNT_REQUEST:"Per favore cambi tuoi credenziali in modo che corrispondino ad un conto non utilizzato.",GET_LICENSE_FILE_FAILED:"Impossibile caricare il file della licenza",CHECK_NETWORK_CONNECTION:"Nessun peer sembra disponibile.<br/><br/>Per favore <b>verifica la tua connessione Internet</b>.",ISSUE_524_TX_FAILED:"Bonifico .<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>."},INFO:{POPUP_TITLE:"Informazioni",CERTIFICATION_DONE:"Identità firmata con successo",NOT_ENOUGH_CREDIT:"Saldo insufficiente",TRANSFER_SENT:"Transazione inviata con successo",COPY_TO_CLIPBOARD_DONE:"Copiato con successo",MEMBERSHIP_OUT_SENT:"Revoca dell'identità inviata",NOT_NEED_MEMBERSHIP:"Già un membro.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Questa identità mancherà a breve di certificazioni (almeno {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revoca dell'identità inviata",REVOCATION_SENT_WAITING_PROCESS:"Cancellazione dell'identità <b>inviata con successo</b>. In attesa di validazione.",FEATURES_NOT_IMPLEMENTED:"Questa funzionalità non è ancora disponibile.<br/><br/>Vuoi contribuire per velocizzarne la disponibilità? ;)",EMPTY_TX_HISTORY:"Nessuna operazione da esportare"},CONFIRM:{POPUP_TITLE:"<b>Conferma</b>",POPUP_WARNING_TITLE:"<b>Avviso</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Avvertimento di sicurezza</b>',CERTIFY_RULES_TITLE_UID:"Certificare {{uid}}",CERTIFY_RULES:'<b class="assertive">Non certificare un conto</b> se credi che: <ul><li>1.) l\'identità della persona potrebbe essere finta.<li>2.) la oersona ha già un conto certicato.<li>3.) la persona trasgredisce la regola 1 o 2 o entrambe. (Certifica conti finti o gemelli).</ul></small><br/>Sei sicuro/a di voler certificare questa identità?',TRANSFER:"<b>Resoconto del bonifico:</b><br/><br/><ul><li> - Inviato da: <b>{{from}}</b></li><li> - A: <b>{{to}}</b></li><li> - Importo: <b>{{amount}} {{unit}}</b></li><li> - Comento: <i>{{comment}}</i></li></ul><br/><b>Sei sicuro di voler procedere con questo bonifico?</b>",MEMBERSHIP_OUT:"Questa operazione è <b>irreversibile</b>.<br/></br/><b>Sei sicuro/a di voler cancellare la tua presenza nella WOT?</b>",MEMBERSHIP_OUT_2:"Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a <b>di voler revocare la tua identità</b>?",LOGIN_UNUSED_WALLET_TITLE:"Errore di battitura?",LOGIN_UNUSED_WALLET:"Il conto sembra <b>inattivo</b>.<br/><br/>Probabilmente è un<b>errore di battitura</b> mientre digitavi i tuoi credenziali. Per favore riprova, verificando che la <b>chiave pubblica sia tua<b/>.",FIX_IDENTITY:"Lo pseudonimo <b>{{uid}}</b> verrà pubblicato nuovamente. Si sostituirà alla precedente pubblicazione che è scaduta.<br/></br/><b>Sei sicuro/a</b> di voler procedere?",FIX_MEMBERSHIP:"Tua domanda di certificazione sarà inviata alla rete.<br/></br/><b>Sei sicuro/a?</b>",MEMBERSHIP:"Tua domanda per diventare membro sta per essere inviata alla rete.<br/></br/><b>Sei sicuro/a/b> di voler continuare ?",RENEW_MEMBERSHIP:"Tua adesione verrà rinnovata.<br/></br/><b>Sei sicuro/a?</b>",REVOKE_IDENTITY:"Stai per <b>revocare definitivamente questa identità</b>.<br/><br/>La chiave pubblica e lo pseudonimo associato <b>non saranno mai più utilizzati</b> (per un conto membro).<br/></br/><b>Sei sicuro/a</b> di voler revocare questa identità?",REVOKE_IDENTITY_2:"Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a di volern<b>revocare questa identità</b>?",NOT_NEED_RENEW_MEMBERSHIP:"Tua presenza nella rete non deve ancora essere rinnovata (scaderà tra {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Sei sicuro/a</b> di voler rinnovare la tua presenza?",SAVE_BEFORE_LEAVE:"Vuoi <b>salvare tue modifiche</b> prima di uscira dalla pagina?",SAVE_BEFORE_LEAVE_TITLE:"Modifiche non salvate",LOGOUT:"Sei sicuro/a di voler chiudere la sessione?",USE_FALLBACK_NODE:"Peer <b>{{old}}</b> indisponibile o indirizzo errato.<br/><br/>Vuoi utilizzare temporanemante il <b>{{new}}</b> nodo?",INVALID_FILE_FORMAT:"Formato file non valido.",SAME_TX_RECIPIENT:"Il destinatario deve essere diverso dall'emittente."},MODE:{DEMO:{BADGE:"Demo",MODE:"Modalità dimostrativa",FEATURE_NOT_AVAILABLE:"Funzionalità <b>non disponibile</b> su questo sito dimostrativo.",MODE_HELP:"Il cesio funziona in <b>modalità dimostrativa</b>: è disponibile la consultazione per conto, ma non è possibile eseguire alcuna operazione per conto.",INSTALL_HELP:"Per <b>motivi di sicurezza</b> ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza."},READONLY:{BADGE:"Monit",MODE:"Modalità di monitoraggio",MODE_HELP:"Il cesio funziona in <b>modalità monitoraggio</b>: sono disponibili solo le funzionalità di monitoraggio della valuta.",INSTALL_HELP:"Se desidera <b>creare un account di portafoglio</b> per inviare o ricevere valuta, ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza."}},DOWNLOAD:{POPUP_TITLE:"<b>File di cancellazione dell'identità/b>",POPUP_REVOKE_MESSAGE:"Per migliorare la sicurezza del tuo conto, scarica <b>il documento di revoca del conto</b>. Ti consentirà di revocare tuo conto (nel caso di violazione del conto, della tua identità, conto creato con errori, etc.).<br/><br/><b>Tiene questo document al sicuro.</b>"},HELP:{TITLE:"Aiuto online",JOIN:{SECTION:"Entrare nella rete",SALT:"Il tuo identificativo segreto è molto importante. E utilizzato per cryptare tua password che permette poi di calcolare tua <span class=\"text-italic\">chiave pubblica</span> (suo numero) è la chiave privata che ne consenta l'accesso.<br/><b>Ricordati bene di questo identificativo</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiato senza dover creare un conto nuovo.<br/><br/>Raccomandiamo che sia abbastanza lungo (8 caratteri almeno) è il più originale possibile. (buona entropia)",PASSWORD:"La password è molto importante, è utilizzata per calcolare tuo numero di conto (tua chiave pubblica) e la chiave privata che ne consento l'accesso.<br/><b>Ricordatila bene</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiata senza dover creare un conto nuovo.<br/><br/>Una buona password (preferibilmente) è composta da almeno 8 caratteri, con almeno una maiuscola e un numero.",PSEUDO:'Un pseudonimo è utilizzato quando ti iscrivi come <span class="text-italic">membro</span>. E sempre associato ad un portafoglio (con sua <span class="text-italic">chiave pubblica</span>).<br/>E pubblicato sulla rete perche gli altri membri possino identificarla, certificarla o invarle soldi. <br/> Lo pseudonimo deve essere unico nella rete (tra quelli utilizzati adesso e in passato).'},LOGIN:{SECTION:"Accedi",PUBKEY:"Chiave pubblica del conto",PUBKEY_DEF:'La chiave pubblica del portachiavi è generata dai credenziali, ma non corrispode ad un conto già utilizzato.<br/><b>Accertati che tua chiave pubblica corrisponda al tuo conto</b>. Nel caso contrario, sarai conesso/a ad un conto probabilmente mai usato, datto che il rischio di collisione con un conto esistente è molto ridotto.<br/><a href="https://en.wikipedia.org/wiki/Elliptic_curve_cryptography" target="_ system">Saperne di più sulla cryptografia </a> con chiave pubblica.',METHOD:"Metodi di connessione",METHOD_DEF:"Hai diverse opzioni per accedere ad un portafoglio:<br/> - Accedendo con <b>salatura (leggera o sicura)</b> tua password sarà cryptata dal tuo identificativo segreto per scoraggiare tentativi di attachi di 'brute force' (per esempio con passwords conosciute).<br/> - Accedendo con la <b>chiave pubblica</b> ti evita di dover digitare tuoi credenziali che ti saranno chiesti solo quando vorrai fare una operazione col conto.<br/> - Accedendo <b>con un portachiavi</b> che leggerà tue chiave pubbliche e private da un file esterno, senza che tu li debba entrare."},GLOSSARY:{SECTION:"Glossario",PUBKEY_DEF:"Una chiave pubblica permette di identificare un portafoglio. Puo anche identificare un membro. In Cesium è calcolata con la password e lo pseudonimo.",MEMBER:"Membro",MEMBER_DEF:'Un membro è una persona reale e viva, che desidera participare liberamente alla communità monetaria. Questo membro riceverà un Dividendo Universale, a secondo delle regole definite <span class="text-italic">nei parametri della moneta</span>.',CURRENCY_RULES:"Regole della moneta",CURRENCY_RULES_DEF:'I parametri delle moneta sono state definite per sempre e per tutti. I parametri con i quali la moneta si comporta: il calcolo del Dividendo Universale, il numero di certificazioni necessarie per diventare membro, il numero massimo di certificazioni che un membro puo inviare, etc.<br/><br/>I parametri non possono essere modificati perche c\'è una<span class="text-italic">Blockchain</span> che implementa e esegue queste regole e verifica costantemente la loro applicazione. <a href="#/app/currency">Vedere i parametri </a>.',BLOCKCHAIN:"Blockchain",BLOCKCHAIN_DEF:'La Blockchain è un sistema decentralizzato che, nel caso di Duniter, permette di rispettare e implementare <span class="text-italic">le regole della moneta</span>.<br/><a href="http://en.duniter.org/presentation/" target="_blank">Saperne di più su Duniter</a> e il funzionamento della blockchain.',UNIVERSAL_DIVIDEND_DEF:'Il Dividendo Universale (UD) è la quantità di moneta co-creata da ogni membro, seguendo le formule mathematiche definite nelle <span class="text-italic">regole della moneta</span>.<br/>Al inizio di ogni periodo, il conto di ogni membro riceve una quantità uguale della nuova moneta creata. <br/><br/>Il DU conosce una crescita costante per rimanere equo nei confronti dei membri (attuali e passati). Viene calcolato tenendo in conto la speranza di vità media, cosi come dimostrato nella Teoria Relativa della Moneta (TRM).<br/><a href="http://trm.creationmonetaire.info" target="_system">Saperne di più sulla TRM</a> e la moneta libera.'},TIP:{MENU_BTN_CURRENCY:"Menu <b>{{'MENU.CURRENCY'|translate}}</b> permette la scoperta dei <b>parametri della moneta</b> e la sua condizione presente.",CURRENCY_WOT:"Il <b>numero di membri</b> mostra <b>le dimensioni della WoT e la sua evoluzione </b>.",CURRENCY_MASS:"In evidenza qui è <b>l'importo totale</b> attualmente in circolazione e la sua <b> ripartizione media </b> a testa.<br/><br/>Questa cifra permette di avere un'idea <b>del valore di qualsiasi importo</b>, in base a quello <b>hanno gli altri</b> sul loro conto (in media).",CURRENCY_UNIT_RELATIVE:"L'unità usata qui (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa che gli importi in {{currency|capitalize}} sono stati divisi dal <b>Dividendo Universale</b> (DU).<br/><br/><small>Questa unità relativa <b>ha senso</b> perche è stabile in contrasto con la massa monetaria che cresce costantemente.</small>",CURRENCY_CHANGE_UNIT:"Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette di <b>permutare unità</b> per vedere gli importi in <b>{{currency|capitalize}}</b>, non divisi dal Dividendo Universale (piuttosto che in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",CURRENCY_CHANGE_UNIT_TO_RELATIVE:"Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette <b>di permutare unità</b> per vedere gli importi in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, che è relativo al Dividendo Universale (l'importo co-prodotto da ogni membro).",CURRENCY_RULES:"Le<b>regole</b> della moneta determinano il suo <b>esatto e previdibile</b> comportamento.<br/><br/> Considerate come il proprio DNA della moneta, queste regole rendono il codice monetario <b>trasparente e comprensibile</b>.",MENU_BTN_NETWORK:"Menu <b>{{'MENU.NETWORK'|translate}}</b> permette la scopertà dello <b>stato della rete<b>.",NETWORK_BLOCKCHAIN:"Tutte le transazioni monetarie sono registrate in <b>registro sicuro e a prova di manomissione</b>, spesso chiamato <b>blockchain</b>.",NETWORK_PEERS:"I<b>peers</b> mostrati qui corrispondono a <b>dei computers che aggiornano e monitorano</b> la blockchain.<br/><br/>Più peers ci sono, più <b>decentralizzata</b> e più affidabile diventa la moneta.",NETWORK_PEERS_BLOCK_NUMBER:"Questo <b>numero</b> (in verda) indica <b>l'ultimo blocco validato</b> dal peer (ultima pagina scritta nel regitro).<br/><br/>Il verda indica che il blocco è stato validato anche dalla <b>maggioranza degli altri peers</b>.",NETWORK_PEERS_PARTICIPATE:'<b>Ogni membro</b>, che dispone di un computer connesso a Internet <b>puo partecipare, aggiungendosi come peer installando il software Duniter</b> (free/libre). <a target="_new" href="{{installDocUrl}}" target="_system">Leggi il manuale d\'installazione &gt;&gt;</a>.',MENU_BTN_ACCOUNT:"<b>{{'ACCOUNT.TITLE'|translate}}</b> permette l'accesso al saldo del conto e la cronologia delle transazioni.",MENU_BTN_ACCOUNT_MEMBER:"Qui puoi consultare lo stato del tuo conto, la cronologia delle transazioni e le tue certificazioni.",WALLET_CERTIFICATIONS:"Clicca qui per vedere i dettagli delle tue certificazioni (date o ricevute).",WALLET_RECEIVED_CERTIFICATIONS:"Clicca qui per vedere i dettagli delle <b>certificazioni che hai ricevuto</b>.",WALLET_GIVEN_CERTIFICATIONS:"Clicca qui per vedere i dettagli delle <b>certificazioni che hai date</b>.",WALLET_BALANCE:"Il <b>soldo</b> del tuo conto è visibile qui.",
WALLET_BALANCE_RELATIVE:"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unità utilizzata (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa che questo importo in {{currency|capitalize}} è stato diviso dal <b>Dividendo Universale</b> (DU) co-creato da ogni membro.<br/>Ad oggi, 1 DU equivale a {{currentUD}} {{currency|capitalize}}.",WALLET_BALANCE_CHANGE_UNIT:"Puoi <b>cambiare l'unità</b> in cui sono mostrati gli importi in <b><i class=\"icon ion-android-settings\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Per esempio, per mostrare gli importi <b>direttamente in {{currency|capitalize}}</b> piuttosto che in unità relativa.",WALLET_PUBKEY:"Questa è la chiave pubblica del tuo conto. La puoi dare ad un terzo perche possa identificare tuo conto.",WALLET_SEND:"Paghi in pochi clics.",WALLET_SEND_NO_MONEY:"Paghi in pochi clics.<br/>(Tuo saldo ancora non lo permette)",WALLET_OPTIONS:"Questo bottone permette di fare <b>altre, meno frequenti azioni</b>.<br/><br/> Non dimenticarti di fare il tour guidato di Cesium quando hai un attimo!",WALLET_RECEIVED_CERTS:"Questo mostra l'elenco delle persone che ti hanno fatto entrare nella WoT.",WALLET_CERTIFY:"Questo bottone <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permette di selezionare e certificare una identità.<br/><br/>Solo gli utenti <b>che sono già membri</b> possono certificare gli altri.",WALLET_CERT_STOCK:"Tuo stock di certificazioni da dare è limitato a <b>{{sigStock}} certificazioni</b>.<br/><br/>Questo stock si rifornisce col tempo, man mano che le certificazioni inviate scadono.",MENU_BTN_TX:"<b>{{'MENU.TRANSACTIONS'|translate}}</b> permette l'accesso alla cronologia delle transazioni, e permette di fare nuovi bonifici.",MENU_BTN_WOT:"Il menu<b>{{'MENU.WOT'|translate}}</b> permette di cercare <b>utenti</b> della moneta (membri o non).",WOT_SEARCH_TEXT_XS:"Per fare una ricerca nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>La ricerca inizierà automaticamente.",WOT_SEARCH_TEXT:"Per cercare nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>Dopodichè calca <b>Enter</b> per avviare la ricerca.",WOT_SEARCH_RESULT:"Visualizza la scheda dettagliata di un utente con un semplice click sulla linea.",WOT_VIEW_CERTIFICATIONS:"La linea <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> mostra quanti membri hanno certificato questa identità.<br/><br/>Queste certificazioni dimostrano che il conto appartiene ad <b>una persona viva</b> e che questa persona non ha <b>nessun altro conto membro</b>.",WOT_VIEW_CERTIFICATIONS_COUNT:"Ci vogliono almeno <b>{{sigQty}} certificazioni</b> per diventare membro e co-produrre il <b>Dividendo Universale</b>.",WOT_VIEW_CERTIFICATIONS_CLICK:"Clicca qui per aprire <b>una lista di tutte le certificazioni</b> ricevute e date da questa identità.",WOT_VIEW_CERTIFY:"Il bottone <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permette di aggiungere tua certificazione a questa identità.",CERTIFY_RULES:"<b>Attenzione:</b> Certifichi <b> solo persone reali e vive</b> che non hanno nessun altro conto membro.<br/><br/>L'affidabilità della moneta dipende della vigilanza di ciascuno.",MENU_BTN_SETTINGS:"Les <b>{{'MENU.SETTINGS'|translate}}</b> ti permettono di configurare Cesium.<br/><br/>Per esempio, puoi <b>cambiare l'unità</b> in cui visualizzi la moneta.",HEADER_BAR_BTN_PROFILE:"Clicca qui per entrare nel <b>tuo profilo utente</b>",SETTINGS_CHANGE_UNIT:"Puoi cambiare <b>l'unità</b> della moneta cliccando qui.<br/><br/>- Disabilita questa opzione per vedere gli importi in {{currency|capitalize}}.<br/>- Abilita l'opzione per importi relativi in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divisi</b> dal attuale Dividendo Universale).",END_LOGIN:"Il tour guidato <b>è finito</b>.<br/><br/>Benvenuto nel <b>economia libera</b>!",END_NOT_LOGIN:"Il tour guidato <b>è finito</b>.<br/><br/>Se desideri entrare nella Web of Trust {{currency|capitalize}}, basta cliccare <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> qui sotto.",END_READONLY:"Il tour guidato <b>è finito</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."}},API:{COMMON:{LINK_DOC:"documentazione API",LINK_DOC_HELP:"Documentazione dello sviluppatore",LINK_STANDARD_APP:"versione classica",LINK_STANDARD_APP_HELP:"Apri la versione classica di {{'COMMON.APP_NAME'|translate}}"},HOME:{TITLE:"Documentazione API {{'COMMON.APP_NAME'|translate}}",MESSAGE:'Bienvenue dans la <b>documentation de l\'API</b> {{\'COMMON.APP_NAME\'|translate}}.<br/>Connecter vos sites web à <a href="http://duniter.org" target="_system">Duniter</a> très simplement !',MESSAGE_SHORT:'Connecter vos sites à <a href="http://duniter.org" target="_system">Duniter</a> très simplement !',DOC_HEADER:"Services disponibles :"},TRANSFER:{TITLE:"{{'COMMON.APP_NAME'|translate}} - Paiement en ligne",TITLE_SHORT:"Pagamento online",SUMMARY:"Récapitulatif de la commande :",AMOUNT:"Montant :",NAME:"Nom :",PUBKEY:"Clé publique du destinaire :",COMMENT:"Référence de la commande :",DEMO:{SALT:"demo",PASSWORD:"demo",PUBKEY:"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",HELP:"<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",BAD_CREDENTIALS:"Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}"},INFO:{SUCCESS_REDIRECTING_WITH_NAME:"Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...",SUCCESS_REDIRECTING:"Paiement envoyé.<br/>Redirection vers le site du vendeur...",CANCEL_REDIRECTING_WITH_NAME:"Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...",CANCEL_REDIRECTING:"Paiement annulé.<br/>Redirection vers le site du vendeur..."},ERROR:{TRANSFER_FAILED:"Mancato pagamento"}},DOC:{DESCRIPTION_DIVIDER:"Descrizione",URL_DIVIDER:"Indirizzo chiamata",PARAMETERS_DIVIDER:"Impostazioni",AVAILABLE_PARAMETERS:"Ecco l'elenco dei parametri disponibili :",DEMO_DIVIDER:"Provare",DEMO_HELP:"Per provare questo servizio, clicca sul bottone qui a fianco. Il risultato apparirà qui sotto .",DEMO_RESULT:"Risultato della chiamata :",DEMO_SUCCEED:'<i class="icon ion-checkmark"></i> Successo !',DEMO_CANCELLED:'<i class="icon ion-close"></i> Annulato dal utente',INTEGRATE_DIVIDER:"Integrare",INTEGRATE_CODE:"Codice :",INTEGRATE_RESULT:"Previsualizzare il risultato :",INTEGRATE_PARAMETERS:"Parametri",TRANSFER:{TITLE:"Pagamenti",DESCRIPTION:"Da un sito (per es. : un sito e-commerce) si può delegare il pagamento in moneta libera a Cesium API. Per invocare l'API, basta innescare l'apertura di una pagina con questo indirizzo:",PARAM_PUBKEY:"Chiave pubblica del destinatario",PARAM_PUBKEY_HELP:"Chiave pubblica del destinatario (obliggatoria)",PARAM_AMOUNT:"Importo",PARAM_AMOUNT_HELP:"Importo della transazione (obligatorio)",PARAM_COMMENT:"Riferimento (o commento)",PARAM_COMMENT_HELP:"Riferimento o commento. Ti può aiutare per esempio a trovare tuo pagamento nella blockchain.",PARAM_NAME:"Nome (de destinatario o del sito web)",PARAM_NAME_HELP:'Nom del sito web o del destinatario chiamando l\'API. Può essere un nome leggibile ("Mio sito"), oppure l\'indirizzo http del sito ("MioSito.com").',PARAM_REDIRECT_URL:"Indirizzo web di redirezione",PARAM_REDIRECT_URL_HELP:'Indirizzo web (URL) di redirezione, chiamato dopo aver inviato il pagamento. Può includere le seguenti stringe, che saranno sostituite con i valori della transazione : "{tx}", "{hash}", "{comment}", "{amount}" e {pubkey}.',PARAM_CANCEL_URL:"Indirizzo web della cancellazione",PARAM_CANCEL_URL_HELP:'Indirizzo web (URL) in caso dell\'annullamento del pagamento dall\'utente. Può includere le seguenti stringe, che saranno sostituite dinamicamente : "{comment}", "{amount}" e {pubkey}.',EXAMPLES_HELP:"Ecco esempi di integrazione :",EXAMPLE_BUTTON:"Bottone HTML",EXAMPLE_BUTTON_DEFAULT_TEXT:"Pagare in {{currency|currencySymbol}}",EXAMPLE_BUTTON_DEFAULT_STYLE:"Stile personnalizzato",EXAMPLE_BUTTON_TEXT_HELP:"Testo del bottone",EXAMPLE_BUTTON_BG_COLOR:"Colore del fondo",EXAMPLE_BUTTON_BG_COLOR_HELP:"Per esempio: #fbc14c, black, lightgrey, rgb(180,180,180)",EXAMPLE_BUTTON_FONT_COLOR:"Colore del testo",EXAMPLE_BUTTON_FONT_COLOR_HELP:"Esempio: black, orange, rgb(180,180,180)",EXAMPLE_BUTTON_TEXT_ICON:"Icona",EXAMPLE_BUTTON_TEXT_WIDTH:"Larghezza",EXAMPLE_BUTTON_TEXT_WIDTH_HELP:"Esempio: 200px, 50%",EXAMPLE_BUTTON_ICON_NONE:"Nessuna",EXAMPLE_BUTTON_ICON_DUNITER:"Logo Duniter",EXAMPLE_BUTTON_ICON_CESIUM:"Logo Cesium",EXAMPLE_BUTTON_ICON_G1_COLOR:"Logo Ğ1",EXAMPLE_BUTTON_ICON_G1_BLACK:"Logo Ğ1 (nero)"}}}}),e.translations("nl-NL",{COMMON:{APP_NAME:"Cesium",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Publieke sleutel",MEMBER:"Lid",BLOCK:"Blok",BTN_OK:"OK",BTN_YES:"Ja",BTN_NO:"Nee",BTN_SEND:"Verzenden",BTN_SEND_MONEY:"Verstuur geld",BTN_SEND_MONEY_SHORT:"Versturen",BTN_SAVE:"Opslaan",BTN_YES_SAVE:"Ja, opslaan",BTN_YES_CONTINUE:"Ja, doorgaan",BTN_SHOW:"Tonen",BTN_SHOW_PUBKEY:"Toon sleutel",BTN_RELATIVE_UNIT:"Gebruik relatieve eenheid",BTN_BACK:"Terug",BTN_NEXT:"Volgende",BTN_CANCEL:"Annuleer",BTN_CLOSE:"Sluit",BTN_LATER:"Later",BTN_LOGIN:"Aanmelden",BTN_LOGOUT:"Uitloggen",BTN_ADD_ACCOUNT:"Nieuwe Rekening",BTN_SHARE:"Delen",BTN_EDIT:"Bewerken",BTN_DELETE:"Wissen",BTN_ADD:"Toevoegen",BTN_SEARCH:"Zoeken",BTN_REFRESH:"Verwezenlijken",BTN_START:"Beginnen",BTN_CONTINUE:"Doorgaan",BTN_UNDERSTOOD:"Ik heb het begrepen",BTN_OPTIONS:"Opties",BTN_HELP_TOUR:"Rondleiding",BTN_HELP_TOUR_SCREEN:"Ontdek dit scherm",BTN_DOWNLOAD:"Downloaden",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Downloaden het rekeningoverzicht",BTN_MODIFY:"Bewerken",DAYS:"dagen",NO_ACCOUNT_QUESTION:"Nog geen lid? Registreer nu!",SEARCH_NO_RESULT:"Geen resultaten",LOADING:"Even geduld...",SEARCHING:"Zoeken...",FROM:"Van",TO:"Aan",COPY:"Kopieren",LANGUAGE:"Taal",UNIVERSAL_DIVIDEND:"Universeel 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:"(leeg)",UID:"Pseudoniem",ENABLE:"Geactiveerd",DISABLE:"Gedeactiveerd",RESULTS_LIST:"Resultaten:",RESULTS_COUNT:"{{count}} uitslagen",EXECUTION_TIME:"uitgevoerd in {{duration|formatDurationMs}}",SHOW_VALUES:"Toon waarden openlijk?",POPOVER_ACTIONS_TITLE:"Opties",POPOVER_FILTER_TITLE:"Filters",SHOW_MORE:"Toon meer",SHOW_MORE_COUNT:"(huidig limiet op {{limit}})",POPOVER_SHARE:{TITLE:"Delen",SHARE_ON_TWITTER:"Deel op Twitter",SHARE_ON_FACEBOOK:"Deel op Facebook",SHARE_ON_DIASPORA:"Deel op Diaspora*",SHARE_ON_GOOGLEPLUS:"Deel op Google+"}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Selecteer bron:",BTN_PICTURE_GALLERY:"Gallerij",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Welkom",WOT:"Register",CURRENCY:"Valuta",CURRENCIES:"Valuta's",ACCOUNT:"Mijn rekening",SETTINGS:"Instellingen",NETWORK:"Netwerk",TRANSACTIONS:"Mijn transacties"},ABOUT:{TITLE:"Over",LICENSE:"<b>Vrije</b> software (GNU AGPLv3 licentie).",CODE:"Broncode:",DEVELOPERS:"Ontwikkelaars:",FORUM:"Forum:",DEV_WARNING:"Waarschuwing",DEV_WARNING_MESSAGE:"Deze applicatie is nog in actieve onwikkeling.<br/>Meld ons elk pobleem!",DEV_WARNING_MESSAGE_SHORT:"Deze App is nog instabiel (in ontwikkeling).",REPORT_ISSUE:"Meld een probleem"},HOME:{TITLE:"Cesium",WELCOME:"Welkom bij de Cesium Applicatie!",MESSAGE:"Bekijk je {{currency|abbreviate}} portefeilles in real time.",BTN_REGISTRY:"Register",BTN_CURRENCY:"Verken valuta",BTN_ABOUT:"over",BTN_HELP:"Help",REPORT_ISSUE:"Meld een probleem",NOT_YOUR_ACCOUNT_QUESTION:'Is rekening <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b> niet van jou?',BTN_CHANGE_ACCOUNT:"Dze rekening ontkoppelen",CONNECTION_ERROR:'Node <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Controleer de internetverbinding, of schakel knooppunt <a class="positive" ng-click="doQuickFix(\'settings\')">in parameters</a>.'},SETTINGS:{TITLE:"Instellingen",NETWORK_SETTINGS:"Netwerk",PEER:"Duniter knooppunt adres",PEER_CHANGED_TEMPORARY:"Adres tijdelijk worden gebruikt",USE_LOCAL_STORAGE:"Lokale opslag inschakelen",USE_LOCAL_STORAGE_HELP:"Laat je instellingen opslaan",ENABLE_HELPTIP:"Contextgebonden hulp inschakelen",ENABLE_UI_EFFECTS:"Schakel visuele effecten",HISTORY_SETTINGS:"Mijn rekening",DISPLAY_UD_HISTORY:"Toon geproduceerde dividenden?",AUTHENTICATION_SETTINGS:"Authentificatie",REMEMBER_ME:"Onthoud mij",REMEMBER_ME_HELP:"Hiermee kunt u blijven altijd aangesloten (niet aanbevolen).",PLUGINS_SETTINGS:"Uitbreidingen",BTN_RESET:"Herstel standaardinstellingen",EXPERT_MODE:"Geavanceerde modus inschakelen",EXPERT_MODE_HELP:"Toon meer details",POPUP_PEER:{TITLE:"Duniter Knooppunt",HOST:"Adres",HOST_HELP:"Aadres: server:poort",USE_SSL:"Secure?",USE_SSL_HELP:"(SSL-encryptie)",BTN_SHOW_LIST:"Lijst van knooppunten"}},BLOCKCHAIN:{HASH:"Hachee : {{hash}}",VIEW:{HEADER_TITLE:"Blok #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Huidige blok",TITLE:"Blok #{{number|formatInteger}}",COMPUTED_BY:"Berekend door het knooppunt",SHOW_RAW:"Bekijk RAW-bestand",TECHNICAL_DIVIDER:"Technische informatie",VERSION:"Format versie",HASH:"Hash berekend",UNIVERSAL_DIVIDEND_HELP:"Munt gecoproduceerd door elk van de {{membersCount}} ledental",EMPTY:"Er zijn geen gegevens in dit blok",POW_MIN:"Mminimum moeilijkheid",POW_MIN_HELP:"Moeilijkheid opgelegd hash te berekenen",DATA_DIVIDER:"Gegevens",IDENTITIES_COUNT:"Nieuwe identiteiten",JOINERS_COUNT:"Nieuwe leden",ACTIVES_COUNT:"Verlengingen",ACTIVES_COUNT_HELP:"Leden die hun lidmaatschap te vernieuwen",LEAVERS_COUNT:"Verlaters",LEAVERS_COUNT_HELP:"Leden die niet langer wenst certificering",EXCLUDED_COUNT:"Uitgesloten leden",EXCLUDED_COUNT_HELP:"Oud-leden uitgesloten door niet-verlenging of gebrek aan certificeringen",REVOKED_COUNT:"Identiteiten ingetrokken",REVOKED_COUNT_HELP:"Deze rekeningen zullen niet langer leden",TX_COUNT:"Transacties",CERT_COUNT:"Certificeringen",TX_TO_HIMSELF:"Ruil deal",TX_OUTPUT_UNLOCK_CONDITIONS:"Omstandigheden van de introductie",TX_OUTPUT_OPERATOR:{AND:"en",OR:"of"},TX_OUTPUT_FUNCTION:{SIG:"<b>handtekening</b> ",XHX:"<b>Wachtwoord</b>, wiens SHA256 =",CSV:"Geblokkeerd",CLTV:"Opgesloten"}},LOOKUP:{TITLE:"Blokken",NO_BLOCK:"Geen blok",LAST_BLOCKS:"Recente blokken :",BTN_COMPACT:"Compact"}},CURRENCY:{SELECT:{TITLE:"Valuta's",CURRENCIES:"Bekende valuta's",MEMBERS_COUNT:"{{membersCount}} leden"},VIEW:{TITLE:"Valuta",TAB_CURRENCY:"Valuta",TAB_WOT:"Gemeenschap",TAB_NETWORK:"Netwerk",CURRENCY_NAME:"Valuta naam",MEMBERS:"Ledental",MEMBERS_VARIATION:"Variatie since {{duration | formatDuration}}",MONEY_DIVIDER:"Geld",MASS:"Monetaire massa",SHARE:"Aandeel per lid",UD:"Universeel Dividend",C_ACTUAL:"Huidige toename",MEDIAN_TIME:"Blockchain tijd",POW_MIN:"Algemene moeilijkheidsgraad",MONEY_RULES_DIVIDER:"Monetaire regels",C_RULE:"Toename",UD_RULE:"Universeel dividend (formule)",SIG_QTY_RULE:"Benodigd aantal certificaties om lid te worden",SIG_STOCK:"Maximum aantal certificaties te versturen per lid",SIG_PERIOD:"Minimum vertraging tussen 2 certificaties verzonden door één en dezelfde persoon.",SIG_WINDOW:"Maximum vertraging voor een certificatie in behandeling wordt genomen",STEP_MAX:"Maximum afstand tussen elk WoT lid en een nieuw lid.",WOT_RULES_DIVIDER:"Lidmaatschapseisen",XPERCENT:"Minimum percentage schildwachten te bereiken om de afstandsregel te respecteren"}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain tijd",LOADING_PEERS:"Even geduld...",NODE_ADDRESS:"Adres :",ENDPOINTS:{BMAS:"Endpoint (SSL)",BMATOR:"Endpoint TOR",ES_USER_API:"Knoop Cesium+"}},INFO:{ONLY_SSL_PEERS:"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS."}},PEER:{PEERS:"Knopen",SIGNED_ON_BLOCK:"Getekend op blok",MIRROR:"spiegel",CURRENT_BLOCK:"Blok #",VIEW:{TITLE:"Knoop",OWNER:"Maakt deel uit van",SHOW_RAW_PEERING:"Zie netwerkdocument",KNOWN_PEERS:"Bekende knopen :",GENERAL_DIVIDER:"Algemene informatie",ERROR:{LOADING_TOR_NODE_ERROR:"Kan knooppunt niet worden opgehaald. De wachttijd wordt overschreden.",LOADING_NODE_ERROR:"Kan knooppunt niet worden opgehaald"}}},WOT:{SEARCH_HELP:"Zoeken (lid of publieke sleutel)",SEARCH_INIT_PHASE_WARNING:"Tijdens de pre-registratiefase, het zoeken van lopende registraties <b>kan lang</b> zijn. Dank je wel geduld...",REGISTERED_SINCE:"Registratie",REGISTERED_SINCE_BLOCK:"Geregistreerd op blok #",NO_CERTIFICATION:"Geen gevalideerde certificaties",NO_GIVEN_CERTIFICATION:"Geen uitgegeven certificaties",NOT_MEMBER_PARENTHESIS:"(niet-lid)",IDENTITY_REVOKED_PARENTHESIS:"(ingetrokken identiteit)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(intrekking in behandeling)",EXPIRE_IN:"Verloopt",NOT_WRITTEN_EXPIRE_IN:"Uiterlijke<br/>behandeling",EXPIRED:"Verlopen",PSEUDO:"Pseudoniem",SIGNED_ON_BLOCK:"Uitgegeven op block #{{block}}",WRITTEN_ON_BLOCK:"Geschreven op block #{{block}}",GENERAL_DIVIDER:"Algemene informatie",NOT_MEMBER_ACCOUNT:"Simpele rekening (geen lid)",NOT_MEMBER_ACCOUNT_HELP:"Dit is een eenvoudige rekening, zonder dat er een aanvraag voor lidmaatschap in de wacht wordt gezet.",TECHNICAL_DIVIDER:"Technische informatie",BTN_CERTIFY:"Certificeren",BTN_YES_CERTIFY:"Ja, Certificeren",BTN_SELECT_AND_CERTIFY:"Nieuwe certificatie",ACCOUNT_OPERATIONS:"Operaties op de rekening",VIEW:{POPOVER_SHARE_TITLE:"Identiteit {{title}}"},LOOKUP:{TITLE:"Register",NEWCOMERS:"Nieuwe leden:",PENDING:"Aspirant leden:",REGISTERED:"Geregistreerd {{sigDate | formatFromNow}}",MEMBER_FROM:"Lid sinds {{memberDate|medianFromNowShort}}",BTN_NEWCOMERS:"Nieuwste leden",BTN_PENDING:"Registraties in afwachting",SHOW_MORE:"Toon meer",SHOW_MORE_COUNT:"(huidige limiet op {{limit}})",NO_PENDING:"Er zijn geen registraties in afwachting gevonden.",NO_NEWCOMERS:"Er zijn geen nieuwe leden gevonden."},MODAL:{TITLE:"Zoeken"},CERTIFICATIONS:{TITLE:"{{uid}} - Certificaties",SUMMARY:"Ontvangen certificaties",LIST:"Details van ontvangen certificaties",PENDING_LIST:"Certificaties in afwachting",RECEIVED:"Ontvangen certificaties",RECEIVED_BY:"Certificaties ontvanged door {{uid}}",ERROR:"Ontvangen vertificaties met fout",SENTRY_MEMBER:"Referent lid"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Verzonden certificaties",SUMMARY:"Verzonden certificaties",LIST:"Details van verzonden certificaties",PENDING_LIST:"Certificaties in afwachting",SENT:"Verzonden certificaties",SENT_BY:"Certificaties verzonden door {{uid}}",ERROR:"Verzonden certificaties met fout"}},LOGIN:{TITLE:'<i class="icon ion-locked"></i> Inloggen',SALT:"Beveiligingszin",SALT_HELP:"Zin ter beveiliging van je rekening",SHOW_SALT:"Toon de beveiligingszin",PASSWORD:"Wachtwoord",PASSWORD_HELP:"Wachtwoord ter beveiliging van je rekening",NO_ACCOUNT_QUESTION:"Nog geen rekening?",CREATE_ACCOUNT:"Open een rekening",FORGOTTEN_ID:"Wachtwoord vergeten?"},ACCOUNT:{TITLE:"Mijn rekening",BALANCE:"Saldo",LAST_TX:"Recente transacties",BALANCE_ACCOUNT:"Rekeningsaldo",NO_TX:"Geen transacties",SHOW_MORE_TX:"Show more",SHOW_ALL_TX:"Show all",TX_FROM_DATE:"(huidige limiet op {{fromTime|medianFromNowShort}})",PENDING_TX:"Transacties in afwachting",ERROR_TX:"Niet uitgevoerde transacties",ERROR_TX_SENT:"Verzonden transacties",ERROR_TX_RECEIVED:"Ontvangen transacties",EVENTS:"Gebeurtenissen",WAITING_MEMBERSHIP:"Lidmaatschapsverzoek verzonden. In afwachting van validatie.",WAITING_CERTIFICATIONS:"Je hebt {{needCertificationCount}} certificatie(s) nodig om lid te worden",WILL_MISSING_CERTIFICATIONS:"Je heeft binnenkort <b>onvoldoende certificaties</b> (ten minste {{willNeedCertificationCount}} benodigd)",WILL_NEED_RENEW_MEMBERSHIP:"Je lidmaatschap <b>gaat verlopen op {{membershipExpiresIn|formatDurationTo}}</b>. Vergeet niet <a ng-click=\"doQuickFix('renew')\">je lidmaatschap te vernieuwen</a> voor die tijd.",CERTIFICATION_COUNT:"Aantal certificaties",CERTIFICATION_COUNT_SHORT:"Certificaties",SIG_STOCK:"Voorraad uit te geven certificaties",BTN_RECEIVE_MONEY:"Ontvangen",BTN_MEMBERSHIP_IN_DOTS:"Lidmaatschap aanvragen...",BTN_MEMBERSHIP_RENEW:"Lidmaatschap verlengen",BTN_MEMBERSHIP_RENEW_DOTS:"Lidmaatschap verlengen...",BTN_MEMBERSHIP_OUT_DOTS:"Lidmaatschap opzeggen...",BTN_SEND_IDENTITY_DOTS:"Identiteit publiceren...",BTN_SECURITY_DOTS:"Rekening en veiligheid...",BTN_SHOW_DETAILS:"Tonen technische informatie",BTN_REVOKE:"Deze identiteit<span class='hidden-xs hidden-sm'> definitief</span> opzeggen...",NEW:{TITLE:"Registratie",SLIDE_1_TITLE:"Selecteer een valuta:",SLIDE_2_TITLE:"Soort rekening:",MEMBER_ACCOUNT:"Persoonlijke rekening (lidmaatschap)",MEMBER_ACCOUNT_HELP:"Als je nog niet als individu geregistreerd bent (één rekening per individu mogelijk).",WALLET_ACCOUNT:"Eenvoudige portefeille",WALLET_ACCOUNT_HELP:"Als je een onderneming, stichting etc. vertegenwoordigd of eenvoudigweg een additionele portefeille nodig hebt. Geen individueel universeel dividend zal door deze rekening gecréeerd worden.",SALT_WARNING:"Kies een beveiligingszin.<br/>Deze heb je nodig voor ieder verbinding met je rekening.<br/><br/><b>Zorg dat je deze zin goed onthoud</b>.<br/>Eenmaal verloren, is er geen mogelijkheid om hem te achterhalen!",PASSWORD_WARNING:"Kies een wachtwoord.<br/>Deze heb je nodig voor ieder verbinding met je rekening.<br/><br/><b>Zorg dat je dit woord goed onthoud</b>.<br/>Eenmaal verloren, is er geen mogelijkheid om hem te achterhalen!",PSEUDO_WARNING:"Kies een pseudoniem.<br/>Het dient om makkelijker gevonden te worden door anderen.<br/><br/>.Gebruik van spaties, komma's en accenten is niet toegestaan.<br/><div class='hidden-xs'><br/>Voorbeeld: <span class='gray'>JulesDeelder, JohanVermeer, etc.</span>",PSEUDO:"Pseudoniem",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Bevestig",SALT_CONFIRM_HELP:"Bevestig de beveiligingszin",PASSWORD_CONFIRM:"Bevestig",PASSWORD_CONFIRM_HELP:"Bevestig het wachtwoord",SLIDE_6_TITLE:"Bevestiging:",COMPUTING_PUBKEY:"Berekening...",LAST_SLIDE_CONGRATULATION:"Bravo! Je hebt alle verplichte velden ingevuld.<br/>Je kunt je <b>rekeningaanvraag verzenden</b>.<br/><br/>Ter informatie, de publieke sleutel hieronder identificeert je toekomstige rekening.<br/>Je kunt deze aan derde partijen communiceren om geld te ontvangen. Zodra je rekening geopend is, kun je de sleutel terugvinden onder <b>{{'ACCOUNT.TITLE'|translate}}</b>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Waarschuwing:</b> je beveiligingszin, wachtwoord en pseudoniem kunnen hierna niet gewijzigd worden.<br/><b>Zorg dat ze goed onthoudt!</b><br/><b>Weet je zeker</b> dat je je persoonlijke rekeningaanvraag wil verzenden?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Waarschuwing:</b> je wachtwoord en pseudoniem kunnen hierna niet gewijzigd worden.<br/><b>Zorg dat ze goed onthoudt!</b><br/><b>Weet je zeker</b> dat je deze portefeilleaanvraag wil verzenden?',PSEUDO_AVAILABLE:"Deze naam is beschikbaar",PSEUDO_NOT_AVAILABLE:"Deze gebruikersnaam is niet beschikbaar",INFO_LICENSE:"Om de valuta te sluiten, vragen wij u om te lezen en deze licentie te accepteren.",BTN_ACCEPT:"Ik accepteer",BTN_ACCEPT_LICENSE:"Ik ga akkoord met de licentie"},POPUP_REGISTER:{TITLE:"Voer een pseudoniem in",HELP:"Een pseudoniem is nodig voor anderen om je te kunnen vinden."},FILE_NAME:"{{currency}} - Rekeningafschrift {{pubkey|formatPubkey}} {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Datum",AMOUNT:"Bedrag",COMMENT:"Commentaar"}},TRANSFER:{TITLE:"Overboeken",SUB_TITLE:"Geld overboeken",FROM:"Van",TO:"Aan",AMOUNT:"Bedrag",AMOUNT_HELP:"Bedrag",COMMENT:"Opmerking",COMMENT_HELP:"Opmerking (optioneel)",BTN_SEND:"Verzenden",BTN_ADD_COMMENT:"Opmerking toevoegen",WARN_COMMENT_IS_PUBLIC:"Houd er rekening mee dat <b>reacties openbaar zijn </b> (niet-versleuteld).",MODAL:{TITLE:"Overboeking"}},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_ACCENT:"Commas and accent characters not allowed",FIELD_NOT_NUMBER:"Value is not a number",FIELD_NOT_INT:"Value is not an integer",PASSWORD_NOT_CONFIRMED:"Must match previous password.",SALT_NOT_CONFIRMED:"Must match previous phrase.",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.",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.",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_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>).",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_HAS_NO_SELF:"Your identity must first have been published, and not expired.",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.",EXISTING_ACCOUNT:"Je gegevens komen overeen met een bestaande rekening, met de <a ng-click=\"showHelpModal('pubkey')\">publieke sleutel</a>:",EXISTING_ACCOUNT_REQUEST:"Gelieve je gegevens te wijzigen zodat ze met een niet gebruikte rekening overeenkomen."},INFO:{POPUP_TITLE:"Informatie",CERTIFICATION_DONE:"Identiteit succesvol getekend",NOT_ENOUGH_CREDIT:"Niet genoeg krediet",TRANSFER_SENT:"Verzoek tot overboeken succesvol verzonden",COPY_TO_CLIPBOARD_DONE:"Kopie geslaagd",MEMBERSHIP_OUT_SENT:"Opzegging lidmaatschap succesvol verzonden",NOT_NEED_MEMBERSHIP:"Je bent al lid.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Deze identiteit heeft binnenkort onvoldoende certificaties (ten minste {{willNeedCertificationCount}} nodig).",REVOCATION_SENT:"Intrekking succesvol verzonden",REVOCATION_SENT_WAITING_PROCESS:"Intrekking <b>is succesvol verzonden</b>. Het wacht op verwerking.",FEATURE_NOT_AVAILABLE_ON_DEMO:"Functionaliteit niet beschikbaar op deze demonstratiesite.<br/>Om <b>veiligheidsredenen</b> raden we u aan uw kopie van de software te <b>installeren</b>.<br/>Bezoek de website <a href='https://cesium.app'>www.cesium.app</a> voor hulp.",EMPTY_TX_HISTORY:"Aucune operatie à exporteur"},CONFIRM:{POPUP_TITLE:"<b>Bevestiging</b>",POPUP_WARNING_TITLE:"<b>Waarschuwing</b>",CERTIFY_RULES_TITLE_UID:"Certificeer {{uid}}",CERTIFY_RULES:'<b>Beveiligingswaarschuwing:</b><br/><br/><b class="assertive">Certificeer een rekening niet</b> als je gelooft dat: <ul><li>1.) de aanvrager niet echt is.<li>2.) de aanvrager al een andere gecertificeerde rekening heeft.<li>3.) de aanvrager opzettelijk of door onzorgvuldigheid regel 1 of 2 overtreedt bij het verzenden van certificaten.</ul></small><br/>Weet je zeker dat je deze identieit wilt certificeren?',TRANSFER:"<b>Samenvatting van de overboeking:</b><br/><br/><ul><li> - Van: <b>{{from}}</b></li><li> - Aan: <b>{{to}}</b></li><li> - Bedrag: <b>{{amount}} {{unit}}</b></li><li> - Opmerking: <i>{{comment}}</i></li></ul><br/><b>Weet je zeker dat je deze overboeking wil doen?</b>",MEMBERSHIP_OUT:"<b>Waarschuwing</b>:<br/>Je staat op het punt je lidmaatschap te beëindigen. Dit kan <b>niet ongedaan</b> worden gemaakt.<br/></br/><b>Weet je zeker dat je door wil gaan?</b>",LOGIN_UNUSED_WALLET_TITLE:"Typefout?",LOGIN_UNUSED_WALLET:"Je bent ingelogged op een rekening die <b>inactief</b> lijkt te zijn.<br/><br/>Als deze rekening niet met de jouwe overeenkomt, komt dat waarschijnlijk door een <b>typefout</b> bij het inloggen.<br/><br/><b>Wilt u toch doorgaan met deze rekening?</b>",FIX_IDENTITY:"De pseudoniem <b>{{uid}}</b> zal opnieuw gepubliceerd worden, waarmee de oude verlopen publicatie wordt vervangen.<br/></br/><bWeet je zeker</b> dat je door wil gaan?",FIX_MEMBERSHIP:"Je verzoek to lidmaatschap zal verstuurd worden.<br/></br/><b>Weet je het zeker?</b>",RENEW_MEMBERSHIP:"Je lidmaatschap zal verlengd worden.<br/></br/><b>Weet je het zeker?</b>",REVOKE_IDENTITY:"<b>Beveiligingswaarschuwing:</b><br/>You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated nickname <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to continue?",REVOKE_IDENTITY_2:"Deze handeling is <b>niet terug te draaien</b>!<br/><br/><b>Weet je zeker</b> dat je door wil gaan?",NOT_NEED_RENEW_MEMBERSHIP:"Je lidmaatschap hoeft niet verlengd te worden (het zal pas verlopen na {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Weet je zeker</b> dat je een verlengingsaanvraag wil versturen?",SAVE_BEFORE_LEAVE:"Wil je <b>je wijzigingen opslaan</b> voor je de pagina verlaat?",SAVE_BEFORE_LEAVE_TITLE:"Wijzigingen niet opgeslagen",LICENCE:"Ik heb gelezen en geaccepteerd de voorwaarden van de vergunning G1"},DOWNLOAD:{POPUP_TITLE:"<b>Intrekkingsdocument</b>",POPUP_REVOKE_MESSAGE:"Om je rekening te beveiligen, download het <b>rekening intrekkingsdocument</b>. Dit heb je nodig om je rekening op te heffen (in het geval van diefstal, een verandering van ID, een ten onrechte gemaakte rekening, etc.).<br/><br/><b>Bewaar deze op een veilige plaats.</b>"},HELP:{TITLE:"Online help",JOIN:{SECTION:"Join",SALT:'The protection phrase 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. <b>Please remeber this phrase well</b>, because there is no way to recover it when lost. What\'s more, it cannot be changed without having to create a new account.<br/><br/>A good protection phrase must be sufficiently long (8 characters at the very least) and as original as possible.',PASSWORD:"The password is very important. Together with the protection phrase, it is use to calculate your account number (public key) and the private key to access it. <b>Please remember it well</b>, because there is no way to recover it when lost. What's more, 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>). It is published on the network so that other users may identify it, certify or send money to the account. A pseudonym must be unique among all members (current and past).'},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"Een publieke sleutel identificeert altijd een portemonnee. Het kan een lid identificeren. In Cesium wordt berekend met de geheime ID en wachtwoord.",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:"This button 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:"This button 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>.",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> 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 and open source). <a 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_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_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_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."}}})}]),angular.module("cesium.plugins",["cesium.plugins.translations","cesium.plugins.templates","cesium.graph.plugin","cesium.es.plugin","cesium.map.plugin"]),angular.module("cesium.plugins.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{CATEGORY:"Category",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",SUBMIT_BY:"Submitted by",BTN_LIKE:"I like",BTN_LIKE_REMOVE:"I don't like anymore",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked 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",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:'You can <a ui-sref="app.edit_profile">fill your Cesium+ profile</a> (optional) to provide better visibility of your account. This profile will be stored in <b>a directory independent</b> of the currency, but decentralized.'},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:"Accounts",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Are you sure you want <b>to send these certification suggestions</b>?",ASK_CERTIFICATION:"Are you sure you want to <b>send a certification request</b>?",ASK_CERTIFICATIONS:"Are you sure you want to <b>send a certification request</b> to these people?"}},INVITATION:{TITLE:"Invitations",NO_RESULT:"No invitation received",BTN_DELETE_ALL:"Delete all invitations",BTN_DELETE:"Delete invitation",BTN_NEW_INVITATION:"New invitation",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> asks for your certification',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> is suggested for certification',SUGGESTED_BY:'Suggestion sent by <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitations"},LIST:{TITLE:"Invitations"},NEW:{TITLE:"New invitation",RECIPIENTS:"A",RECIPIENTS_HELP:"Recipients of the invitation",RECIPIENTS_MODAL_TITLE:"Recipients",RECIPIENTS_MODAL_HELP:"Please choose recipients:",SUGGESTION_IDENTITIES:"Suggestions for certification",SUGGESTION_IDENTITIES_HELP:"Certifications to suggest",SUGGESTION_IDENTITIES_MODAL_TITLE:"Suggestions",SUGGESTION_IDENTITIES_MODAL_HELP:"Please choose your suggestions:"},CONFIRM:{DELETE_ALL_CONFIRMATION:"Removing invitations is <b>an irreversible operation</b>.<br/><br/><b>Are you sure</b> you want to continue",SEND_INVITATIONS_TO_CERTIFY:"<b>Are you sure</b> you want <b>to sent this invitation to certify</b> ?"},INFO:{INVITATION_SENT:"Invitation sent"},ERROR:{LOAD_INVITATIONS_FAILED:"Error while loading invitations",REMOVE_INVITATION_FAILED:"Error while deleting the invitation",REMOVE_ALL_INVITATIONS_FAILED:"Error while deleting invitations",SEND_INVITATION_FAILED:"Error while sending invitation",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitation unreadable (format unknown)</span> - sent by <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},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."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Block number, hash...",POPOVER_FILTER_TITLE:"Filter",HEADER_MEDIAN_TIME:"Date / Time",HEADER_BLOCK:"Block #",HEADER_ISSUER:"Peer owner",BTN_LAST:"Last blocks",DISPLAY_QUERY:"View query",HIDE_QUERY:"Hide query",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Members input/output',EXISTING_TRANSACTION:'<b class="ion-card"></b> Having transactions',PERIOD:'<b class="ion-clock"></b> Between <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) and <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Computed by {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transactions concerning <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Error while searching blocks."}},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:{PAGE_DIVIDER:"Pages",PAGE_DIVIDER_HELP:'Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref="app.es_network">the Cesium+ network</a>.'},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:"Cesium+ profile",PROFILE_DIVIDER_HELP:'These are ancillary data, stored outside the currency network, in <a ui-sref="app.es_network">the Cesium+ network</a>.',NO_PROFILE_DEFINED:"No Cesium+ 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",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>:",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>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"Appear on {{'COMMON.APP_NAME'|translate}} maps?",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",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_CREATE_OR_UPDATE_PROFILE:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."}},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_REMOTE_STORAGE:"Enable remote storage for settings?",ENABLE_REMOTE_STORAGE_HELP:"Enables (encrypted) storage of your settings on Cesium + nodes",ENABLE_MESSAGE_TOGGLE:"Enable private messages?",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>?",ENABLE_HTML5_NOTIFICATION:"Warn with each new notification?",ENABLE_HTML5_NOTIFICATION_HELP:"Opens a small popup window with each new notification."},CONFIRM:{ASK_ENABLE_TITLE:"Optional features",ASK_ENABLE:'Cesium+ extension is <b>disabled</b> in your settings, making some features inactive: <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/><br/><b>Do you want to enable</b> the extension?'}},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 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> was executed.",TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:"You received a payment from <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:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:"Your <b>certification</b> to <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> was executed.",CERT_RECEIVED:"You have <b>received a certification</b> from <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 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> like your profile",FOLLOW_RECEIVED:"<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> follows your activity",STAR_RECEIVED:"<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> rated you ({{params[3]}} <i class=\"ion-star\">)",MODERATION_RECEIVED:'<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> 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 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> 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 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> has requested moderation on your profile"},PAGE:{NEW_COMMENT:"<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> has commented on your referencing: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<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> has modified his comment on your referencing: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<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> has replied to your comment on the referencing: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<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> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>",FOLLOW_NEW_COMMENT:"<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> has commented on the page: <b>{{params[2]}}</b>",FOLLOW_UPDATE_COMMENT:"<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> has modified his comment on the page: <b>{{params[2]}}</b>",FOLLOW_NEW:"<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> added a page: <b>{{params[2]}}</b>",FOLLOW_UPDATE:"<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> updated the page: <b>{{params[2]}}</b>",MODERATION_RECEIVED:'<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> 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 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> 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 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> has requested moderation on your page: <b>{{params[2]}}</b>"}},LIKE:{ERROR:{FAILED_TOGGLE_LIKE:"Unable to execute this action."}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the data node <b>{{new}}</b>?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Cesium will continue to work, <b>without the Cesium+</b> extension (user profiles, private messages, maps and graphics).<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">extension 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",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",SUBMIT_BY:"Submitted by",BTN_LIKE:"I like",BTN_LIKE_REMOVE:"I don't like anymore",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked 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",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:'You can <a ui-sref="app.edit_profile">fill your Cesium+ profile</a> (optional) to provide better visibility of your account. This profile will be stored in <b>a directory independent</b> of the currency, but decentralized.'},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:"Accounts",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Are you sure you want <b>to send these certification suggestions</b>?",ASK_CERTIFICATION:"Are you sure you want to <b>send a certification request</b>?",ASK_CERTIFICATIONS:"Are you sure you want to <b>send a certification request</b> to these people?"}},INVITATION:{TITLE:"Invitations",NO_RESULT:"No invitation received",BTN_DELETE_ALL:"Delete all invitations",BTN_DELETE:"Delete invitation",BTN_NEW_INVITATION:"New invitation",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> asks for your certification',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> is suggested for certification',SUGGESTED_BY:'Suggestion sent by <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitations"},LIST:{TITLE:"Invitations"},NEW:{TITLE:"New invitation",RECIPIENTS:"A",RECIPIENTS_HELP:"Recipients of the invitation",RECIPIENTS_MODAL_TITLE:"Recipients",RECIPIENTS_MODAL_HELP:"Please choose recipients:",SUGGESTION_IDENTITIES:"Suggestions for certification",SUGGESTION_IDENTITIES_HELP:"Certifications to suggest",SUGGESTION_IDENTITIES_MODAL_TITLE:"Suggestions",SUGGESTION_IDENTITIES_MODAL_HELP:"Please choose your suggestions:"},CONFIRM:{DELETE_ALL_CONFIRMATION:"Removing invitations is <b>an irreversible operation</b>.<br/><br/><b>Are you sure</b> you want to continue",SEND_INVITATIONS_TO_CERTIFY:"<b>Are you sure</b> you want <b>to sent this invitation to certify</b> ?"},INFO:{INVITATION_SENT:"Invitation sent"},ERROR:{LOAD_INVITATIONS_FAILED:"Error while loading invitations",REMOVE_INVITATION_FAILED:"Error while deleting the invitation",REMOVE_ALL_INVITATIONS_FAILED:"Error while deleting invitations",SEND_INVITATION_FAILED:"Error while sending invitation",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitation unreadable (format unknown)</span> - sent by <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},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."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Block number, hash...",POPOVER_FILTER_TITLE:"Filter",HEADER_MEDIAN_TIME:"Date / Time",HEADER_BLOCK:"Block #",HEADER_ISSUER:"Peer owner",BTN_LAST:"Last blocks",DISPLAY_QUERY:"View query",HIDE_QUERY:"Hide query",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Members input/output',EXISTING_TRANSACTION:'<b class="ion-card"></b> Having transactions',PERIOD:'<b class="ion-clock"></b> Between <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) and <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Computed by {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transactions concerning <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Error while searching blocks."}},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:{PAGE_DIVIDER:"Pages",PAGE_DIVIDER_HELP:'Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref="app.es_network">the Cesium+ network</a>.'},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:"Cesium+ profile",PROFILE_DIVIDER_HELP:'These are ancillary data, stored outside the currency network, in <a ui-sref="app.es_network">the Cesium+ network</a>.',NO_PROFILE_DEFINED:"No Cesium+ 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",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>:",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>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"Appear on {{'COMMON.APP_NAME'|translate}} maps?",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",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_CREATE_OR_UPDATE_PROFILE:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."}},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_REMOTE_STORAGE:"Enable remote storage for settings?",ENABLE_REMOTE_STORAGE_HELP:"Enables (encrypted) storage of your settings on Cesium + nodes",ENABLE_MESSAGE_TOGGLE:"Enable private messages?",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>?",ENABLE_HTML5_NOTIFICATION:"Warn with each new notification?",ENABLE_HTML5_NOTIFICATION_HELP:"Opens a small popup window with each new notification."},CONFIRM:{ASK_ENABLE_TITLE:"Optional features",ASK_ENABLE:'Cesium+ extension is <b>disabled</b> in your settings, making some features inactive: <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/><br/><b>Do you want to enable</b> the extension?'}},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 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> was executed.",TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:"You received a payment from <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:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:"Your <b>certification</b> to <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> was executed.",CERT_RECEIVED:"You have <b>received a certification</b> from <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 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> like your profile",FOLLOW_RECEIVED:"<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> follows your activity",STAR_RECEIVED:"<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> rated you ({{params[3]}} <i class=\"ion-star\">)",MODERATION_RECEIVED:'<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> 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 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> 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 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> has requested moderation on your profile"},PAGE:{NEW_COMMENT:"<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> has commented on your referencing: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<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> has modified his comment on your referencing: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<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> has replied to your comment on the referencing: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<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> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>",FOLLOW_NEW_COMMENT:"<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> has commented on the page: <b>{{params[2]}}</b>",FOLLOW_UPDATE_COMMENT:"<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> has modified his comment on the page: <b>{{params[2]}}</b>",FOLLOW_NEW:"<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> added a page: <b>{{params[2]}}</b>",FOLLOW_UPDATE:"<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> updated the page: <b>{{params[2]}}</b>",MODERATION_RECEIVED:'<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> 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 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> 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 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> has requested moderation on your page: <b>{{params[2]}}</b>"}},LIKE:{ERROR:{FAILED_TOGGLE_LIKE:"Unable to execute this action."}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the data node <b>{{new}}</b>?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Cesium will continue to work, <b>without the Cesium+</b> extension (user profiles, private messages, maps and graphics).<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">extension 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",CATEGORIES:"Kategorioj",CATEGORY_SEARCH_HELP:"Serĉado",COMMENT_HELP:"Komento",LAST_MODIFICATION_DATE:"Ĝisdatigita la",SUBMIT_BY:"Submetita de",BTN_LIKE:"Mi ŝatas",LIKES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} ŝatis 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",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:"Cesium 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:"Elekti viajn sugestojn"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Peti atestaĵojn",HELP:"Elekti la ricevontojn"},SEARCH:{DIVIDER_PROFILE:"Kontoj",DIVIDER_PAGE:"Paĝoj",DIVIDER_GROUP:"Grupoj"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Ĉu vi certas, ke vi volas <b>sendi tiujn sugestojn por atestado</b>?",ASK_CERTIFICATION:"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b>?",ASK_CERTIFICATIONS:"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b> al tiuj personoj?"}},INVITATION:{TITLE:"Invitoj",NO_RESULT:"Neniu invito atendanta",BTN_DELETE_ALL:"Forigi ĉiujn invitojn",BTN_DELETE:"Forigi la inviton",BTN_NEW_INVITATION:"Nova invito",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> petas vian atestadon',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> estas sugestita al vi por atestado',SUGGESTED_BY:'Sugesto sendita de <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitoj"},LIST:{TITLE:"Invitoj"},NEW:{TITLE:"Nova invito",RECIPIENTS:"Al",RECIPIENTS_HELP:"Ricevontoj de la invito",RECIPIENTS_MODAL_TITLE:"Ricevontoj",RECIPIENTS_MODAL_HELP:"Bonvolu elekti la ricevontojn:",SUGGESTION_IDENTITIES:"Sugestoj por atestado",SUGGESTION_IDENTITIES_HELP:"Atestadoj sugestotaj",SUGGESTION_IDENTITIES_MODAL_TITLE:"Sugestoj",SUGGESTION_IDENTITIES_MODAL_HELP:"Bonvolu elekti viajn sugestojn:"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La forigo de la invitoj estas <b>neinversigebla ago</b>.<br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?",SEND_INVITATIONS_TO_CERTIFY:"Ĉu vi certas, ke vi volas <b>sendi tiun inviton atestotan</b>?"},INFO:{INVITATION_SENT:"Invito sendita"},ERROR:{LOAD_INVITATIONS_FAILED:"Malsukceso por ŝarĝi la invitojn",REMOVE_INVITATION_FAILED:"Eraro dum la forigo de la invito",REMOVE_ALL_INVITATIONS_FAILED:"Eraro dum la forigo de la invitoj",SEND_INVITATION_FAILED:"Eraro dum la sendo de la invito",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invito nelegebla (strukturo nekonata)</span> - sendita de <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},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."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Numero de bloko, haketo, publika ŝlosilo, ktp.",POPOVER_FILTER_TITLE:"Filtriloj",HEADER_MEDIAN_TIME:"Dato / Horo",HEADER_BLOCK:"Bloko #",HEADER_ISSUER:"Nodo elsendinta",BTN_LAST:"Lastaj blokoj",DISPLAY_QUERY:"Afiŝi la informpeton",HIDE_QUERY:"Kaŝi la informpeton",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Eniroj/eliroj de membroj',EXISTING_TRANSACTION:'<b class="ion-card"></b> Kun spezoj',PERIOD:'<b class="ion-clock"></b> Inter <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) kaj <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Kalkulita de <b class="ion-key"></b> {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Spezoj koncernantaj <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Eraro dum la serĉado de la blokoj."}},GROUP:{GENERAL_DIVIDER:"Ĝeneralaj informoj",LOCATION_DIVIDER:"Adreso",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj kaj retejo",TECHNICAL_DIVIDER:"Teknikaj informoj",CREATED_TIME:"Kreita {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Invitoj"},LOOKUP:{TITLE:"Grupoj",SEARCH_HELP:"Nomo de grupo, vortoj, loko, ktp.",LAST_RESULTS_LIST:"Novaj grupoj:",OPEN_RESULTS_LIST:"Malfermitaj grupoj:",MANAGED_RESULTS_LIST:"Fermitaj grupoj:",BTN_LAST:"Novaj grupoj",BTN_NEW:"Mi aldonas grupon"},TYPE:{TITLE:"Nova grupo",SELECT_TYPE:"Tipo de grupo:",OPEN_GROUP:"Malfermita grupo",OPEN_GROUP_HELP:"Malfermita grupo estas alirebla de iu ajn membro de la mono.",MANAGED_GROUP:"Administrita grupo",MANAGED_GROUP_HELP:"Administrita grupo estas mastrumata de administrantoj kaj moderigantoj, kiuj povas akcepti, rifuzi aŭ eksigi membron.",ENUM:{OPEN:"Malfermita grupo",MANAGED:"Administrita grupo"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Kromaĵoj",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi grupon?<br/><br/>Tiu ago estas neinversigebla."},EDIT:{TITLE:"Grupo",TITLE_NEW:"Nova grupo",RECORD_TITLE:"Titolo",RECORD_TITLE_HELP:"Titolo",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo"},ERROR:{SEARCH_GROUPS_FAILED:"Malsukceso por traserĉi grupojn",REMOVE_RECORD_FAILED:"Malsukceso por forigi la grupon"},INFO:{RECORD_REMOVED:"Grupo forigita"}},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:{PAGE_DIVIDER:"Paĝoj",PAGE_DIVIDER_HELP:"La paĝoj listigas agadojn, kiuj akceptas la liberan monon aŭ helpas ĝin: komercoj, entreprenoj, asocioj, institucioj."},ERROR:{LOAD_CATEGORY_FAILED:"Malsukceso por ŝarĝi la liston de la agadoj",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝado de la paĝo",LOOKUP_RECORDS_FAILED:"Eraro dum la serĉado",REMOVE_RECORD_FAILED:"Malsukceso por forigi la paĝon",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 Cesium+",PROFILE_DIVIDER_HELP:"Temas pri kromaj datenoj, stokitaj ekster la mon-reto.",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",TECHNICAL_DIVIDER:"Teknikaj informoj",MODAL_AVATAR:{TITLE:"Profil-foto",SELECT_FILE_HELP:"Bonvolu <b>elekti bildo-dosieron</b>:",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 Cesium+ ?</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_DOTS:"Lastaj dokumentoj:",LAST_DOCUMENTS:"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",BTN_REMOVE:"Forigi tiun ĉi dokumenton",BTN_COMPACT:"Densigi",HAS_CREATE_OR_UPDATE_PROFILE:"kreis aŭ modifis sian profilon",POPOVER_ACTIONS:{TITLE:"Agoj",REMOVE_ALL:"Forigi tiujn ĉi dokumentojn..."}},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:"Cesium+",PLUGIN_NAME_HELP:"Profiloj, avizoj, privataj mesaĝoj",ENABLE_TOGGLE:"Aktivigi la krom-programon?",ENABLE_REMOTE_STORAGE:"Aktivigi la foran stokadon?",ENABLE_REMOTE_STORAGE_HELP:"Ebligas stoki (ĉifrite) viajn parametrojn ĉe la nodoj Cesium+",ENABLE_MESSAGE_TOGGLE:"Aktivigi la privatajn mesaĝojn?",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>?",ENABLE_HTML5_NOTIFICATION:"Anonci ĉiun novan avizon?",ENABLE_HTML5_NOTIFICATION_HELP:"Malfermas fenestreton por ĉiu nova avizo."},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 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> ŝatas vian profilon",FOLLOW_RECEIVED:"<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> sekvas viajn agojn",STAR_RECEIVED:"<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> notis vin ({{params[3]}} <b class=\"ion-star\">)",MODERATION_RECEIVED:'<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> 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 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> atentigis pri profilo foriginda: <b>{{params[2]}}</b>",ABUSE_RECEIVED:"<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> atentigis pri via profilo"},PAGE:{NEW_COMMENT:"<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> komentis vian anoncon: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<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> modifis sian komenton pri via anonco: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<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> respondis al via komento pri la anonco: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<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> modifis sian respondon al via komento pri la anonco: <b>{{params[2]}}</b>",FOLLOW_NEW_COMMENT:"<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> komentis la paĝon: <b>{{params[2]}}</b>",FOLLOW_UPDATE_COMMENT:"<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> modifis sian komenton ĉe la paĝo: <b>{{params[2]}}</b>",FOLLOW_NEW:"<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> aldonis la paĝon: <b>{{params[2]}}</b>",FOLLOW_UPDATE:"<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> modifis la paĝon: <b>{{params[2]}}</b>",MODERATION_RECEIVED:'<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> 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 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> 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 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> 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/>Cesium daŭrigos funkcii, <b>sen la krom-programo Cesium+</b> (uzanto-profiloj, privataj mesaĝoj, mapoj kaj grafikoj)<br/><br/>Kontrolu vian ret-konekton, aŭ ŝanĝu daten-nodon ĉe la <a class="positive" ng-click="doQuickFix(\'settings\')">parametroj de la krom-programo</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:{
ABUSES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème",BTN_LIKE:"Me gusta",BTN_LIKE_REMOVE:"Dejar de gustarme",BTN_REMOVE_REPORTED_ABUSE:"Cancelar mi reporte",BTN_REPORT_ABUSE_DOTS:"Reportar un problema o un abuso...",COMMENT_HELP:"Comentario",LIKES_TEXT:"A {{total}} persona{{total > 1 ? 's' : ''}} {{total > 1 ? 'les' : 'le'}} gusta esta página",NOTIFICATION:{HAS_UNREAD:"Tiene {{count}} notificaci{{count>0?'ones':'ón'}} no leída{{count>0?'s':''}}",TITLE:"Nueva notificación | {{'COMMON.APP_NAME'|translate}}"},REPORT_ABUSE:{ASK_DELETE:"¿ Solicitar la eliminación ?",CONFIRM:{SENT:"Reporte enviado. ¡ Gracias !"},REASON_HELP:"Yo explico el problema...",SUB_TITLE:"Por favor explique brevemente el problema :",TITLE:"Señalar un problema"},CATEGORY:"Categoría",CATEGORIES:"Categorías",CATEGORY_SEARCH_HELP:"Búsqueda",LAST_MODIFICATION_DATE:"Actualización el",SUBMIT_BY:"Enviado 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:"Notificaciones",MARK_ALL_AS_READ:"Marcar todo como leído",NO_RESULT:"Ningúna notificación",SHOW_ALL:"Ver todo",LOAD_NOTIFICATIONS_FAILED:"Fallo en la carga de las notificaciones"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{BTN_COMPACT:"Compactar",HAS_CREATE_OR_UPDATE_PROFILE:"ha creado o modificado su perfil",LAST_DOCUMENTS_DOTS:"Últimos documentos :",TITLE:"Búsqueda de documentos",BTN_ACTIONS:"Acciones",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS:"Últimos documentos",SHOW_QUERY:"Ver la búsqueda",HIDE_QUERY:"Esconder la búsqueda",HEADER_TIME:"Fecha/Hora",HEADER_ISSUER:"Emisor",HEADER_RECIPIENT:"Destinatario",READ:"Leído",BTN_REMOVE:"Sumprimer este documento",POPOVER_ACTIONS:{TITLE:"Acciones",REMOVE_ALL:"Suprimir estos documentos..."}},INFO:{REMOVED:"Documento suprimido"},CONFIRM:{REMOVE:"¿ Desea <b>suprimir este documento</b> ?",REMOVE_ALL:"¿ Desea <b>suprimer estos documentos</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error al buscar los documentos",REMOVE_FAILED:"Error al suprimir el documento",REMOVE_ALL_FAILED:"Error al suprimir los documentos"}},MENU:{REGISTRY:"Páginas",USER_PROFILE:"Mi perfil",MESSAGES:"Mensajes",NOTIFICATIONS:"Notificaciones",INVITATIONS:"Invitaciones"},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 certificaciones más rapidamente, complete <a ui-sref="app.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 notificaciones, 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 los ajustes de Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugerir identidades a certificar…",BTN_ASK_CERTIFICATIONS_DOTS:"Pedir a miembros que le certifiquen…",BTN_ASK_CERTIFICATION:"Pedir una certificación",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugerir certificaciones",HELP:"Selectionar sus sugerencias"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Solicitar certificaciones",HELP:"Selectionar los destinatarios"},SEARCH:{DIVIDER_PROFILE:"Cuentas",DIVIDER_PAGE:"Páginas",DIVIDER_GROUP:"Grupos"},CONFIRM:{SUGGEST_CERTIFICATIONS:"¿Desea <b>enviar estas sugerencias de certificatión</b> ?",ASK_CERTIFICATION:"¿Desea <b>enviar una solicitud de certificación</b> ?",ASK_CERTIFICATIONS:"¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?"}},INVITATION:{TITLE:"Invitaciones",NO_RESULT:"Ningúna invitación en espera",BTN_DELETE_ALL:"Suprimir todas las invitaciones",BTN_DELETE:"Suprimir la invitación",BTN_NEW_INVITATION:"Nueva invitación",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> solicita su certificación',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> ha sido sugerido/a para certificación',SUGGESTED_BY:'Sugerencia mandada por <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitaciones"},LIST:{TITLE:"Invitaciones"},NEW:{TITLE:"Nueva invitación",RECIPIENTS:"A",RECIPIENTS_HELP:"Destinatarios de la invitación",RECIPIENTS_MODAL_TITLE:"Destinatarios",RECIPIENTS_MODAL_HELP:"Por favor, elige los destinatarios :",SUGGESTION_IDENTITIES:"Sugerencia de certificación",SUGGESTION_IDENTITIES_HELP:"Certificaciones a sugerir",SUGGESTION_IDENTITIES_MODAL_TITLE:"Sugerencias",SUGGESTION_IDENTITIES_MODAL_HELP:"Por favor, elige sus sugerencias :"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?",SEND_INVITATIONS_TO_CERTIFY:"¿ Desea <b>mandar esta invitación a certificar</b> ?"},INFO:{INVITATION_SENT:"Invitación mandada"},ERROR:{LOAD_INVITATIONS_FAILED:"Fallo en la carga de las invitaciones",REMOVE_INVITATION_FAILED:"Fallo durante la supresión de la invitación",REMOVE_ALL_INVITATIONS_FAILED:"Fallo durante la supresión de las invitaciones",SEND_INVITATION_FAILED:"Fallo durante el envío de la invitación",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},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}}",MODIFIED_ON:"modificado el {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modificado entonces)",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:"Fallo durante el respaldo del comentario",FAILED_REMOVE_COMMENT:"Fallo 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 enviados",LAST_INBOX:"Nuevos mensajes",LAST_OUTBOX:"Mensajes enviados",BTN_LAST_MESSAGES:"Mensajes recientes",TITLE:"Mensajes",SEARCH_HELP:"Buscar en mensajes",POPOVER_ACTIONS:{TITLE:"Opciones",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:"Tenga en cuenta que este mensaje será cifrado antes del envío, con el fin de que solo el destinatario pueda leerlo, y que se tenga la seguridad de que la autoría es suya.",MESSAGE:"Mensaje",MESSAGE_HELP:"Contenido del mensaje",CONTENT_CONFIRMATION:"El contenido del mensaje está vacío.<br/><br/>¿ Sin embargo, quiere mandar el mensaje ?"},VIEW:{TITLE:"Mensaje",SENDER:"Enviado por",RECIPIENT:"Enviado a",NO_CONTENT:"Mensaje vacío",DELETE:"Eliminar el mensaje"},CONFIRM:{REMOVE:"¿ Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.",REMOVE_ALL:"¿ Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.",MARK_ALL_AS_READ:"¿ Desea <b>marcar todos los mensajes como leído</b> ?",USER_HAS_NO_PROFILE:"Esta identidad no tiene ningún perfil Cesium+. Puede que no tenga habilitada la extensión Cesium+, y <b>no podrá ver su mensaje</b>.<br/><br/>¿ Desea <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:"Fallo durante el envío del mensaje.",LOAD_MESSAGES_FAILED:"Fallo durante la recuperación de los mensajes.",LOAD_MESSAGE_FAILED:"Fallo durante la recuperación del mensaje.",MESSAGE_NOT_READABLE:"Lectura del mensaje imposible.",USER_NOT_RECIPIENT:"No está el destinatario de este mensaje : deciframiento imposible.",NOT_AUTHENTICATED_MESSAGE:"La autenticidad del mensaje es dudosa o su contenido está corrupto.",REMOVE_MESSAGE_FAILED:"Fallo 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:"Fallo durante la recuperación de las notificaciones de mensajes.",REMOVE_All_MESSAGES_FAILED:"Fallo durante la supresión de todos los mensajes.",MARK_ALL_AS_READ_FAILED:"Fallo durante el marcaje de los mensajes como leído.",RECIPIENT_IS_MANDATORY:"El destinatario es obligatorio."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Número de bloque, hash, llave pública, etc.",POPOVER_FILTER_TITLE:"Filtros",HEADER_MEDIAN_TIME:"Fecha / Hora",HEADER_BLOCK:"Bloque #",HEADER_ISSUER:"Nodo emisor",BTN_LAST:"Últimos bloques",DISPLAY_QUERY:"Mostrar la consulta",HIDE_QUERY:"Ocultar la consulta",TX_SEARCH_FILTER:{MEMBER_FLOWS:"Entradas/salidas de miembros",EXISTING_TRANSACTION:"Con transacciones",PERIOD:'<b class="ion-clock"></b> Entre el <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) y el <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Calculado por <b class="ion-key"></b> {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transacciones que implican <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Fallo en la búsqueda de los bloques."}},GROUP:{GENERAL_DIVIDER:"Informaciones generales",LOCATION_DIVIDER:"Dirección",SOCIAL_NETWORKS_DIVIDER:"Redes sociales y página web",TECHNICAL_DIVIDER:"Informaciones técnicas",CREATED_TIME:"Creada {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Invitaciones"},LOOKUP:{TITLE:"Grupos",SEARCH_HELP:"Nombre de grupo, palabras , lugar, etc.",LAST_RESULTS_LIST:"Nuevos grupos :",OPEN_RESULTS_LIST:"Grupos abiertos :",MANAGED_RESULTS_LIST:"Grupos cerrados :",BTN_LAST:"Nuevos grupos",BTN_NEW:"Añado un grupo"},TYPE:{TITLE:"Nuevo grupo",SELECT_TYPE:"Tipo de grupo :",OPEN_GROUP:"Grupo abierto",OPEN_GROUP_HELP:"Un grupo abierto es accesible por cualquier miembro de la moneda.",MANAGED_GROUP:"Grupo administrado",MANAGED_GROUP_HELP:"Un grupo administrado es gestionado por administradores y moderadores, que pueden aceptar, rechazar o excluir un miembro en su seno.",ENUM:{OPEN:"Grupo abierto",MANAGED:"Grupo administrado"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Opciones",REMOVE_CONFIRMATION:"¿Desea eliminar este grupo?<br/><br/>Esta operación es irreversible."},EDIT:{TITLE:"Grupo",TITLE_NEW:"Nuevo grupo",RECORD_TITLE:"Título",RECORD_TITLE_HELP:"Título",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción"},ERROR:{SEARCH_GROUPS_FAILED:"Fallo en la búsqueda de grupos",REMOVE_RECORD_FAILED:"Error al eliminar el grupo"},INFO:{RECORD_REMOVED:"Grupo eliminado"}},REGISTRY:{CATEGORY:"Actividad principal",GENERAL_DIVIDER:"Informaciones generales",LOCATION_DIVIDER:"Dirección",SOCIAL_NETWORKS_DIVIDER:"Redes sociales y sitio web",TECHNICAL_DIVIDER:"Informaciones 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:"Crear una página",MY_PAGES:"Mis páginas",NO_PAGE:"Sin páginas",SEARCH:{TITLE:"Páginas",SEARCH_HELP:"Qué, Quién, ej: peluquería, restaurante Sol.",BTN_ADD:"Nuevo",BTN_LAST_RECORDS:"Páginas recientes",BTN_ADVANCED_SEARCH:"búsqueda avanzada",BTN_OPTIONS:"Búsqueda avanzada",TYPE:"Tipo de página",LOCATION_HELP:"Ciudad",RESULTS:"Resultados",RESULT_COUNT_LOCATION:"{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}",RESULT_COUNT:"{{count}} resultado{{count>0?'s':''}}",LAST_RECORDS:"Páginas recientes",LAST_RECORD_COUNT_LOCATION:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}",LAST_RECORD_COUNT:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Opciones avanzadas"}},VIEW:{TITLE:"Anuario",CATEGORY:"Actividad principal :",LOCATION:"Dirección :",MENU_TITLE:"Opciones",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"¿ Desea 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:"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 para recibir pagos"},WALLET:{PAGE_DIVIDER:"Páginas",PAGE_DIVIDER_HELP:'Las páginas se refieren a colectivos que aceptan moneda o la promocionan: tiendas, empresas, negocios, asociaciones, instituciones. Se almacenan fuera de la red de la moneda, en <a ui-sref="app.es_network">la red Cesium+</a>.'},ERROR:{LOAD_CATEGORY_FAILED:"Fallo en la carga de la lista de actividades",LOAD_RECORD_FAILED:"Fallo durante la carga de la página",LOOKUP_RECORDS_FAILED:"Fallo durante la ejecución de la búsqueda.",REMOVE_RECORD_FAILED:"Fallo en la supresión de la página",SAVE_RECORD_FAILED:"Fallo 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 Cesium+",PROFILE_DIVIDER_HELP:"Estos son datos auxiliares, almacenados fuera de la red monetaria",NO_PROFILE_DEFINED:"Ningún perfil Cesium+",BTN_ADD:"Ingresar mi perfil",BTN_EDIT:"Editar mi perfil",BTN_DELETE:"Eliminar mi perfil",BTN_REORDER:"Reordenar",UID:"Seudónimo",TITLE:"Nombre, Apellidos",TITLE_HELP:"Nombre, Apellidos",DESCRIPTION:"Sobre mí",DESCRIPTION_HELP:"Sobre mí…",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informaciones generales",SOCIAL_NETWORKS_DIVIDER:"Redes sociales, sitios web",TECHNICAL_DIVIDER:"Informaciones técnicas",MODAL_AVATAR:{TITLE:"Foto de perfil",SELECT_FILE_HELP:"Por favor, <b>elija una imagen</b>:",BTN_SELECT_FILE:"Eligir una imagen",RESIZE_HELP:"<b>Encuadre la imagen</b>, si es necesario. Un clic presionado sobre la imagen permite desplazarla. Haga clic en la zona inferior izquierda para hacer zoom.",RESULT_HELP:"<b>Aquí está el resultado</b> tal como se verá sobre su perfil :"},CONFIRM:{DELETE:"¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible.",DELETE_BY_MODERATOR:"¿Desea <b>eliminar este perfil Cesium+?</b><br/><br/>Esta operación es irreversible."},ERROR:{DELETE_PROFILE_FAILED:"Error durante la eliminación del perfil",REMOVE_PROFILE_FAILED:"Error de eliminación del perfil",LOAD_PROFILE_FAILED:"Fallo en la carga del perfil usuario.",SAVE_PROFILE_FAILED:"Fallo durante el respaldo",INVALID_SOCIAL_NETWORK_FORMAT:"Formato inválido: por favor, indique 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 de correo (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Falló el redimensionado de la imagen"},INFO:{PROFILE_REMOVED:"Perfil eliminado",PROFILE_SAVED:"Perfil guardado"},HELP:{WARNING_PUBLIC_DATA:"La información de su perfil <b>es pública</b>: visible también por personas <b>sin cuenta</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LIKE:{ERROR:{FAILED_TOGGLE_LIKE:"Imposible ejecutar esta acción."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Actualizar desde la dirección",USE_GEO_POINT:"Aparecer en el mapa {{'COMMON.APP_NAME'|translate}}",LOADING_LOCATION:"Encontrar la dirección…",LOCATION_DIVIDER:"Dirección",ADDRESS:"Calle",ADDRESS_HELP:"Calle, número, etc…",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."}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Servicios en línea",SUBSCRIPTION_DIVIDER_HELP:"Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.",BTN_ADD:"Agregar un servicio",BTN_EDIT:"Administrar mis servicios",NO_SUBSCRIPTION:"Ningún servicio definido",SUBSCRIPTION_COUNT:"Servicios / Suscripción",EDIT:{TITLE:"Servicios en línea",HELP_TEXT:"Gestione sus suscripciones y otros servicios en línea aquí",PROVIDER:"Proveedor:"},TYPE:{ENUM:{EMAIL:"Recibir notificaciones por correo electrónico"}},CONFIRM:{DELETE_SUBSCRIPTION:"¿ Deseas <b>eliminar</b> esta suscripción ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error al cargar servicios en línea",ADD_SUBSCRIPTION_FAILED:"Error al agregar suscripción",UPDATE_SUBSCRIPTION_FAILED:"Error durante la actualización de la suscripción",DELETE_SUBSCRIPTION_FAILED:"Error al eliminar la suscripción"},MODAL_EMAIL:{TITLE:"Notificación por correo electrónico",HELP:"Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará y únicamente será visible para el proveedor de servicios.",EMAIL_LABEL:"Su correo electrónico :",EMAIL_HELP:"maria@dominio.com",FREQUENCY_LABEL:"Frecuencia de las notificaciones :",FREQUENCY_DAILY:"Diaria",FREQUENCY_WEEKLY:"Semanal",PROVIDER:"Proveedor de servicio :"}},ES_PEER:{DOCUMENT_COUNT:"Número de documentos",DOCUMENTS:"Documentos",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} suscrito/a{{emailSubscription ? 's' : ''}} a notificaciones por correo",NAME:"Nombre",SOFTWARE:"Software"},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Perfiles, notificaciones, mensajes privados",ENABLE_TOGGLE:"Activar la extensión",ENABLE_MESSAGE_TOGGLE:"Activar los mensajes privados",ENABLE_REMOTE_STORAGE:"Activar el almacenamiento remoto",ENABLE_REMOTE_STORAGE_HELP:"Permite almacenar (con cifrado) sus ajustes en los nodos Cesium+",PEER:"Dirección del nodo de datos",POPUP_PEER:{TITLE:"Nodo de datos",HELP:"Ingrese la dirección del nodo que quiere utilizar:",PEER_HELP:"servidor.dominio.com:puerto"},NOTIFICATIONS:{DIVIDER:"Notificaciones",HELP_TEXT:"Active los tipos de notificaciones que 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>certificaciones emitidas</b>",ENABLE_CERT_RECEIVED:"Notificar la validación de las <b>certificaciones recibidas</b>",ENABLE_HTML5_NOTIFICATION:"Avisar con cada nueva notificación",ENABLE_HTML5_NOTIFICATION_HELP:"Abre una pequeña ventana emergente con cada nueva notificación."},CONFIRM:{ASK_ENABLE_TITLE:"Otras funcionalidades",ASK_ENABLE:'La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Perfiles de usuario/a</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notificaciones</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?'}},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 es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !",MEMBER_LEAVE:"No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.",MEMBER_REVOKE:"Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.",TX_SENT:"Su <b>pago</b> a <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> 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 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:"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Su <b>certificación</b> a <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> fue efectuada.",CERT_RECEIVED:"Ha <b>recibido una certificación</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:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su perfil',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportado un perfil para suprimir : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sigue la actividad de su perfil',LIKE_RECEIVED:'A <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> le ha gustado su perfil</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre el perfil : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> os ha puntuado con ({{params[3]}} <b class="ion-star">)'},PAGE:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su página : <b>{{params[2]}}</b>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportado una página para suprimir : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha cerrado la página : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha añadido la página : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha comentado la página : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sigue su página : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado la página : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario en la página : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre la página : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',NEW_COMMENT:"<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> ha comentado su referencia : <b>{{params[2]}}</b>",UPDATE_COMMENT:"<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> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<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> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<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> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nodo de datos <b>{{old}}</b> inalcanzable o dirección 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> inalcanzable o dirección no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class="positive" ng-click="doQuickFix(\'settings\')"> los ajustes de la extensión </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",CATEGORIES:"Catégories",CATEGORY_SEARCH_HELP:"Recherche",COMMENT_HELP:"Commentaire",LAST_MODIFICATION_DATE:"Mise à jour le",SUBMIT_BY:"Soumis par",BTN_LIKE:"J'aime",BTN_LIKE_REMOVE:"Je n'aime plus",LIKES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} aimé 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",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:"Cesium ne peut pas recevoir les notifications, à cause d'une erreur technique (connexion au noeud de données Cesium+).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres Cesium+."}},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"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Êtes-vous sûr de vouloir <b>envoyer ces suggestions de certification</b> ?",ASK_CERTIFICATION:"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> ?",ASK_CERTIFICATIONS:"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> à ces personnes ?"}},INVITATION:{TITLE:"Invitations",NO_RESULT:"Aucune invitation en attente",BTN_DELETE_ALL:"Supprimer toutes les invitations",BTN_DELETE:"Supprimer l'invitation",BTN_NEW_INVITATION:"Nouvelle invitation",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> demande votre certification',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> vous est suggéré pour certification',SUGGESTED_BY:'Suggestion envoyée par <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitations"},LIST:{TITLE:"Invitations"},NEW:{TITLE:"Nouvelle invitation",RECIPIENTS:"A",RECIPIENTS_HELP:"Destinataires de l'invitation",RECIPIENTS_MODAL_TITLE:"Destinataires",RECIPIENTS_MODAL_HELP:"Veuillez choisir les destinataires :",SUGGESTION_IDENTITIES:"Suggestions de certification",SUGGESTION_IDENTITIES_HELP:"Certifications à suggérer",SUGGESTION_IDENTITIES_MODAL_TITLE:"Suggestions",SUGGESTION_IDENTITIES_MODAL_HELP:"Veuillez choisir vos suggestions :"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La suppression des invitations est une <b>opération irréversible</b>.<br/><br/><b>Êtes-vous sûr</b> de vouloir continuer ?",SEND_INVITATIONS_TO_CERTIFY:"Êtes-vous sûr de vouloir <b>envoyer cette invitation à certifier</b> ?"},INFO:{INVITATION_SENT:"Invitation envoyée"},ERROR:{LOAD_INVITATIONS_FAILED:"Échec du chargement des invitations",REMOVE_INVITATION_FAILED:"Erreur lors de la suppression de l'invitation",REMOVE_ALL_INVITATIONS_FAILED:"Erreur lors de la suppression des invitations",SEND_INVITATION_FAILED:"Erreur lors de l'envoi de l'invitation",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitation illisible (format inconnu)</span> - envoyée par <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},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 lus</b> ?",USER_HAS_NO_PROFILE:"Cette identité n'a aucun profil Cesium+. Il se peut qu'elle n'utilise pas l'extension Cesium+, 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 lus.",RECIPIENT_IS_MANDATORY:"Le destinataire est obligatoire."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Numéro de bloc, hash, clé publique, etc.",POPOVER_FILTER_TITLE:"Filtres",HEADER_MEDIAN_TIME:"Date / Heure",HEADER_BLOCK:"Bloc #",HEADER_ISSUER:"Noeud émetteur",BTN_LAST:"Derniers blocs",DISPLAY_QUERY:"Afficher la requête",HIDE_QUERY:"Masquer la requête",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Entrées/sorties de membres',EXISTING_TRANSACTION:'<b class="ion-card"></b> Avec transactions',PERIOD:'<b class="ion-clock"></b> Entre <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) et <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Calculé par <b class="ion-key"></b> {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transactions concernant <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Erreur de la recherche des blocs."}},GROUP:{GENERAL_DIVIDER:"Informations générales",LOCATION_DIVIDER:"Adresse",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux et site web",TECHNICAL_DIVIDER:"Informations techniques",CREATED_TIME:"Créé {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Invitations"},LOOKUP:{TITLE:"Groupes",SEARCH_HELP:"Nom de groupe, mots, lieu, etc.",LAST_RESULTS_LIST:"Nouveaux groupes :",OPEN_RESULTS_LIST:"Groupes ouverts :",MANAGED_RESULTS_LIST:"Groupes fermés :",BTN_LAST:"Nouveaux groupes",BTN_NEW:"J'ajoute un groupe"},TYPE:{TITLE:"Nouveau groupe",SELECT_TYPE:"Type de groupe :",OPEN_GROUP:"Groupe ouvert",OPEN_GROUP_HELP:"Un groupe ouvert est accessible par n'importe quel membre de la monnaie.",MANAGED_GROUP:"Groupe administré",MANAGED_GROUP_HELP:"un groupe administré est géré par des administrateurs et des modérateurs, qui peuvent accepter, refuser ou exclure un membre en son sein.",ENUM:{OPEN:"Groupe ouvert",MANAGED:"Groupe administré"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Options",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer ce groupe ?<br/><br/>Cette opération est irréversible."},EDIT:{TITLE:"Groupe",TITLE_NEW:"Nouveau groupe",RECORD_TITLE:"Titre",RECORD_TITLE_HELP:"Titre",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description"},ERROR:{SEARCH_GROUPS_FAILED:"Échec de la recherche de groupes",REMOVE_RECORD_FAILED:"Erreur de la suppression du groupe"},INFO:{RECORD_REMOVED:"Groupe supprimé"}},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:{PAGE_DIVIDER:"Pages",PAGE_DIVIDER_HELP:'Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref="app.es_network">le réseau des nœuds Cesium+</a>.'},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 Cesium+",PROFILE_DIVIDER_HELP:'Il s\'agit de données annexes, optionnelles. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref="app.es_network">le réseau Cesium+</a>.',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",TECHNICAL_DIVIDER:"Informations techniques",MODAL_AVATAR:{TITLE:"Photo de profil",SELECT_FILE_HELP:"Veuillez <b>choisir le fichier image</b> :",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 Cesium+ ?</b><br/><br/>Cette opération est irréversible.",DELETE_BY_MODERATOR:"Êtes-vous sûr de vouloir <b>supprimer ce profil Cesium+ ?</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",SAVE_PROFILE_FAILED:"Erreur lors de la sauvegarde",DELETE_PROFILE_FAILED:"Erreur lors de la suppression du profil",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>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trouver mon adresse sur la carte",USE_GEO_POINT:"Apparaître sur les cartes {{'COMMON.APP_NAME'|translate}} ?",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 et optionnels, délégués à un perstataire de votre choix. Par exemple, pour recevoir les notifications de paiement par email.",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",BTN_REMOVE:"Supprimer ce document",BTN_COMPACT:"Compacter",HAS_CREATE_OR_UPDATE_PROFILE:"a créé ou modifié son profil",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Supprimer ces documents..."}},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:"Cesium+",PLUGIN_NAME_HELP:"Profils, notifications, messages privés",ENABLE_TOGGLE:"Activer l'extension ?",ENABLE_REMOTE_STORAGE:"Activer le stockage distant ?",ENABLE_REMOTE_STORAGE_HELP:"Permet de stockage (chiffré) de vos paramètres sur les noeuds Cesium+",ENABLE_MESSAGE_TOGGLE:"Activer les messages privés ?",PEER:"Nœud de données Cesium+",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> ?",ENABLE_HTML5_NOTIFICATION:"Avertir à chaque nouvelle notification ?",ENABLE_HTML5_NOTIFICATION_HELP:"Ouvre une petite fenêtre à chaque nouvelle notification."},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é{{emailSubscription ? '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 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> 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 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:"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Votre <b>certification</b> à <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> a été effectuée.",CERT_RECEIVED:"Vous avez <b>reçu une certification</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> 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> demande la suppression d\'un profil : <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 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> a commenté votre page : <b>{{params[2]}}</b>",UPDATE_COMMENT:"<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> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<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> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<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> 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>'}},LIKE:{ERROR:{FAILED_TOGGLE_LIKE:"Impossible d'exécuter cette action."}},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/>Cesium va continuer à fonctionner, <b>sans l'extension Cesium+</b> (profils utilisateur, messages privés, cartes et graphiques)<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud de données dans les <a class=\"positive\" ng-click=\"doQuickFix('settings')\">paramètres de l'extension</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("it-IT",{COMMON:{CATEGORY:"Categoria",CATEGORIES:"Categorie",CATEGORY_SEARCH_HELP:"Ricerca",LAST_MODIFICATION_DATE:"Aggiornato il ",SUBMIT_BY:"Inviato da",BTN_PUBLISH:"Pubblicare",BTN_PICTURE_DELETE:"Eliminare",BTN_PICTURE_FAVORISE:"Predefinito",BTN_PICTURE_ROTATE:"Girare",BTN_ADD_PICTURE:"Aggiungere foto",NOTIFICATIONS:{TITLE:"Notifiche",MARK_ALL_AS_READ:"Segna tutte come lette",NO_RESULT:"Nessuna notifica",SHOW_ALL:"Mostrare tutte",LOAD_NOTIFICATIONS_FAILED:"Impossibile caricare le notifiche"}},MENU:{REGISTRY:"Pagine",USER_PROFILE:"Mio profilo",MESSAGES:"Messaggi",NOTIFICATIONS:"Notifiche",INVITATIONS:"Inviti"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Conto per enti",ORGANIZATION_ACCOUNT_HELP:"Se rappresenta un'azienda, un'associazione, etc.<br/>Questo conto non potrà creare il Dividendo Universale."},EVENT:{MEMBER_WITHOUT_PROFILE:'Per ottenere sue certificazioni più velocemente, riempire le informazioni<a ui-sref="app.edit_profile">del suo profilo</a>. I membri della rete si fidano più volontieri di profili verificabili.'},ERROR:{WS_CONNECTION_FAILED:"Cesium non può ricevere notifiche a causa di un problema tecnico (di conessione al data node Cesium+).<br/><br/>Se il problema persiste, le chiediamo di <b>scegliere un'altro data node</b> nelle impostazioni di Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggerire delle identità da certificare..",BTN_ASK_CERTIFICATIONS_DOTS:"Chiedere una certificazione ai membri...",BTN_ASK_CERTIFICATION:"Chiedere una certificazione",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggerire delle certificazioni",HELP:"Scegliere i suoi suggerimenti, aiuti"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Chiedere delle certificazioni",HELP:"Selezionare un ricevente"},SEARCH:{DIVIDER_PROFILE:"Conti",DIVIDER_PAGE:"Pagine",DIVIDER_GROUP:"Gruppi"},CONFIRM:{SUGGEST_CERTIFICATIONS:"E sicuro(a) di voler <b>suggerire queste certificazioni</b> ?",ASK_CERTIFICATION:" E sicuro(a) di voler <b>chiedere una certificazione</b> ?",ASK_CERTIFICATIONS:" E sicuro(a) di voler <b>chiedere una certificazione</b> a questi membri ?"}},INVITATION:{TITLE:"Invitazioni",NO_RESULT:"Nessun invito ricevuto",BTN_DELETE_ALL:"Cancellare tutti gli inviti",BTN_DELETE:"Cancellare l'invito",BTN_NEW_INVITATION:"Nuovo invito",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> ti ha chiesto una certificazione',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> è proposto per ricevere una certificazione',SUGGESTED_BY:'Suggerimento inviato da by <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Inviti"},LIST:{TITLE:"Inviti"},NEW:{TITLE:"Nuovo invito",RECIPIENTS:"A",RECIPIENTS_HELP:"Riceventi dell'invito",RECIPIENTS_MODAL_TITLE:"Riceventi",RECIPIENTS_MODAL_HELP:"Scegliere riceventi:",SUGGESTION_IDENTITIES:"Suggerimenti di identità da certificare",SUGGESTION_IDENTITIES_HELP:"Suggerimenti di certificazioni",SUGGESTION_IDENTITIES_MODAL_TITLE:"Suggerimenti",SUGGESTION_IDENTITIES_MODAL_HELP:"Scegli tuoi sugerimenti:"},CONFIRM:{DELETE_ALL_CONFIRMATION:"Cancellare degli inviti è <b>una operazione irreversibile</b>.<br/><br/><b>Sei sicuro/a</b> di voler proseguire",SEND_INVITATIONS_TO_CERTIFY:"<b>Sei sicuro/a</b> di voler <b>inviare questo suggerimento di certificazione</b> ?"},INFO:{INVITATION_SENT:"Invito inviato"},ERROR:{LOAD_INVITATIONS_FAILED:"Errore nel caricare gli inviti",REMOVE_INVITATION_FAILED:"Errore nel cancellare gli inviti",REMOVE_ALL_INVITATIONS_FAILED:"Errore nel cancellare inviti",SEND_INVITATION_FAILED:"Errore nel invio degli inviti",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invito illegibile (formatto sconosciuto)</span> - inviato da <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},COMMENTS:{DIVIDER:"Commenti",SHOW_MORE_COMMENTS:"Mostrare commenti precedenti",COMMENT_HELP:"Suo commento o domanda...",COMMENT_HELP_REPLY_TO:"Sua risposta...",BTN_SEND:"Inviare",POPOVER_SHARE_TITLE:"Messaggio #{{number}}",REPLY:"Rispondere",REPLY_TO:"Rispondere a:",REPLY_TO_LINK:"In risposta a",REPLY_TO_DELETED_COMMENT:"In risposta ad un commento cancellato",REPLY_COUNT:"{{replyCount}} risposte",DELETED_COMMENT:"Commento cancellato",ERROR:{FAILED_SAVE_COMMENT:"Salvare il commento cancellato",FAILED_REMOVE_COMMENT:"Cancellazione del commento fallita"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Rispondere",BTN_COMPOSE:"Nuovo messaggio",BTN_WRITE:"Scrivere",NO_MESSAGE_INBOX:"Nessun messaggio ricevuto",NO_MESSAGE_OUTBOX:"Nessun messaggio inviato",NOTIFICATIONS:{TITLE:"Messaggi",MESSAGE_RECEIVED:"Hai <b>ricevuto un messaggio/b><br/>da"},LIST:{INBOX:"In entrata",OUTBOX:"In uscita",TITLE:"Messaggi privati",POPOVER_ACTIONS:{TITLE:"Opzioni",DELETE_ALL:"Eliminare tutti i messaggi"}},COMPOSE:{TITLE:"Nuovo messaggio",TITLE_REPLY:"Rispondere",SUB_TITLE:"Nuovo messaggio",TO:"A",OBJECT:"Oggetto",OBJECT_HELP:"Oggetto",ENCRYPTED_HELP:"La informiamo che questo messaggio verrà criptato prima della sua spedizione in modo che solo il destinatario lo possa leggere e essere sicuro che ne sia Lei l'autore.",MESSAGE:"Messaggio",MESSAGE_HELP:"Contenuto del messaggio",CONTENT_CONFIRMATION:"Nessun contenuto. <br/><br/>E sicura di voler inviare questo messaggio?"},VIEW:{TITLE:"Messaggio",SENDER:"Inviato da",RECIPIENT:"Inviato a",NO_CONTENT:"Messaggio vuoto",DELETE:"Cancellare il messaggio"},CONFIRM:{REMOVE:"E sicuro/a di voler <b>eliminare il messaggio</b>?<br/><br/> Questa operazione è irreversibile.",REMOVE_ALL:"E sicuro/a di voler <b>eliminare tutti i messaggi</b>?<br/><br/> Questa operazione è irreversibile.",MARK_ALL_AS_READ:"E sicuro/a di voler <b>segnare tutti i messaggi come letti/b>?",USER_HAS_NO_PROFILE:"Questa identità non ha un profilo Cesium+. Pertanto non può <b>leggere il suo messaggio</b>.<br/><br/>E sicuro/a di voler <b>continuare</b>?"},INFO:{MESSAGE_REMOVED:"Messaggio eliminato correttamente",All_MESSAGE_REMOVED:"Messaggi eliminati correttamente",MESSAGE_SENT:"Messaggio inviato"},ERROR:{SEND_MSG_FAILED:"Errore nella spedizione del messaggio.",LOAD_MESSAGES_FAILED:"Errore durante il caricamento dei messaggi.",LOAD_MESSAGE_FAILED:"Errore durante il caricamento del messaggio.",MESSAGE_NOT_READABLE:"Impossibile leggere il messaggio.",USER_NOT_RECIPIENT:"Lei non è il destinatario del messaggio: impossibile leggerlo.",NOT_AUTHENTICATED_MESSAGE:"Impossibile verificare l'autenticità del messaggio o contenuto corrotto.",REMOVE_MESSAGE_FAILED:"Errore avvenuto durante l'eliminazione del messaggio",MESSAGE_CONTENT_TOO_LONG:"Il contenuto supera il limite ({{maxLength}} caratteri ammessi).",MARK_AS_READ_FAILED:"Impossibile segnare il messaggio come 'letto'.",LOAD_NOTIFICATIONS_FAILED:"Errore nel caricare le notifiche.",REMOVE_All_MESSAGES_FAILED:"Errore avvenuto durante l'eliminazione dei messaggi.",MARK_ALL_AS_READ_FAILED:"Errore avvenuto nel segnare i messaggi come 'letti",RECIPIENT_IS_MANDATORY:"Destinatario obbligatorio"}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Numero di blocco, hash...",POPOVER_FILTER_TITLE:"Filtro",HEADER_MEDIAN_TIME:"Data / Ora",HEADER_BLOCK:"Blocco #",HEADER_ISSUER:"Peer proprietario",BTN_LAST:"Ultimi blocchi",DISPLAY_QUERY:"Visualizzare query",HIDE_QUERY:"Nascondere query",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Input/output Membri',EXISTING_TRANSACTION:'<b class="ion-card"></b> hanno transazioni',PERIOD:'<b class="ion-clock"></b> Tra <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) e <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Calcolato da {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transazioni legate a <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Errore durante la ricerca dei blocchi."}},GROUP:{GENERAL_DIVIDER:"Informazioni generali",LOCATION_DIVIDER:"Indirizzo",SOCIAL_NETWORKS_DIVIDER:"Presenza sui social e/o sito web",TECHNICAL_DIVIDER:"Dati tecnici",CREATED_TIME:"Creato {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Inviti"},LOOKUP:{TITLE:"Gruppi",SEARCH_HELP:"Nome del grupo, parole chiavi, luogo, etc.",LAST_RESULTS_LIST:"Nuovi gruppi :",OPEN_RESULTS_LIST:"Gruppi aperti :",MANAGED_RESULTS_LIST:"Gruppi chiusi :",BTN_LAST:"Nuovi gruppi",BTN_NEW:"Aggiungo un grupo!"},TYPE:{TITLE:"Nuovo gruppo",SELECT_TYPE:"Tipo di gruppo :",OPEN_GROUP:"Gruppo aperto",OPEN_GROUP_HELP:"Un gruppo aperto è accessibile da qualsiasi membro della moneta.",MANAGED_GROUP:"Gruppo amministrato",MANAGED_GROUP_HELP:"un gruppo amministrato è gestito da amministratori e moderatori, che possono accetare, rifiutare o escludere membri del gruppo.",ENUM:{OPEN:"Gruppo aperto",MANAGED:"Gruppo amministrato"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Opzioni",REMOVE_CONFIRMATION:"Sei sicuro/a di voler chiudere questo gruppo ?<br/><br/>Questa operazione è irreversibile."},EDIT:{TITLE:"Gruppo",TITLE_NEW:"Nuovo gruppo",RECORD_TITLE:"Titolo",RECORD_TITLE_HELP:"Titolo",RECORD_DESCRIPTION:"Descrizione",RECORD_DESCRIPTION_HELP:"Descrizione"},ERROR:{SEARCH_GROUPS_FAILED:"Errore nella ricerca di gruppi",REMOVE_RECORD_FAILED:"Errore nel chiudere il gruppo"},INFO:{RECORD_REMOVED:"Gruppo eliminato"}},REGISTRY:{CATEGORY:"Attività principale",GENERAL_DIVIDER:"Informazioni di base",LOCATION_DIVIDER:"Indirizzo",SOCIAL_NETWORKS_DIVIDER:"Presenza sui social, sito web",TECHNICAL_DIVIDER:"Dati tecnici",BTN_SHOW_WOT:"Persone",BTN_SHOW_WOT_HELP:"Cercare persone",BTN_SHOW_PAGES:"Pagine",BTN_SHOW_PAGES_HELP:"Cercare pagine",BTN_NEW:"Aggiungere",MY_PAGES:"Mie pagine",NO_PAGE:"Nessuna pagina",SEARCH:{TITLE:"Pagine",SEARCH_HELP:"Che, chi: parrucchiere, Pizza Efisio, ...",BTN_ADD:"Nuovo",BTN_LAST_RECORDS:"Pagine recenti",BTN_ADVANCED_SEARCH:"Ricerca avanzata",BTN_OPTIONS:"Ricerca avanzata",TYPE:"Tipo di ente",LOCATION_HELP:"Città",RESULTS:"Risultati",RESULT_COUNT_LOCATION:"{{count}} risultato{{count>0?'i':''}}, vicino a {{location}}",RESULT_COUNT:"{{count}} risultato{{count>0?'i':''}}",LAST_RECORDS:"Pagine recenti:",LAST_RECORD_COUNT_LOCATION:"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}, vicino a{{location}}",LAST_RECORD_COUNT:"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Opzioni avanzate ?"}},VIEW:{TITLE:"Annuario",CATEGORY:"Attività principale:",LOCATION:"Indirizzo:",MENU_TITLE:"Impostazioni",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"E sicuro/a di voler eliminare questo riferimento?<br/><br/>Questa operazione è irreversibile."},TYPE:{TITLE:"Nuovo riferimento",SELECT_TYPE:"Tipo di ente/organismo:",ENUM:{SHOP:"Negozi locali",COMPANY:"Azienda",ASSOCIATION:"Associazione",INSTITUTION:"Istituto"}},EDIT:{TITLE:"Modificare",TITLE_NEW:"Nuovo riferimento",RECORD_TYPE:"Tipo di ente",RECORD_TITLE:"Nome",RECORD_TITLE_HELP:"Nome",RECORD_DESCRIPTION:"Descrizione",RECORD_DESCRIPTION_HELP:"Descrivere l'attività",RECORD_ADDRESS:"Indirizzo",RECORD_ADDRESS_HELP:"Indirizzo: Strada, numero civico...",RECORD_CITY:"Città",RECORD_CITY_HELP:"Città, Paese",RECORD_SOCIAL_NETWORKS:"Presenza sui social e/o sito web",RECORD_PUBKEY:"Chiave pubblica",RECORD_PUBKEY_HELP:"Chiave pubblica per ricevere pagamenti"},WALLET:{PAGE_DIVIDER:"Pagine",PAGE_DIVIDER_HELP:"Le pagine sono un elenco dei profesionisti che accettano o favoriscono: negozi, aziende, associazioni, istituti..."},ERROR:{LOAD_CATEGORY_FAILED:"Errore nel caricamento delle attività principali",LOAD_RECORD_FAILED:"Caricamento fallito",LOOKUP_RECORDS_FAILED:"Errore nel caricare i dati",REMOVE_RECORD_FAILED:"Errore nella cancellazione",SAVE_RECORD_FAILED:"Impossibile salvare",RECORD_NOT_EXISTS:"Inesistente",GEO_LOCATION_NOT_FOUND:"Città o CAP inesistente"},INFO:{RECORD_REMOVED:"Pagina eliminata con successo.",RECORD_SAVED:"Pagina salvata"}},PROFILE:{PROFILE_DIVIDER:"Profilo Cesium+",PROFILE_DIVIDER_HELP:"Si tratta qui di data esterni, salvati fuori della rete della moneta.",NO_PROFILE_DEFINED:"Nessun profilo Cesium+",BTN_ADD:"Creare mio profilo",BTN_EDIT:"Modificare mio profilo",UID:"Pseudonimo",TITLE:"Cognome, Nome",TITLE_HELP:"Nome",DESCRIPTION:"A proposito di me",DESCRIPTION_HELP:"A proposito di me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informazioni generali",SOCIAL_NETWORKS_DIVIDER:"Presenza sui social e sito/i web",TECHNICAL_DIVIDER:"Dati tecnici",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Scegliere un'immagine</b>:",BTN_SELECT_FILE:"Scegliere un'immagine",RESIZE_HELP:"<b>Ritagliare l'immagine</b> se necessario. Cliccare sull'immagine permette di spostarla. Cliccando nella zona a basso sinistra permette di fare uno zoom-in.",RESULT_HELP:"<b>Questo è il risultato</b> come visibile sul suo profilo:"},ERROR:{LOAD_PROFILE_FAILED:"Impossibile caricare il profilo dellutente.",SAVE_PROFILE_FAILED:"Impossibile salvare il profilo",INVALID_SOCIAL_NETWORK_FORMAT:"Formatto scorretto: URL sbagliato.<br/><br/>Esempi: :<ul><li>- Una pagina Facebook (https://www.facebook.com/user)</li><li>- Un sito: (http://www.domain.com)</li><li>- Un indirizzo mail: (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Errore nel ritagliare l'immagine"},INFO:{PROFILE_SAVED:"Profilo salvato"},HELP:{WARNING_PUBLIC_DATA:"La informiamo che le informazioni qui pubblicate <b>sono pubbliche</b>: sono anche visibili <b>da gente non registrata/b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trovare mio indirizzo sulla mappa",USE_GEO_POINT:"Geo-localizzare (raccomandato)?",LOADING_LOCATION:"Cercando indirizzo...",LOCATION_DIVIDER:"Posizione",ADDRESS:"Indirizzo",ADDRESS_HELP:"Indirizzo (opzionale)",CITY:"Città",CITY_HELP:"Città, Paese",DISTANCE:"Distanza massimale intorno alla città",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Città, CAP",MODAL:{TITLE:"Cercare indirizzo",SEARCH_HELP:"Città, Paese",ALTERNATIVE_RESULT_DIVIDER:"Risultati alternativi <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} {{lon}}"},ERROR:{REQUIRED_FOR_LOCATION:"Campo obbligatorio per apparire sulla mappa",INVALID_FOR_LOCATION:"Indirizzo sconosciuto",GEO_LOCATION_FAILED:"Impossibile trovare sua posizione. Utilizzi il bottone di ricerca.",ADDRESS_LOCATION_FAILED:"Indirizzo non trovato"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Servizi online",SUBSCRIPTION_DIVIDER_HELP:"I servizi online offrono servizi addizionali opzionali, delegati ad terzi.",BTN_ADD:"Aggiungere un servizio",BTN_EDIT:"Gestire miei servizi",NO_SUBSCRIPTION:"Nessun servizio utilizzato",SUBSCRIPTION_COUNT:"Servizi/ Abbonamenti",EDIT:{TITLE:"Servizi online",HELP_TEXT:"Qui si possono gestire gli abbonamenti e/o altri servizi online",PROVIDER:"Prestatore :"},TYPE:{ENUM:{EMAIL:"Ricevere notifiche per posta elettronica"}},CONFIRM:{DELETE_SUBSCRIPTION:"Sei sicuro/a di voler <b>cancellare questo abbonamento</b> ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Errore nel caricamento dei servizi online",ADD_SUBSCRIPTION_FAILED:"Errore nel invio dell' abbonamento",UPDATE_SUBSCRIPTION_FAILED:"Errore nel aggiornamento dell' abbonamento",DELETE_SUBSCRIPTION_FAILED:"Errore nella cancellazine dell' abbonamento"},MODAL_EMAIL:{TITLE:"Notifiche per posta elettronica",HELP:"Riempi questo formulario per <b>essere notificato/a per e-mail</b> degli eventi che avvengono sul tuo conto.<br/>Tuo indizzo mail sarà cifrato e solo il prestatore del servizio lo potrà vedere.",EMAIL_LABEL:"Tuo indirizzo mail :",EMAIL_HELP:"cristiana.leonardi@dominio.com",FREQUENCY_LABEL:"Frequenza delle notifiche :",FREQUENCY_DAILY:"Quotidiano",FREQUENCY_WEEKLY:"Settimanale",PROVIDER:"Prestatore del servizio :"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Ricerca di documenti",BTN_ACTIONS:"Azioni",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS:"Ultimi documenti",SHOW_QUERY:"Visualizzare la richiesta",HIDE_QUERY:"Nacondere la richiesta",HEADER_TIME:"Data/Ora",HEADER_ISSUER:"Emittente",HEADER_RECIPIENT:"Destinatario",READ:"Letto",BTN_REMOVE:"Eliminare questo documento",POPOVER_ACTIONS:{TITLE:"Azioni",REMOVE_ALL:"Eliminare questi documenti..."}},INFO:{REMOVED:"Documento eliminato"},CONFIRM:{REMOVE:"Sei sicuro/a di voler <b>eliminare questo documento</b> ?",REMOVE_ALL:"Si sicuro/a di voler <b>eliminare questi documenti</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Errore nella ricerca dei documenti",REMOVE_FAILED:"Errore nell'eliminazione del documento",REMOVE_ALL_FAILED:"Errore nell'eliminazione dei documenti"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Profili di utenti, notifiche, messaggi privati",ENABLE_TOGGLE:"Abilitare l'estensione ?",ENABLE_MESSAGE_TOGGLE:"Abilitare i messaggi? privati",ENABLE_SETTINGS_TOGGLE:"Abilitare stoccaggio su dispositivi esterni per le impostazioni?",PEER:"Indirizzo di data peers",POPUP_PEER:{TITLE:"Data peer",HELP:"Definire l'indirizzo da usare per il peer:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifiche",HELP_TEXT:"Scegliere le notifiche che accetta ricevere:",ENABLE_TX_SENT:"Notificarmi di <b>pagamenti inviati</b> con successo?",ENABLE_TX_RECEIVED:"Notificarmi di <b>pagamenti in entrata</b>?",ENABLE_CERT_SENT:"Notificarmi delle <b>certificazioni inviate</b>?",ENABLE_CERT_RECEIVED:"Notificarmi di <b>certificazioni ricevute</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Nuove funzionalità",ASK_ENABLE:'Sono disponibili nuove funzionalità: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i>Profili di utenti</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Messaggi privati/b>.</ul><br/>Sono state <b>disabilitate</b> nelle sue impostazioni.<br/><br/><b>Desidera abilitare</b> queste funzionalità?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinatario è necessario per il criptaggio."}},EVENT:{NODE_STARTED:"Suo nodo ES API <b>{{params[0]}}</b> è UP",NODE_BMA_DOWN:"Nodo<b>{{params[0]}}:{{params[1]}}</b> (utilizzato dal suo ES API) è <b>indisponibile</b>.",NODE_BMA_UP:"Nodo <b>{{params[0]}}:{{params[1]}}</b> è di nuovo attivo.",MEMBER_JOIN:"E diventato <b>membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Non <b>è più membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Non è <b>più membro/a</b> della WoT della moneta<b>{{params[0]}}</b>, a causa di certificazioni non rinnovate o soglia di certificazioni non raggiunta.",MEMBER_REVOKE:"Il suo conto è stato revocato. Da ora in poi non farà più parte della WoT. <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"La sua presenza nella WoT <b>{{params[0]}}</b> è stata <b>rinnovata correttamente</b>.",TX_SENT:"Il suo pagamento <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> è stato eseguito.",TX_SENT_MULTI:"Il suo pagamento <b>{{params[1]}}</b> è stato eseguito.",TX_RECEIVED:"Ha ricevuto un pagamento da <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:"Ha ricevuto un pagamento da <b>{{params[1]}}</b>.",CERT_SENT:"Sua <b>certificazione</b> a favore di <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> è stata eseguita.",CERT_RECEIVED:"Ha ricevuto <b>una certificazione</b> da parte di <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>.",PAGE:{NEW_COMMENT:"<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> ha scritto un commento sul suo riferimento: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<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> ha modificato il suo commento sul suo riferimento: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<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> ha risposto al suo commento sul riferimento: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<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> ha modificato sua risposta sul suo commento a proposito del riferimento: <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nodo<b>{{old}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Vuoi utilizzare temporaneamente il nodo di dati <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:"Nodo di dati<b>{{server}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Cesium continuerà a funzionare <b>senza l'estensione Cesium+</b> (profili utenti, messaggi privati, mappe e grafici)<br/><br/>Verifica tua connessione o cambia nodo <a class=\"positive\" ng-click=\"doQuickFix('settings')\">impostazioni dell'estensione</a>.",ES_MAX_UPLOAD_BODY_SIZE:"Il volume di data da inviare supera il limite imposto dal server.<br/><br/>Suggeriamo di riprovare dopo aver eliminato delle foto, per esempio."}}),e.translations("nl-NL",{COMMON:{CATEGORY:"Categorie",CATEGORIES:"Categorieën",CATEGORY_SEARCH_HELP:"Zoeken",LAST_MODIFICATION_DATE:"Vernieuwd 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:"Pagina's",USER_PROFILE:"Mijn profiel",MESSAGES:"Berichten"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Ondernemingsrekening",ORGANIZATION_ACCOUNT_HELP:"Als je een onderneming, vereniging etc. vertegenwoordigt.<br/>Deze rekening zal geen dividend créeren."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vul <a ui-sref="app.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 eerdere 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 lang (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:"Straat",RECORD_ADDRESS_HELP:"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:"Optionele functies",ASK_ENABLE:'Cesium+ is <b>uitgeschakeld</b> waardoor deze functies niet beschikbaar zijn: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Gebruikersprofielen</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifcaitions"></i> Notificaties</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Privéberichten</b>.</ul><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 bereikbaar.",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 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> 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 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:"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.",CERT_SENT:"Je <b>certificatie</b> van <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> is uitgevoerd.",CERT_RECEIVED:"Je hebt een <b>certificatie ontvangen</b> van <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>.",PAGE:{NEW_COMMENT:"<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> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<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> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<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> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<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> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Knooppunt <b>{{old}}</b> onbereikbaar of ongeldig adres.<br/><br/>Tijdelijk knooppunt <b>{{new}}</b> gebruiken?"},ERROR:{ES_CONNECTION_ERROR:'Knooppunt <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Cesium zal verder weken, <b>zonder de Cesium+ uitbreiding</b> (gebruikersprofielens, privéberichten, kaarten en grafieken).<br/><br/>Controleer je internetverbinding, of verander je knooppunt in <a class="positive" ng-click="doQuickFix(\'settings\')">instellingen</a>.',ES_MAX_UPLOAD_BODY_SIZE:"De hoveelheid te verzenden gegevens is overschrijdt de serverlimiet.<br/><br/>Probeer het nogmaals na, bijvoorbeeld, het wissen foto's."}}),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>"}},ACCOUNT:{TITLE:"Statistics",BTN_SHOW_STATS:"View account Statistics",BALANCE_DIVIDER:"Account status",BALANCE_TITLE:"Evolution of the account {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Receipts",TX_SENT_LABEL:"Spending",UD_LABEL:"UD",BALANCE_LABEL:"Balance",INPUT_CHART_TITLE:"Sum of incoming flows, per transmitter:",OUTPUT_CHART_TITLE:"Sum of outgoing flows, per recipient:"},BLOCKCHAIN:{TITLE:"Statistics",BLOCKS_ISSUERS_DIVIDER:"Written blocks by members",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Number of blocks calculated per member",BLOCKS_ISSUERS_LABEL:"Number of blocks",TX_DIVIDER:"Analysis of transactions",TX_AMOUNT_TITLE:"Transaction volume",TX_AMOUNT_PUBKEY_TITLE:"Volume of transactions calculated by {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Exchange volume",TX_COUNT_TITLE:"Number of written transactions",TX_COUNT_LABEL:"Number of transactions",TX_AVG_BY_BLOCK:"Average per block"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution of the monetary mass",MONETARY_MASS_LABEL:"Monetary mass",MONETARY_MASS_SHARE_LABEL:"Average per member",UD_TITLE:"Evolution of the universal dividend",MEMBERS_COUNT_TITLE:"Evolution of the number of members",MEMBERS_COUNT_LABEL:"Number of members"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics (Cesium+)",USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},USER_DELTA:{TITLE:"Delta / 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"},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>"}},ACCOUNT:{TITLE:"Statistics",BTN_SHOW_STATS:"View account Statistics",BALANCE_DIVIDER:"Account status",BALANCE_TITLE:"Evolution of the account {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Receipts",TX_SENT_LABEL:"Spending",UD_LABEL:"UD",BALANCE_LABEL:"Balance",INPUT_CHART_TITLE:"Sum of incoming flows, per transmitter:",OUTPUT_CHART_TITLE:"Sum of outgoing flows, per recipient:"},BLOCKCHAIN:{TITLE:"Statistics",BLOCKS_ISSUERS_DIVIDER:"Written blocks by members",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Number of blocks calculated per member",BLOCKS_ISSUERS_LABEL:"Number of blocks",TX_DIVIDER:"Analysis of transactions",TX_AMOUNT_TITLE:"Transaction volume",TX_AMOUNT_PUBKEY_TITLE:"Volume of transactions calculated by {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Exchange volume",TX_COUNT_TITLE:"Number of written transactions",TX_COUNT_LABEL:"Number of transactions",TX_AVG_BY_BLOCK:"Average per block"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution of the monetary mass",MONETARY_MASS_LABEL:"Monetary mass",MONETARY_MASS_SHARE_LABEL:"Average per member",UD_TITLE:"Evolution of the universal dividend",MEMBERS_COUNT_TITLE:"Evolution of the number of members",MEMBERS_COUNT_LABEL:"Number of members"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics (Cesium+)",USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},USER_DELTA:{TITLE:"Delta / 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"},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"}},ACCOUNT:{TITLE:"Statistikoj",BTN_SHOW_STATS:"Vidi la statistikojn de la konto",BALANCE_DIVIDER:"Stato de la konto",BALANCE_TITLE:"Evoluo de la konto {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Enspezoj",TX_SENT_LABEL:"Elspezoj",TX_ACCUMULATION_LABEL:"Bilanco de la spezoj",UD_LABEL:"UD",UD_ACCUMULATION_LABEL:"Bilanco de la UD",BALANCE_LABEL:"Saldo",WOT_DIVIDER:"Reto de fido",CERTIFICATION_TITLE:"Nombro de atestaĵoj - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Tuto pri la ricevitaj",RECEIVED_CERT_DELTA_LABEL:"Vario pri la ricevitaj",GIVEN_CERT_LABEL:"Tuto pri la senditaj",GIVEN_CERT_DELTA_LABEL:"Vario pri la senditaj",INPUT_CHART_TITLE:"Sumo de la enirantaj fluoj, por ĉiu sendinto:",OUTPUT_CHART_TITLE:"Sumo de la elirantaj fluoj, por ĉiu ricevinto:"},BLOCKCHAIN:{TITLE:"Statistikoj",BLOCKS_ISSUERS_DIVIDER:"Analizo de la kalkul-distribuo",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membroj</b> kalkulis <b>{{blockCount|formatInteger}} blokojn</b>",BLOCKS_ISSUERS_TITLE:"Nombro de blokoj kalkulitaj por membro",BLOCKS_ISSUERS_LABEL:"Nombro de blokoj",TX_DIVIDER:"Analizo de la spezoj",TX_AMOUNT_TITLE:"Kvanto de la spezoj",TX_AMOUNT_PUBKEY_TITLE:"Kvanto de spezoj kalkulitaj de {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Kvanto interŝanĝita",TX_COUNT_TITLE:"Nombro de spezoj skribitaj",TX_COUNT_LABEL:"Nombro de spezoj",TX_AVG_BY_BLOCK:"Meza nombro de spezoj / bloko"},CURRENCY:{MONETARY_MASS_TITLE:"Evoluo de la mona maso",MONETARY_MASS_LABEL:"Mona maso",MONETARY_MASS_SHARE_LABEL:"Mezumo por membro",UD_TITLE:"Evoluo de la universala dividendo",MEMBERS_COUNT_TITLE:"Evoluo de la nombro de membroj",MEMBERS_COUNT_LABEL:"Nombro de membroj"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombro de blokoj kalkulitaj",BLOCK_COUNT:"{{count}} blokoj",NO_BLOCK:"Neniu bloko"}},DOC_STATS:{TITLE:"Statistikoj pri stokado",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"},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 tiempo:",RANGE_DURATION:{HOUR:"Agrupar por <b>horas</b>",DAY:"Agrupar por <b>días</b>",MONTH:"Agrupar por <b>meses</b>"}},ACCOUNT:{TITLE:"Estadísticas",BTN_SHOW_STATS:"Ver estadísticas de la cuenta",BALANCE_DIVIDER:"Balance de la cuenta",BALANCE_TITLE:"Evolución de la cuenta {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Recibido",TX_SENT_LABEL:"Gastado",UD_LABEL:"DU",BALANCE_LABEL:"Saldo",INPUT_CHART_TITLE:"Resumen de lo recibido, por emisor",OUTPUT_CHART_TITLE:"Resumen de lo gastado, por destinatario"},BLOCKCHAIN:{TITLE:"Estadística",BLOCKS_ISSUERS_DIVIDER:"Bloques escritos por cada miembro",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} miembros</b> han calculado <b>{{blockCount|formatInteger}} bloques</b>",BLOCKS_ISSUERS_TITLE:"Número de bloques por miembro",BLOCKS_ISSUERS_LABEL:"Número de bloques",TX_DIVIDER:"Análisis de transacciones",TX_AMOUNT_TITLE:"El volumen de transacciones",TX_AMOUNT_PUBKEY_TITLE:"El volumen de transacciones calculado por {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volumen intercambiado",TX_COUNT_TITLE:"Número de transacciones escritas",TX_COUNT_LABEL:"Número de transacciones",TX_AVG_BY_BLOCK:"Promedio por bloque"},CURRENCY:{MONETARY_MASS_TITLE:"Evolución de la masa monetaria",MONETARY_MASS_LABEL:"Masa monetaria",MONETARY_MASS_SHARE_LABEL:"Promedio miembro",UD_TITLE:"Evolución del dividendo universales",MEMBERS_COUNT_TITLE:"Evolución del número de miembros",MEMBERS_COUNT_LABEL:"Número de miembros"},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"}},ACCOUNT:{TITLE:"Statistiques",BTN_SHOW_STATS:"Voir les statistiques du compte",BALANCE_DIVIDER:"Situation du compte",BALANCE_TITLE:"Evolution du compte {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Recettes",TX_SENT_LABEL:"Dépenses",TX_ACCUMULATION_LABEL:"Bilan des transactions",UD_LABEL:"DU",UD_ACCUMULATION_LABEL:"Bilan des DU",BALANCE_LABEL:"Solde",WOT_DIVIDER:"Toile de confiance",CERTIFICATION_TITLE:"Nombre de certifications - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Total reçues",RECEIVED_CERT_DELTA_LABEL:"Variation reçues",GIVEN_CERT_LABEL:"Total envoyées",GIVEN_CERT_DELTA_LABEL:"Variation envoyées",INPUT_CHART_TITLE:"Somme des flux entrants, par émetteur :",OUTPUT_CHART_TITLE:"Somme des flux sortants, par destinaire :"},BLOCKCHAIN:{TITLE:"Statistiques",BLOCKS_ISSUERS_DIVIDER:"Analyse de la répartition du calcul",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membres</b> ont calculé <b>{{blockCount|formatInteger}} blocs</b>",BLOCKS_ISSUERS_TITLE:"Nombre de blocs calculés par membre",BLOCKS_ISSUERS_LABEL:"Nombre de blocs",TX_DIVIDER:"Analyse des transactions",TX_AMOUNT_TITLE:"Volume des transactions",TX_AMOUNT_PUBKEY_TITLE:"Volume des transactions calculées par {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volume échangé",TX_COUNT_TITLE:"Nombre de transactions écrites",TX_COUNT_LABEL:"Nombre de transactions",TX_AVG_BY_BLOCK:"Nombre moyen de transactions / bloc"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution de la masse monétaire",MONETARY_MASS_LABEL:"Masse monétaire",MONETARY_MASS_SHARE_LABEL:"Moyenne par membre",UD_TITLE:"Evolution du dividende universel",MEMBERS_COUNT_TITLE:"Evolution du nombre de membres",MEMBERS_COUNT_LABEL:"Nombre de membres"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombre de blocs calculés",BLOCK_COUNT:"{{count}} blocs",NO_BLOCK:"Aucun bloc"}},DOC_STATS:{TITLE:"Statistiques de stockage",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"},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"}},ACCOUNT:{TITLE:"Statistiche",BTN_SHOW_STATS:"Visualizzare le statistiche del conto",BALANCE_DIVIDER:"Situazione del conto",BALANCE_TITLE:"Evoluzione del conto {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Incassi",TX_SENT_LABEL:"Spese",TX_ACCUMULATION_LABEL:"Bilancio delle transazioni",UD_LABEL:"DU",UD_ACCUMULATION_LABEL:"Bilancio dei DU",BALANCE_LABEL:"Saldo",WOT_DIVIDER:"Tela di fiducia",CERTIFICATION_TITLE:"Numero di certificazioni - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Totale ricevute",RECEIVED_CERT_DELTA_LABEL:"Variazione ricevute",GIVEN_CERT_LABEL:"Totale inviate",GIVEN_CERT_DELTA_LABEL:"Variazione inviate",INPUT_CHART_TITLE:"Somma dei flussi in entrata, par emittente :",OUTPUT_CHART_TITLE:"Somma dei flussi in uscita, per destinatario :"},BLOCKCHAIN:{TITLE:"Statistiche",BLOCKS_ISSUERS_DIVIDER:"Analisi della ripartizione del calcolo",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membri</b> hanno calcolato <b>{{blockCount|formatInteger}} blocchi</b>",BLOCKS_ISSUERS_TITLE:"Numero di blocchi calcolati a membro",BLOCKS_ISSUERS_LABEL:"Numero di blocchi",TX_DIVIDER:"Analisi delle transazioni",TX_AMOUNT_TITLE:"Volume delle transazioni",TX_AMOUNT_PUBKEY_TITLE:"Volume delle transazioni calcolato da {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volume scambiato",TX_COUNT_TITLE:"Numero di transazioni scritte",TX_COUNT_LABEL:"Numero di transazioni",TX_AVG_BY_BLOCK:"Numero medio di transazioni / blocco"},CURRENCY:{MONETARY_MASS_TITLE:"Evoluzione della massa monetaria",MONETARY_MASS_LABEL:"Massa monetaria",MONETARY_MASS_SHARE_LABEL:"Media a membro",UD_TITLE:"Evoluzione del Dividendo Universale",MEMBERS_COUNT_TITLE:"Evoluzione del numero di membri",MEMBERS_COUNT_LABEL:"Numero di membri"},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>"}},ACCOUNT:{INPUT_CHART_TITLE:"Som van de binnenkomende stroom, door de zender:",OUTPUT_CHART_TITLE:"Som van de uitstroom per bestemming:"},BLOCKCHAIN:{TITLE:"Statistieken",BLOCKS_ISSUERS_DIVIDER:"Schriftelijke blokken door leden",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} leden</b> berekend <b>{{blockCount|formatInteger}} blokken</b>",BLOCKS_ISSUERS_TITLE:"Aantal blokken berekend per lid",BLOCKS_ISSUERS_LABEL:"Aantal blokken",TX_DIVIDER:"Analyse van transacties",TX_AMOUNT_TITLE:"Trading volume",TX_AMOUNT_PUBKEY_TITLE:"Trading volume dat wordt berekend door {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Verhandeld volume",TX_COUNT_TITLE:"Aantal schriftelijke transacties",TX_COUNT_LABEL:"Aantal transacties",TX_AVG_BY_BLOCK:"Gemiddeld aantal transacties / blok"},CURRENCY:{MONETARY_MASS_TITLE:"Evolutie van de monetaire massa",MONETARY_MASS_LABEL:"Monetaire massa",MONETARY_MASS_SHARE_LABEL:"Gemiddelde leden",UD_TITLE:"Ontwikkeling van de universele dividend",MEMBERS_COUNT_TITLE:"Evolutie van het aantal leden",MEMBERS_COUNT_LABEL:"Aantal leden"}}}),e.translations("en-GB",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_LOCALIZE_ME:"Localize me"},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:"Map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Members',PENDING:'<i class="icon ion-clock energized"></i> Pending registrations',WALLET:'<i class="icon ion-card gray"></i> Simple wallets'}},ERROR:{LOAD_POSITION_FAILED:"Can not retrieve the positions to display."}},REGISTRY:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open the map of the pages"},VIEW:{TITLE:"Map of pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Local shops',COMPANY:'<i class="icon ion-page-company positive"></i> Companies',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},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"},SETTINGS:{MAP_DIVIDER:"Maps",ENABLE_GOOGLE_API:"Enable Google API services?",ENABLE_GOOGLE_API_HELP:"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.",GOOGLE_API_KEY:"Google API key",BTN_GOOGLE_API:"Getting a key",BTN_GOOGLE_API_WARNING:"requires a Google account",GOOGLE_API_KEY_PLACEHOLDER:"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.",WOT_BTN_LAYERS:"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.",WOT_BTN_SEARCH:"You can <b>search</b> by name, public key, or member pseudonym."}}}}),e.translations("en",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_LOCALIZE_ME:"Localize me"},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:"Map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Members',PENDING:'<i class="icon ion-clock energized"></i> Pending registrations',WALLET:'<i class="icon ion-card gray"></i> Simple wallets'}},ERROR:{LOAD_POSITION_FAILED:"Can not retrieve the positions to display."}},REGISTRY:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open the map of the pages"},VIEW:{TITLE:"Map of pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Local shops',COMPANY:'<i class="icon ion-page-company positive"></i> Companies',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},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"},SETTINGS:{MAP_DIVIDER:"Maps",ENABLE_GOOGLE_API:"Enable Google API services?",ENABLE_GOOGLE_API_HELP:"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.",GOOGLE_API_KEY:"Google API key",BTN_GOOGLE_API:"Getting a key",BTN_GOOGLE_API_WARNING:"requires a Google account",GOOGLE_API_KEY_PLACEHOLDER:"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.",WOT_BTN_LAYERS:"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.",WOT_BTN_SEARCH:"You can <b>search</b> by name, public key, or member pseudonym."}}}}),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:'<i class="icon ion-person positive"></i> Membroj',PENDING:'<i class="icon ion-clock energized"></i> Aliĝoj atendantaj',WALLET:'<i class="icon ion-card gray"></i> Simplaj monujoj'}},ERROR:{LOAD_POSITION_FAILED:"Neeblas ricevi la lokojn afiŝotajn."}},REGISTRY:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri paĝoj"},VIEW:{TITLE:"Mapo pri paĝoj",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Lokaj komercoj',COMPANY:'<i class="icon ion-page-company positive"></i> Entreprenoj',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Asocioj',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institucioj'}}},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"},SETTINGS:{MAP_DIVIDER:"Mapoj",ENABLE_GOOGLE_API:"Aktivigi la Google-API-servojn?",ENABLE_GOOGLE_API_HELP:"Ebligas afiŝi sur la <b>mapo pri membroj</b> kontojn kun adreso sed sen iu GPS-lokalizo.",GOOGLE_API_KEY:"Google-API-ŝlosilo",BTN_GOOGLE_API:"Ekhavi ŝlosilon",BTN_GOOGLE_API_WARNING:"Necesigas havi Google-konton",GOOGLE_API_KEY_PLACEHOLDER:"Ekzemple: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Tiu ĉi mapo afiŝas <b>la profilojn kun loko</b>, ĉu ili rilatas al membro-kontoj aŭ ne.<br/><br/>Nur videblas la profiloj, kies kromaĵo &quot;aperi sur la mapo&quot; estis aktivigita.",WOT_BTN_LAYERS:"<b>Filtru ĉi tie la afiŝitajn datenojn</b>: membroj, aliĝoj atendantaj, simplaj monujoj, ktp.",WOT_BTN_SEARCH:"Vi povas <b>efektivigi serĉadon</b> laŭ nomo, publika ŝlosilo aŭ membro-pseŭdonimo."}}}}),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:'<i class="icon ion-person positive"></i> Membres',PENDING:'<i class="icon ion-clock energized"></i> Inscriptions en attente',WALLET:'<i class="icon ion-card gray"></i> Simples portefeuilles'}},ERROR:{LOAD_POSITION_FAILED:"Impossible de récupérer les positions à afficher."}},REGISTRY:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des pages"},VIEW:{TITLE:"Carte des pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Commerces locaux',COMPANY:'<i class="icon ion-page-company positive"></i> Entreprises',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},PROFILE:{MARKER_HELP:"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b> sur la carte, ou utilisez le bouton<br/>de recherche au-dessus de la carte."},ERROR:{LOCALIZE_ME_FAILED:"Impossible de récupérer votre position actuelle"},SETTINGS:{MAP_DIVIDER:"Cartes",ENABLE_GOOGLE_API:"Activer les services Google API ?",ENABLE_GOOGLE_API_HELP:"Permet l'affichage dans la <b>carte des membres</b> des comptes ayant une adresse mais aucun positionnement GPS.",GOOGLE_API_KEY:"Clé d'API Google",BTN_GOOGLE_API:"Obtenir une clé",BTN_GOOGLE_API_WARNING:"Nécessite d'avoir un compte Google",GOOGLE_API_KEY_PLACEHOLDER:"Exemple : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Cette carte affiche <b>les profils ayant une position</b>, qu'ils correspondent à des comptes membre ou non.<br/><br/>Seuls sont visibles les profils dont l'option &quot;apparaître sur la carte&quot; a été activée.",WOT_BTN_LAYERS:"<b>Filtrez ici les données affichées</b> : membres, inscriptions en attente, simples portefeuilles, etc.",WOT_BTN_SEARCH:"Vous pouvez <b>effectuer une recherche</b> par nom, clef publique ou pseudonyme de membre."}}}}),e.translations("it-IT",{MAP:{COMMON:{SEARCH_DOTS:"Ricerca...",BTN_LOCALIZE_ME:"Trovami"},NETWORK:{LOOKUP:{BTN_MAP:"Mappa dei peers",BTN_MAP_HELP:"Aprire mappa dei peers"},VIEW:{TITLE:"Mappa dei peers",LAYER:{MEMBER:"Peers membri",MIRROR:"Peers specchi",OFFLINE:"Peers offline"}}},WOT:{LOOKUP:{BTN_MAP:"Mappa dei membri",BTN_MAP_HELP:"Aprire mappa dei membri"},VIEW:{TITLE:"Mappa membri",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Membri',PENDING:'<i class="icon ion-clock energized"></i> Registrazione pendenti',WALLET:'<i class="icon ion-card gray"></i> Portafogli osservatori'}},ERROR:{LOAD_POSITION_FAILED:"Errore nel caricamento delle posizioni."}},REGISTRY:{LOOKUP:{BTN_MAP:"Mappa",BTN_MAP_HELP:"Aprire la mappa delle pagine pro"},VIEW:{TITLE:"Mappa delle pagine pro",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Negozi locali',COMPANY:'<i class="icon ion-page-company positive"></i> Aziende',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associazioni',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Instituti'}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> questo indicatore per <b>aggiornare<br/>tua posizione</b>, o usa i bottoni <br/>sopra la mappa."},ERROR:{LOCALIZE_ME_FAILED:"Impossible trovare tua posizione attuale"},SETTINGS:{MAP_DIVIDER:"Mappe",ENABLE_GOOGLE_API:"Abilitare i servizi Google API ?",ENABLE_GOOGLE_API_HELP:"Sulla <b>mappa dei membri</b>, ti permette di visualizzare i conti con un indirizzo ma senza geolocalizzazione.",GOOGLE_API_KEY:"Chiave Google API",BTN_GOOGLE_API:"Ottenere una chiave",BTN_GOOGLE_API_WARNING:"necessita un conto Google",GOOGLE_API_KEY_PLACEHOLDER:"per es. : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Questa mappa mostra <b>profili che hanno fornito una posizione</b>, che siano conti membri o no.<br/><br/>Solo i profili che hanno attivato l'opzione &quot;apparire sulla mappa&quot; sono stati attivati.",WOT_BTN_LAYERS:"<b>Filtrare i dati visibili</b>: membri, registrazioni pendenti, portafogli osservatori, etc.",WOT_BTN_SEARCH:"Puoi <b>cercare</b> per nome, chiave pubblica, o pseudonimo del membro."}}}}),e.translations("fr-FR",{RML9:{BTN_EXPORT:"Télécharger",BTN_OPEN:"Ouvrir la page RML9",BTN_SWOW_TX:"Voir les transactions",FILE_NAME:"relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Date",AMOUNT:"Montant",COMMENT:"Commentaire"},VIEW:{TITLE:"RML9",DIVIDER:"Dernières transactions :",BALANCE:"Solde du compte"},CHART:{INPUT_CHART_TITLE:"Somme des flux entrants, par émetteur :",OUTPUT_CHART_TITLE:"Somme des flux sortants, par destinaire :"},SETTINGS:{ENABLE_TOGGLE:"Activer le plugin RML9 ?"}}})}]),angular.module("cesium.plugins.templates",[]).run(["$templateCache",function(e){e.put("plugins/es/templates/blockchain/items_blocks.html",'\n<div class="item row row-header done in hidden-xs hidden-sm">\n\n \x3c!-- compact --\x3e\n <a class="pull-left gray button button-text button-small no-margin no-padding" ng-class="{\'positive\': compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="ion-arrow-down-b" style="position: absolute; top: -8px; left: 2px; font-size: 8px;"></b>\n <b class="ion-arrow-up-b" style="position: absolute; top: 6px; left: 2px; font-size: 8px;"></b>\n <span>{{\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\'|translate}}</span>\n </a>\n\n <a class="no-padding dark col col-header" ng-if=":rebind:expertMode" ng-click="toggleSort(\'medianTime\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'medianTime\'"></cs-sort-icon>\n {{\'BLOCKCHAIN.LOOKUP.HEADER_MEDIAN_TIME\' | translate}}\n </a>\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 {{\'BLOCKCHAIN.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-if=":rebind:expertMode" ng-click="toggleSort(\'number\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'number\'"></cs-sort-icon>\n {{\'BLOCKCHAIN.LOOKUP.HEADER_BLOCK\' | 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\x3c!-- blocks (large view) --\x3e\n<ng-if ng-if=":rebind:!smallscreen">\n <ng-repeat ng-repeat="block in :rebind:search.results track by block.number" ng-include="!block.empty ? \'templates/blockchain/item_block_lg.html\' : \'templates/blockchain/item_block_empty_lg.html\'">\n </ng-repeat>\n</ng-if>\n\x3c!-- blocks (small screens) --\x3e\n<ng-if ng-if=":rebind:smallscreen">\n <ng-repeat ng-repeat="block in :rebind:search.results track by block.number" ng-include="::\'templates/blockchain/item_block.html\'">\n </ng-repeat>\n</ng-if>\n'),
e.put("plugins/es/templates/blockchain/lookup_form.html",'<div class="lookupForm">\n\n\n <div class="item no-padding">\n\n <div class="button button-small button-text button-stable button-icon-event padding no-padding-right ink" ng-repeat="filter in search.filters" ng-if="filter">\n <span ng-bind-html="\'BLOCKCHAIN.LOOKUP.TX_SEARCH_FILTER.\'+filter.type|translate:filter"></span>\n <i class="icon ion-close" ng-click="itemRemove($index)"></i>\n\n </div>\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="{{\'BLOCKCHAIN.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="{{\'BLOCKCHAIN.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="helptip-blockchain-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.type==\'last\'" translate>\n BLOCKCHAIN.LOOKUP.LAST_BLOCKS\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 <small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">\n - <a ng-click="toggleShowQuery()" ng-if="!showQuery">\n {{\'DOCUMENT.LOOKUP.SHOW_QUERY\'|translate }}\n <i class="icon ion-arrow-down-b gray"></i>\n </a>\n <a ng-click="toggleShowQuery()" ng-if="showQuery">\n {{\'DOCUMENT.LOOKUP.HIDE_QUERY\'|translate }}\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 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 {{\'BLOCKCHAIN.LOOKUP.BTN_LAST\' | translate}}\n </a>\n\n \x3c!--<a class="button button-text button-small ink icon icon-help" ng-click="showHelpModal(\'join-salt\')">\n {{\'BLOCKCHAIN.LOOKUP.HELP\' | translate}}\n </a>--\x3e\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 list-blocks" ng-class="::motion.ionListClass">\n\n <ng-include src="::\'plugins/es/templates/blockchain/items_blocks.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/blockchain/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>BLOCKCHAIN.LOOKUP.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- last blocks --\x3e\n <a ng-if="enableFilter" class="item item-icon-left item-icon-right ink" ng-click="doSearchLast()">\n <i class="icon ion-clock"></i>\n {{\'BLOCKCHAIN.LOOKUP.BTN_LAST\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'last\'"></i>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/blockchain/lookup.html",'<ion-view>\n <ion-nav-title>\n <span translate>BLOCKCHAIN.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-navicon visible-xs visible-sm" ng-click="toggleCompactMode()">\n <b class="icon-secondary" ng-class="{\'ion-arrow-down-b\': !compactMode, \'ion-arrow-up-b\': compactMode}" style="top: -12px; left: 11px; font-size: 10px;"></b>\n <b class="icon-secondary" ng-class="{\'ion-arrow-up-b\': !compactMode,\'ion-arrow-down-b\': compactMode}" style="top: 12px; left: 11px; font-size: 10px;"></b>\n </button>\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 no-padding-sm" scroll="true">\n <ng-include src="::\'plugins/es/templates/blockchain/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-view>\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" file-select="onFileChanged(file)" accept="image/*">\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</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}}" 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-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",'<div class="list no-padding {{::motion.ionListClass}}">\n \x3c!-- divider --\x3e\n <div class="item item-divider">\n\n <span translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\n\n <a class="badge button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': socialData.reorder}" ng-if="formData.socials && formData.socials.length &gt; 1" ng-click="socialData.reorder=!socialData.reorder">\n <span translate>PROFILE.BTN_REORDER</span>\n </a>\n </div>\n</div>\n\n<ion-list show-reorder="socialData.reorder">\n\n <ion-item class="item-icon-left item-social-edit done in" 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 <span>{{social.url}}</span>\n <a class="gray hidden-device" ng-if="!social.recipient && !socialData.reorder" 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 && !socialData.reorder" 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-reorder-button class="ion-drag" on-reorder="reorderSocialNetwork(social, $fromIndex, $toIndex)">\n </ion-reorder-button>\n </ion-item>\n</ion-list>\n\n<ion-list class="no-padding">\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($event);" ng-model="socialData.url">\n </label>\n <button class="button button-small hidden-xs" type="button" ng-click="addSocialNetwork($event)" translate>COMMON.BTN_ADD</button>\n <button class="button button-small button-icon icon ion-android-add visible-xs" type="button" ng-click="addSocialNetwork($event)">\n </button>\n </div>\n\n</ion-list>\n'),e.put("plugins/es/templates/common/item_comment_content.html",'\n<div class="item item-avatar done in">\n <span class="avatar" ng-if="::!comment.avatar" ng-class="::{\'avatar-member\': comment.uid, \'avatar-wallet\': !comment.uid}"></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.uid">\n {{::comment.name||comment.uid}}\n </span>\n <span ng-if="::!comment.uid" class="gray">\n <i class="icon ion-key gray"></i>\n {{::comment.name || (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_comment.html",'<ng-init ng-init="level = level + 1">\n <a name="{{::comment.id|formatHash}}"></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}">\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.uid">\n {{::comment.parent.name||comment.parent.uid}}\n </ng-if>\n <ng-if ng-if="::!comment.parent.uid">\n <i class="ion-key"></i>\n {{::comment.parent.name|| (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)">{{comment.creationTime | formatFromNow}}</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_location_search.html",' \x3c!-- search text --\x3e\n <div class="item no-padding">\n <div class="item-input">\n <i class="icon ion-location placeholder-icon"></i>\n <input type="text" 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 </div>\n </div>\n\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/modal_category.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">{{ (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\n <p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p>\n\n \x3c!-- Add picture drop zone --\x3e\n <div drop-zone="onFileChanged(file)">\n <div file-select="onFileChanged(file)" accept="image/*">\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 class="gray" translate>COMMON.CHOOSE_FILE</p>\n </div>\n </div>\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="200" data-width="200" 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|trustAsHtml}}" 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" ng-if="formData.imageCropStep <= 2" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-stable icon-left ion-chevron-left ink" ng-click="doPrevious()" translate ng-if="formData.imageCropStep >= 2">\n COMMON.BTN_BACK\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 no-padding-sm" 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_profile_extend.html",' \x3c!-- profile --\x3e\n <button ng-if=":state:enable && auth" 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/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\n \x3c!-- likes --\x3e\n <ng-if ng-if="likeData.likes && likeData.likes.total">\n <span ng-class="{\'gray\': !likeData.likes.wasHitCount, \'positive\': likeData.likes.wasHitCount}">\n <a title="{{\'COMMON.LIKES_TEXT\'|translate: likeData.likes }}" ng-click="!canEdit && toggleLike($event, {kind: \'like\'})">\n {{likeData.likes.total}}\n <i class="icon ion-heart"></i>\n </a>\n </span>\n </ng-if>\n\n \x3c!-- abuses --\x3e\n <ng-if ng-if="likeData.abuses && likeData.abuses.total">\n <span class="gray" ng-if="likeData.likes && likeData.likes.total">&nbsp;|&nbsp;</span>\n <a ng-class="{\'assertive\': likeData.abuses.wasHitCount}" ng-click="!canEdit && reportAbuse($event)" title="{{\'COMMON.ABUSES_TEXT\'|translate: likeData.abuses }}">\n {{likeData.abuses.total}}\n <i class="icon ion-android-warning"></i>\n </a>\n </ng-if>\n</div>\n'),e.put("plugins/es/templates/common/view_pictures.html",'<div class="item gallery done in" ng-if="pictures && pictures.length>0">\n <div ng-repeat="picture in pictures" class="item card card-gallery">\n <div class="ink">\n <h2 ng-if="picture.title">{{::picture.title}}</h2>\n <img ng-src="{{picture.src}}">\n </div>\n </div>\n</div>\n'),e.put("plugins/es/templates/currency/tab_blocks_extend.html",'\n\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'nav-buttons\'">\n\n <button class="button button-icon button-clear icon ion-android-search visible-xs visible-sm" ui-sref="app.blockchain_search">\n </button>\n</ng-if>\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_page.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left 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="avatar icon dark cion-registry-{{doc.docType}}"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h3 ng-if="doc.title">\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 </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/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_CREATE_OR_UPDATE_PROFILE\' |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/item_document.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::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 <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">\n <h3>\n <a ui-sref="app.wot_identity({pubkey: doc.pubkey, uid: doc.uid})">\n <span class="gray">\n <i class="ion-key"></i> {{:rebind:doc.pubkey|formatPubkey}}\n </span>\n <span class="positive" ng-if=":rebind:doc.uid">\n <i class="ion-person"></i> {{:rebind:doc.name||doc.uid}}\n </span>\n </a>\n </h3>\n </div>\n\n <div class="col">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n <h3 ng-if=":rebind:doc.recipient">\n <a ui-sref="app.wot_identity({pubkey: doc.recipient.pubkey, uid: doc.recipient.uid})">\n <span class="gray">\n <i class="ion-key"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}}\n </span>\n <span class="positive" ng-if=":rebind:doc.recipient.uid">\n <i class="ion-person"></i> {{:rebind:doc.recipient.name||doc.recipient.uid}}\n </span>\n </a>\n </h3>\n <h4 class="gray" ng-if=":rebind:doc.read_signature">\n <i class="ion-checkmark"></i>\n <span translate>DOCUMENT.LOOKUP.READ</span>\n </h4>\n\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" ng-if="showHeaders">\n\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 <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(\'recipient\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'recipient\'"></cs-sort-icon>\n {{\'DOCUMENT.LOOKUP.HEADER_RECIPIENT\' | 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\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-when="record">\n <ng-include ng-if="doc.index === \'page\'" src="::\'plugins/es/templates/document/item_document_page.html\'"></ng-include>\n <ng-include ng-if="doc.index !== \'page\'" src="::\'plugins/es/templates/document/item_document.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/list_documents.html",'\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.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\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/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 no-padding-sm" 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/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-controller="ESSocialsEditCtrl"></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<div id="group-{{:rebind:group.hash}}" class="item item-icon-right item-avatar {{::ionItemClass}} ink" ng-click="select(group)">\n\n <i class="item-image avatar" style="background-image: url({{::group.avatar.src}})" ng-if="group.avatar"></i>\n <i class="item-image icon ion-android-people" ng-if="!group.avatar"></i>\n <i class="item-image icon-secondary ion-android-lock" ng-if="!group.avatar" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;"></i>\n\n <h2 ng-bind-html=":rebind:group.title"></h2>\n\n \x3c!-- creation time--\x3e\n <h4 class="gray pull-right">\n <i class="ion-clock"></i>\n {{:rebind:\'GROUP.CREATED_TIME\'|translate: group }}\n </h4>\n\n \x3c!-- membersCount --\x3e\n <h4 class="dark pull-left" ng-if=":rebind:group.membersCount">\n <i class="dark ion-person"></i>\n <span class="dark">+{{:rebind:group.membersCount}}</span>\n </h4>\n\n <i class="icon ion-ios-arrow-right"></i>\n</div>\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_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 <div class="list {{::motion.ionListClass}}" ng-if="!$scope.search.loading">\n\n <ng-include src="::\'plugins/es/templates/group/items_groups.html\'"></ng-include>\n\n </div>\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/lookup_item.html",'\n <i class="item-image avatar" style="background-image: url({{::item.avatar.src}})" ng-if="item.avatar"></i>\n <i class="item-image icon ion-android-people" ng-if="!item.avatar"></i>\n <i class="item-image icon-secondary ion-android-lock" ng-if="!item.avatar" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;"></i>\n\n <h2 ng-bind-html=":rebind:item.title"></h2>\n\n \x3c!-- creation time--\x3e\n <h4 class="gray pull-right">\n <i class="ion-clock"></i>\n {{:rebind:\'GROUP.CREATED_TIME\'|translate: item }}\n </h4>\n\n \x3c!-- membersCount --\x3e\n <h4 class="dark pull-left" ng-if=":rebind:item.membersCount">\n <i class="dark ion-person"></i>\n <span class="dark">+{{:rebind:item.membersCount}}</span>\n </h4>\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 no-padding-sm" 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/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_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>GROUP.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 \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 </div>\n </ion-content>\n</ion-popover-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.avatar"></i>\n <i class="avatar" style="background-image: url({{::formData.avatar.src}})" ng-if="formData.avatar"></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 no-padding-sm">\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 no-padding-sm" 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 <a id="group-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 <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 trust-as-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/invitation/list_invitation.html",'<ion-list class="{{::motion.ionListClass}}">\n\n <ion-item ng-repeat="invitation in search.results" class="item-border-large item-text-wrap item-avatar">\n\n <i ng-if="::!invitation.avatar" class="item-image icon {{::invitation.avatarIcon}}"></i>\n <i ng-if="::invitation.avatar" class="item-image avatar" style="background-image: url({{::invitation.avatar.src}})"></i>\n <h3 trust-as-html="invitation.message | translate:invitation"></h3>\n <h3 class="dark text-italic" ng-if="invitation.comment">\n <i class="icon ion-quote"></i>\n <span ng-bind-html="invitation.comment"></span>\n </h3>\n <h4>\n <i class="icon {{::invitation.icon}}"></i>\n <span class="dark" ng-if="::invitation.issuer" trust-as-html="\'INVITATION.SUGGESTED_BY\' | translate:invitation"></span>\n <span class="dark">{{::invitation.time|formatFromNow}}</span>\n <span class="gray">| {{::invitation.time|formatDate}}</span>\n </h4>\n <div class="block text-right">\n <button class="button button-positive button-small button-small-padding" ng-click="accept(invitation)" ng-if="::invitation.state" translate>{{::(invitation.okText||\'COMMON.BTN_SHOW\') |translate}}</button>\n <button class="button button-stable button-small button-small-padding" ng-click="delete($index)" translate>INVITATION.BTN_DELETE</button>\n </div>\n </ion-item>\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/es/templates/invitation/modal_new_invitation.html",'<ion-modal-view id="transfer" class="modal-invitation 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>INVITATION.NEW.TITLE</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/invitation/new_invitation_form.html\'"></ng-include>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/invitation/new_invitation_form.html",' <form name="invitationForm" novalidate="" ng-submit="doSend()">\n\n <div class="list" ng-init="setForm(invitationForm)">\n\n <a class="item item-icon-right gray ink" ng-class="{\'disable-pointer-events\': recipients.length, \'item-input-error\': form.$submitted && !recipients.length}" ng-click="showSelectRecipientModal($event)">\n <span class="gray" translate>INVITATION.NEW.RECIPIENTS</span>\n <span class="item-note">\n <span class="hidden-xs" ng-if="!recipients.length" translate>INVITATION.NEW.RECIPIENTS_HELP</span>\n <ng-repeat ng-repeat="identity in recipients track by identity.id" class="button button-small button-text button-stable button-icon-event ink" ng-class="{\'button-text-positive\': identity.selected}">\n <ng-bind-html ng-bind-html="identity.name||identity.uid||(identity.pubkey|formatPubkey)"></ng-bind-html>\n <b class="enable-pointer-events ion-close" ng-click="removeRecipient($index, $event)">&nbsp;&nbsp;</b>\n </ng-repeat>\n </span>\n\n <i class="gray icon enable-pointer-events ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !recipients.length">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n <a class="item item-icon-right gray ink" ng-class="{\'disable-pointer-events\': suggestions.length, \'item-input-error\': form.$submitted && !suggestions.length}" ng-click="showSelectSuggestionModal($event)">\n <span class="gray enable-pointer-events" translate>INVITATION.NEW.SUGGESTION_IDENTITIES</span>\n\n <span class="item-note">\n <span class="hidden-xs" ng-if="!suggestions.length" translate>INVITATION.NEW.SUGGESTION_IDENTITIES_HELP</span>\n <ng-repeat ng-repeat="identity in suggestions track by identity.id" class="button button-small button-text button-stable button-icon-event ink" ng-class="{\'button-text-positive\': identity.selected}">\n <ng-bind-html ng-bind-html="identity.name||identity.uid||(identity.pubkey|formatPubkey)"></ng-bind-html>\n <b class="enable-pointer-events ion-close" ng-click="removeSuggestion($index, $event)">&nbsp;&nbsp;</b>\n </ng-repeat>\n </span>\n <i class="gray icon enable-pointer-events ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !suggestions.length">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Enable comment ? --\x3e\n <div class="item item-content item-toggle dark visible-xs visible-sm">\n <span class="input-label gray">{{\'TRANSFER.BTN_ADD_COMMENT\' | translate}}</span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.useComment">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n \x3c!-- Comment --\x3e\n <label class="item item-input item-floating-label hidden-xs hidden-sm" ng-class="{\'item-input-error\': form.$submitted && form.comment.$invalid}">\n <span class="input-label">{{\'TRANSFER.COMMENT\' | translate}}</span>\n <textarea placeholder="{{\'TRANSFER.COMMENT_HELP\' | translate}}" name="comment" ng-model="formData.comment" ng-maxlength="255">\n </textarea>\n </label>\n <label class="item item-input item-floating-label visible-xs visible-sm" ng-if="formData.useComment" ng-class="{\'item-input-error\': form.$submitted && form.comment.$invalid}">\n <span class="input-label">{{\'TRANSFER.COMMENT\' | translate}}</span>\n <textarea placeholder="{{\'TRANSFER.COMMENT_HELP\' | translate}}" name="comment" ng-model="formData.comment" ng-maxlength="255">\n </textarea>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.comment.$error" ng-messages="form.comment.$error">\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>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" tabindex="-1" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" tabindex="8" type="submit" translate>\n TRANSFER.BTN_SEND\n </button>\n </div>\n </form>\n\n'),e.put("plugins/es/templates/invitation/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-class="{\'gray\': !search.results.length, \'assertive\': search.results.length}" ng-click="deleteAll()">\n <i class="icon ion-trash-a"></i>\n <span translate>INVITATION.BTN_DELETE_ALL</span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/invitation/popover_invitation.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-invitation" ng-controller="PopoverInvitationCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title" translate>INVITATION.NOTIFICATIONS.TITLE</div>\n\n <div class="pull-right">\n <a class="positive" ng-click="showNewInvitationModal()" translate>INVITATION.BTN_NEW_INVITATION</a>\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="center padding" 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 INVITATION.NO_RESULT\n </div>\n\n <ng-include src="::\'plugins/es/templates/invitation/list_invitation.html\'"></ng-include>\n\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.es_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_invitations" 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/invitation/view_invitations.html",'<ion-view left-buttons="leftButtons" class="view-invitation">\n <ion-nav-title>\n {{\'INVITATION.LIST.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content class="padding no-padding-xs no-padding-sm" scroll="true">\n\n \x3c!-- Buttons bar--\x3e\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="load()">\n </button>\n\n <button class="button button-raised button-calm ink" ng-click="showNewInvitationModal()">\n {{\'INVITATION.BTN_NEW_INVITATION\' | 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="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col no-padding-xs no-padding-sm">\n\n <div class="center padding" 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 INVITATION.NO_RESULT\n </div>\n\n <ng-include src="::\'plugins/es/templates/invitation/list_invitation.html\'"></ng-include>\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-new-invitation" class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm spin" ng-click="showNewInvitationModal()">\n </button>\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!-- organization 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/menu_extend.html",'\n\x3c!-- Top header: Main section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'nav-buttons-right\'" class="hidden-xs hidden-sm">\n\n\n \x3c!-- invitation event --\x3e\n <button class="button button-clear icon ion-person-stalker" ng-if="login" active-link="gray" active-link-path-prefix="#/app/invitations" ng-click="showInvitationsPopover($event)">\n <span ng-if="walletData.invitations.unreadCount" class="badge badge-button badge-positive">{{walletData.invitations.unreadCount}}</span>\n </button>\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="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-class="{\'badge-positive\': !walletData.notifications.warnCount, \'badge-assertive\': walletData.notifications.warnCount}" ng-if="walletData.notifications.unreadCount || walletData.notifications.warnCount" class="badge badge-button">{{walletData.notifications.unreadCount+walletData.notifications.warnCount}}</span>\n </button>\n</div>\n\n\x3c!-- Left menu: User section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'menu-user\' && !$root.config.readonly" class="visible-xs visible-sm">\n\n <a menu-close class="item item-icon-left" active-link="active" ng-if="login && walletData.isMember" active-link-path-prefix="#/app/invitations" ui-sref="app.view_invitations">\n <i class="icon ion-person-stalker"></i>\n <span translate>MENU.INVITATIONS</span>\n <span class="badge badge-positive" ng-if="walletData.invitations.unreadCount">{{walletData.invitations.unreadCount}}</span>\n </a>\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}" ui-sref="app.user_message.tab_inbox">\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}" ui-sref="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/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 \x3c!-- TODO: allow multi dest ?\n Do IT with a ion-scroll - see https://stackoverflow.com/a/38308803 --\x3e\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> {{destName||destUid}}</span>&nbsp;\n <span class="badge badge-stable" ng-if="!destUid && destPub">{{destName}}\n <span ng-if="!destName"><i class="ion-key"></i>{{destPub | formatPubkey}}</span>\n </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 <ion-item class="item-text-wrap ink" ng-class="{\'item-icon-right\': enableSelectWallet}" ng-click="showSelectWalletModal()">\n <span class="gray" translate>TRANSFER.FROM</span>\n <span class="badge badge-balanced animate-fade-in animate-show-hide" ng-show="!loading">\n <ion-spinner icon="android" ng-if="!walletData.pubkey"></ion-spinner>\n <span ng-if="walletData.pubkey && !walletData.isMember">\n <i class="ion-key"></i> {{walletData.pubkey| formatPubkey}}&nbsp;&nbsp;\n </span>\n <span ng-if="walletData.isMember">\n <i class="ion-person"></i> {{walletData.name||walletData.uid}}\n </span>\n </span>\n <i class="gray icon ion-ios-arrow-right" ng-if="enableSelectWallet"></i>\n </ion-item>\n\n \x3c!-- Object --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <input type="text" autocomplete="off" placeholder="{{\'MESSAGE.COMPOSE.OBJECT_HELP\' | translate}}" name="title" ng-model="formData.title" ng-maxlength="256" required>\n <span class="badge item-note" ng-if="isReply">({{\'MESSAGE.COMPOSE.OBJECT\' | translate}})</span>\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}}" autocomplete="off" 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" ng-disabled="sending" translate>TRANSFER.BTN_SEND</button>\n </div>\n\n \x3c!-- Encryption info --\x3e\n <div class="list no-margin">\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/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/list.html",'<div class="padding gray" ng-if="!search.loading && !search.results.length">\n <span ng-if="search.type==\'last\'">{{ (\'MESSAGE.NO_MESSAGE_\' + type) | upper | translate }}</span>\n <span ng-if="search.type==\'text\'" translate>COMMON.SEARCH_NO_RESULT</span>\n</div>\n\n<ion-list class="{{::motion.ionListClass}}" can-swipe="$root.device.enable">\n\n <ion-item class="item item-border-large item-avatar item-icon-right ink" ng-repeat="msg in :rebind:search.results track by msg.id" ng-click="select(msg, $event)">\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}" ng-bind-html="::msg.title"></h2>\n <p ng-bind-html="::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\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" icon="ion-loading-c" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/message/lookup_by_id.html",'<ion-view left-buttons="leftButtons" class="view-messages">\n\n <ion-tabs class="tabs-positive tabs-icon-top">\n\n <ion-tab title="{{\'MESSAGE.LIST.INBOX\'|translate}}" icon="ion-archive" ui-sref="app.user_messages_by_id.tab_inbox">\n <ion-nav-view name="tab_inbox"></ion-nav-view>\n </ion-tab>\n\n <ion-tab title="{{\'MESSAGE.LIST.OUTBOX\'|translate}}" icon="ion-paper-airplane" ui-sref="app.user_messages_by_id.tab_outbox">\n <ion-nav-view name="tab_outbox"></ion-nav-view>\n </ion-tab>\n\n </ion-tabs>\n\n</ion-view>\n'),e.put("plugins/es/templates/message/lookup_lg.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 <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 no-padding-sm">\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh(true, $event)">\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" ng-click="load()">\n </button>\n\n <button class="button button-calm" ng-click="showNewMessageModal()" translate>\n MESSAGE.BTN_COMPOSE\n </button>\n\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showActionsPopover($event)" title="{{\'COMMON.POPOVER_ACTIONS_TITLE\' | translate}}">\n </button>\n\n\n </div>\n\n \x3c!-- button tabs --\x3e\n <div class="buttons-tabs border-bottom hidden-sm hidden-xs">\n <div class="pull-right">\n\n \x3c!-- inbox tab --\x3e\n <a ng-hide="!isDefaultWallet" class="button button-tab ink dark" title="{{\'MESSAGE.LIST.INBOX\' | translate}}" nav-transition="none" ng-class="{\'active\': type==\'inbox\'}" ui-sref="app.user_messages_lg_inbox">\n <i class="icon ion-archive"></i>\n {{\'MESSAGE.LIST.INBOX\' | translate}}\n </a>\n <a ng-hide="isDefaultWallet" class="button button-tab ink dark" title="{{\'MESSAGE.LIST.INBOX\' | translate}}" nav-transition="none" ng-class="{\'active\': type==\'inbox\'}" ui-sref="app.user_messages_lg_inbox_by_id({id: walletId})">\n <i class="icon ion-archive"></i>\n {{\'MESSAGE.LIST.INBOX\' | translate}}\n </a>\n\n \x3c!-- outbox tab --\x3e\n <a ng-hide="!isDefaultWallet" class="button button-tab ink dark" title="{{\'MESSAGE.LIST.OUTBOX\' | translate}}" nav-transition="none" ng-class="{\'active\': type==\'outbox\'}" ui-sref="app.user_messages_lg_outbox">\n <i class="icon ion-paper-airplane"></i>\n {{\'MESSAGE.LIST.OUTBOX\' | translate}}\n </a>\n <a ng-hide="isDefaultWallet" class="button button-tab ink dark" title="{{\'MESSAGE.LIST.OUTBOX\' | translate}}" nav-transition="none" ng-class="{\'active\': type==\'outbox\'}" ui-sref="app.user_messages_lg_outbox_by_id({id: walletId})">\n <i class="icon ion-paper-airplane"></i>\n {{\'MESSAGE.LIST.OUTBOX\' | translate}}\n </a>\n </div>\n </div>\n\n <div class="item no-padding">\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="{{\'MESSAGE.LIST.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()" on-return="doSearch()" select-on-click>\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'MESSAGE.LIST.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearch()">\n <div class="helptip-anchor-center">\n <a id="helptip-message-search-text"></a>\n </div>\n </div>\n </div>\n\n <div class="padding-top hidden-xs" style="display: block; height: 60px;">\n\n <div class="pull-left" ng-if="!search.loading">\n <ng-if ng-if="search.type==\'last\'">\n <h4>{{ (\'MESSAGE.LIST.LAST_\' + type) | upper | translate}}</h4>\n </ng-if>\n <ng-if ng-if="search.type==\'text\'">\n <h4 translate>COMMON.RESULTS_LIST</h4>\n </ng-if>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.type==\'last\'}" ng-click="doSearchLast()">\n <i class="icon ion-clock"></i>\n {{\'MESSAGE.LIST.BTN_LAST_MESSAGES\' | translate}}\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n &nbsp;\n <button class="button button-small button-stable ink" ng-click="doSearch()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n\n </div>\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n \x3c!-- list --\x3e\n <ng-include src="::\'plugins/es/templates/message/list.html\'"></ng-include>\n\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/lookup.html",'<ion-view left-buttons="leftButtons" class="view-messages">\n\n <ion-tabs class="tabs-positive tabs-icon-top">\n\n <ion-tab title="{{\'MESSAGE.LIST.INBOX\'|translate}}" icon="ion-archive" ui-sref="app.user_message.tab_inbox">\n <ion-nav-view name="tab_inbox"></ion-nav-view>\n </ion-tab>\n\n <ion-tab title="{{\'MESSAGE.LIST.OUTBOX\'|translate}}" icon="ion-paper-airplane" ui-sref="app.user_message.tab_outbox">\n <ion-nav-view name="tab_outbox"></ion-nav-view>\n </ion-tab>\n\n </ion-tabs>\n\n</ion-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-light" 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 padding" 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" ng-class="{\'ion-person\': notification.uid, \'ion-email\': !notification.uid}"></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.uid"><i class="ion-person"></i>&thinsp;{{notification.name||notification.uid}}</span>\n <span class="gray" ng-if="!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.tab_inbox" 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/tabs/tab_list.html",'<ion-view>\n <ion-nav-buttons side="secondary">\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear icon ion-android-more-vertical" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content>\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n <cs-extension-point name="buttons"></cs-extension-point>\n\n \x3c!-- list --\x3e\n <ng-include src="::\'plugins/es/templates/message/list.html\'"></ng-include>\n\n </ion-content>\n\n \x3c!-- fab button --\x3e\n <div class="visible-xs visible-sm">\n <button ng-if="fabButtonNewMessageId" id="{{::fabButtonNewMessageId}}" class="button button-fab button-fab-bottom-right button-assertive spin has-footer" ng-click="showNewMessageModal()">\n <i class="icon ion-compose"></i>\n </button>\n </div>\n\n</ion-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" ng-class="{\'ion-person\': formData.uid, \'ion-email\': !formData.uid}"></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.uid">\n <i class="ion-person"></i>\n {{formData.name||formData.uid}}\n </span>\n <span ng-if="!formData.uid" class="gray">\n <i class="ion-key gray"></i>\n {{formData.name||(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 ng-if="!enableFilter || !search.type">\n {{\'PEER.ALL_PEERS\' | translate}} <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>&nbsp;\n <span translate>ES_SETTINGS.PLUGIN_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="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="ESLastDocumentsCtrl">\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="documents-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/es/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>&nbsp;\n <span translate>ES_SETTINGS.PLUGIN_NAME</span>\n </ion-nav-title>\n\n <ion-content>\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\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/network/view_network_extend.html",'\x3c!-- Network: buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'network-buttons\'">\n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-if="::expertMode" title="{{\'NETWORK.VIEW.ENDPOINTS.ES_USER_API\'|translate}}" ui-sref="app.es_network">\n <i class="icon ion-image"></i>\n <span>{{\'ES_SETTINGS.PLUGIN_NAME\'|translate}}</span>\n </a>\n</ng-if>\n\n\x3c!-- Blockchain: buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'blockchain-buttons\'">\n <a class="button button-text button-small ink" ui-sref="app.blockchain_search">\n <i class="icon ion-android-search"></i>\n <span>{{\'COMMON.BTN_SEARCH\'|translate}}</span>\n </a>\n</ng-if>\n\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 track by notification.id" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select($event, 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.messageParams||notification)"></h3>\n <h4 ng-if="!notification.medianTime">\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 <h4 ng-if="notification.medianTime">\n <i class="icon {{notification.icon}}"></i>&thinsp;<span class="dark">{{notification.medianTime|medianFromNow}}</span>\n <span class="gray">| {{notification.medianTime|medianDate}}</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 hidden-xs hidden-sm 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 <ion-content scroll="true">\n <div class="center padding" 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 --\x3e\n <div class="pull-left">\n <a class="positive" ui-sref="app.es_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_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 <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 <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh(true)">\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="refresh()">\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 no-padding-xs no-padding-sm">\n\n <div class="center padding" 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 no-padding-sm">\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-controller="ESPositionEditCtrl as ctrl"></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_form_options.html",'\n \x3c!-- removeIf(device) --\x3e\n <div class="item item-icon-left item-icon-right item-input stable-bg" remove-if="device" ng-click="showRecordTypeModal($event)" ng-if="!smallscreen && 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" remove-if="device" ng-click="showCategoryModal($event)" ng-if="!smallscreen && 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>\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">\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 class="row double-padding-x item-text-wrap animate-show-hide ng-hide hidden-xs hidden-sm" ng-show="entered" ng-if="search.geoPoint || search.type || search.category">\n\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 </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-top padding-xs padding-sm" 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_lg.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n {{\'REGISTRY.SEARCH.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content class="lookupForm padding no-padding-xs no-padding-sm">\n\n <ng-include src="::\'plugins/es/templates/wot/lookup_lg_extend.html\'" ng-init="enable= true; showNewPageButton=true;"></ng-include>\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 </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_lg.html",'\n\n<div class="list {{::motion.ionListClass}}" 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_list.html",'\n<ion-list class="{{::motion.ionListClass}}" ng-if="!search.loading && search.results">\n\n <div class="item item-avatar item-icon-right item-border-large ink" ng-repeat="item in search.results" 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_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!-- last record --\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/tabs/tab_registry.html",'<ion-view>\n <ion-nav-buttons side="secondary">\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear" ng-click="showFiltersPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n\n <button class="button button-icon button-clear icon ion-android-more-vertical" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content>\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doSearch()">\n </ion-refresher>\n\n <cs-extension-point name="buttons"></cs-extension-point>\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 </ion-content>\n\n</ion-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 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 <a class="item item-icon-left assertive ink visible-xs visible-sm" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <ng-if ng-if="!canEdit && likeData.abuses">\n <button class="item item-icon-left ink" ng-disabled="!!likeData.abuses.wasHitCount" ng-class="{\'gray\': !!likeData.abuses.wasHitCount}" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </button>\n </ng-if>\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 class="gray">\n <span ng-if="formData.city" class="gray hidden-xs hidden-sm">\n <i class="icon ion-location"></i> <span ng-bind-html="formData.city"></span>\n </span>\n \x3c!-- likes --\x3e\n <small ng-include="::\'plugins/es/templates/common/view_likes.html\'"></small>\n </h4>\n\n </div>\n\n <h4 class="content dark" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n </div>\n\n \x3c!-- Top fab button --\x3e\n <div class="visible-xs visible-sm">\n \x3c!-- like --\x3e\n <button class="button button-fab button-fab-top-right button-stable" ng-click="toggleLike($event)">\n <i class="icon ion-heart" ng-class="{\'gray\': !likeData.likes.wasHitCount, \'calm\': likeData.likes.wasHitCount}"></i>\n </button>\n </div>\n\n <div class="row no-padding-xs no-padding-sm">\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 no-padding-sm">\n\n <div class="item">\n <h2 class="gray">\n <a ng-if="formData.city" ui-sref="app.wot_lookup.tab_registry({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.wot_lookup.tab_registry({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!-- 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.wasHitCount, \'calm\': likeData.likes.wasHitCount}"></i>\n </button>\n\n <button class="button button-calm ink-dark" ng-if="showTransfer" 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\n \x3c!-- options --\x3e\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-if="!canEdit" ng-click="showActionsPopover($event)">\n </button>\n </div>\n\n <div class="item">\n <h2 trust-as-html="formData.description"></h2>\n </div>\n\n <div class="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.wot_lookup.tab_registry({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 </div>\n\n \x3c!-- Socials networks --\x3e\n <ng-if ng-if="formData.socials && formData.socials.length>0">\n <div class="item 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 </div>\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 no-padding-sm" 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 <div class="item item-toggle dark">\n <div class="input-label" translate>ES_SETTINGS.ENABLE_TOGGLE</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n <span class="item item-divider hidden-readonly hidden-demo" translate>SETTINGS.STORAGE_DIVIDER</span>\n\n <div class="item item-toggle item-text-wrap dark hidden-demo hidden-readonly">\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" class="input-label" translate>ES_SETTINGS.ENABLE_REMOTE_STORAGE</div>\n <h4 class="gray text-wrap" ng-bind-html="\'ES_SETTINGS.ENABLE_REMOTE_STORAGE_HELP\' | translate"></h4>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.useRemoteStorage" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n <span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span>\n\n <div class="item ink hidden-xs hidden-sm" ng-click="formData.enable && changeEsNode()" ng-disabled="!formData.enable">\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.PEER</div>\n\n \x3c!-- node fallback node --\x3e\n <ng-if ng-if="isFallbackNode">\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">{{server}}</div>\n </ng-if>\n\n <span ng-if="!isFallbackNode" class="item-note" ng-class="{\'dark\': formData.enable}">{{server}}</span>\n </div>\n <ion-item class="ink item-icon-right item-text-wrap visible-xs visible-sm" ng-click="formData.enable && changeEsNode()" ng-disabled="!formData.enable">\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.PEER</div>\n\n \x3c!-- node temporary changed --\x3e\n <ng-if ng-if="isFallbackNode">\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">{{server}}</div>\n </ng-if>\n <div class="badge" ng-class="{\'badge-balanced\': formData.enable, \'badge-stable\': !formData.enable}" ng-if="!isFallbackNode">{{server}}</div>\n <i class="icon ion-ios-arrow-right"></i>\n </ion-item>\n\n <span class="item item-divider hidden-readonly" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>\n\n \x3c!-- Enable HTML notifications --\x3e\n <div class="item item-toggle dark hidden-xs hidden-sm hidden-readonly">\n <div ng-class="{\'gray\': !formData.enable}" class="input-label" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION</div>\n <h4 class="gray" ng-bind-html="\'ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION_HELP\' | translate"></h4>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.emitHtml5" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n\n <span class="item gray item-text-wrap hidden-readonly" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>\n\n <label class="item item-toggle dark item-text-wrap hidden-readonly">\n <span ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</span>\n <div 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 </div>\n </label>\n <label class="item item-toggle dark item-text-wrap hidden-readonly">\n <span ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</span>\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 </label>\n <label class="item item-toggle dark item-text-wrap hidden-readonly">\n <span ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</span>\n <div 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 </div>\n </label>\n <label class="item item-toggle dark item-text-wrap hidden-readonly">\n <span ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</span>\n <div 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 </div>\n </label>\n\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="common"></cs-extension-point>\n\n\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/settings/settings_extend.html",'\n<div class="item item-text-wrap item-icon-right ink" ui-sref="app.es_settings">\n <div class="input-label ng-binding" translate>ES_SETTINGS.PLUGIN_NAME</div>\n\n <h4 class="gray" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4>\n\n <i class="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-nav-buttons side="secondary">\n\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs no-padding-sm" 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\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.uid, \'badge-stable\': !recipient.uid}" ng-show="recipient && (recipient.name||recipient.uid)">\n <i class="ion-person" ng-if="recipient.uid"></i> {{recipient.name||recipient.uid}}\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_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!-- delete profile --\x3e\n <a class="item item-icon-left assertive ink" ng-click="removeProfile()">\n <i class="icon ion-trash-a"></i>\n {{\'PROFILE.BTN_DELETE\' | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\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 \x3c!-- remove button --\x3e\n <button class="button button-icon button-clear button-assertive ion-trash-a visible-xs visible-sm" ng-click="removeProfile()" ng-if="existing">\n </button>\n \x3c!-- save button --\x3e\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\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center animate-show-hide ng-hide" ng-show="existing">\n\n <button class="button button-stable icon-right ink" ng-disabled="saving" 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 <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" translate>PROFILE.GENERAL_DIVIDER</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 as ctrl"></ng-include>\n\n </div>\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="list item-text-wrap {{::motion.ionListClass}}">\n\n <div class="item item-divider" translate>PROFILE.TECHNICAL_DIVIDER</div>\n\n \x3c!-- uid --\x3e\n <ion-item class="item-icon-left" ng-if="walletData && walletData.uid">\n <span translate>COMMON.UID</span>\n <span class="badge badge-stable">{{::walletData.uid}}</span>\n </ion-item>\n\n \x3c!-- pubkey--\x3e\n <ion-item class="item-icon-left item-icon-right item-text-wrap ink" on-hold="copy(formData.pubkey)" copy-on-click>\n <i class="icon ion-key"></i>\n <span translate>COMMON.PUBKEY</span>\n <p class="gray">{{walletData.pubkey}}</p>\n </ion-item>\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" class="item gray" translate>PROFILE.NO_PROFILE_DEFINED</div>\n\n\x3c!-- name --\x3e\n<div class="item" ng-if="formData.profile && 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.descriptionHtml">\n <span class="gray" translate>PROFILE.DESCRIPTION</span>\n <h3 trust-as-html="formData.profile.descriptionHtml"></h3>\n</div>\n\n\x3c!-- Localisation --\x3e\n<div class="item" ng-if="formData.profile && (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 && 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" on-tap="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 on-tap="openSocial($event, social)" href="{{::social.url}}" target="_blank">{{::social.url}}</a>\n </h4>\n </ion-item>\n </div>\n</div>\n\n\n'),e.put("plugins/es/templates/wallet/item_wallet_extend.html",'<h4 class="dark" ng-if=":state:enable && wallet.id!=\'default\'">\n <a ng-if="walletData.invitations.unreadCount">\n <i class="dark ion-person-stalker"></i>\n {{walletData.invitations.unreadCount}}\n </a>\n <a ng-if="walletData.messages.unreadCount" ui-sref="app.user_messages_by_id.tab_inbox({id: wallet.id})">\n <i class="dark ion-email"></i>\n {{walletData.messages.unreadCount}}\n </a>\n <a ng-if="walletData.notifications.unreadCount" ui-sref="app.view_notifications_by_id({id: wallet.id})">\n <i class="dark ion-android-notifications"></i>\n {{walletData.notifications.unreadCount}}\n </a>\n</h4>\n'),e.put("plugins/es/templates/wallet/view_wallet_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'hero\'">\n \x3c!-- likes --\x3e\n <small class="light" style="display: inline-block;" ng-include="::\'plugins/es/templates/common/view_likes.html\'" ng-init="canEdit=true"></small>\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>\n {{\'PROFILE.PROFILE_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer;" ng-click="showProfileHelp=!showProfileHelp" class="icon positive ion-ios-help-outline" title="{{\'PROFILE.PROFILE_DIVIDER_HELP\' | translate}}"></i>\n </span>\n <a class="badge button button-text button-small button-small-padding" ng-if="isDefaultWallet" ui-sref="app.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 <a class="badge button button-text button-small button-small-padding" ng-if="!isDefaultWallet" ui-sref="app.edit_profile_by_id({id: walletId})">\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\n <div class="item item-text-wrap positive item-small-height item-wallet-help" ng-show="showProfileHelp">\n <small trust-as-html="\'PROFILE.PROFILE_DIVIDER_HELP\'|translate"></small>\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 && isDefaultWallet" ui-sref="app.edit_subscriptions">\n <i class="icon ion-edit"></i>\n <span translate>SUBSCRIPTION.BTN_ADD</span>\n </a>\n <a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count && !isDefaultWallet" ui-sref="app.edit_subscriptions_by_id({id: walletId})">\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 && isDefaultWallet" 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 <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count && !isDefaultWallet" ui-sref="app.edit_subscriptions_by_id({id: walletId})">\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.PAGE_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer;" ng-click="showPagesHelp=!showPagesHelp" class="icon positive ion-ios-help-outline" title="{{\'REGISTRY.WALLET.PAGE_DIVIDER_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 item-wallet-help" ng-show="showPagesHelp">\n <small trust-as-html="\'REGISTRY.WALLET.PAGE_DIVIDER_HELP\'|translate"></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 && isDefaultWallet" 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 <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count && !isDefaultWallet" ui-sref="app.wallet_pages_by_id({id: walletId})">\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/lookup_extend.html",'<ion-tab ng-if=":state:enable" title="{{\'MENU.REGISTRY\'|translate}}" icon="ion-social-buffer" ui-sref="app.wot_lookup.tab_registry">\n <ion-nav-view name="tab_registry"></ion-nav-view>\n</ion-tab>\n'),e.put("plugins/es/templates/wot/lookup_item_group.html",'\n<i ng-if="::!item.avatar" class="item-image icon ion-android-people"></i>\n<i ng-if="::!item.avatar" class="item-image icon-secondary ion-android-lock" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;"></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=":rebind:item.name"></h2>\n\n\x3c!-- creation time--\x3e\n<h4 class="gray">\n <i class="ion-clock"></i>\n {{:rebind:\'GROUP.CREATED_TIME\'|translate: item }}\n</h4>\n\n\x3c!-- membersCount --\x3e\n<h4 class="dark pull-left" ng-if=":rebind:item.membersCount">\n <i class="dark ion-person"></i>\n <span class="dark">+{{:rebind:item.membersCount}}</span>\n</h4>\n\n<h4 class="dark">\n <span class="dark" ng-if="::item.description">\n <i class="ion-quote"></i>\n {{::item.description|truncText}}\n </span>\n</h4>\n<h4 ng-if="::item.tags">\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'),e.put("plugins/es/templates/wot/lookup_item_page.html",'<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=":rebind:item.name"></h2>\n\n<h4 class="gray">\n <span class="gray" ng-if="::item.city">\n <i class="ion-location"></i>\n {{::item.city|truncText}}\n </span>\n <span ng-if="::item.city && item.type">|</span>\n <span ng-if="item.type">\n <i class="cion-page-{{item.type}}"></i>\n {{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}\n </span>\n</h4>\n<h4 class="dark">\n <span class="dark" ng-if="::item.description">\n <i class="ion-quote"></i>\n {{::item.description|truncText}}\n </span>\n</h4>\n<h4 ng-if="::item.tags">\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'),e.put("plugins/es/templates/wot/lookup_lg_extend.html",'<div class="buttons-tabs" ng-if=":state:enable">\n <div class="pull-right">\n <div class="button button-tab dark" title="{{\'REGISTRY.BTN_SHOW_WOT_HELP\' | translate}}" nav-transition="none" active-link="active" active-link-path-prefix="#/app/wot/lg" ui-sref="app.wot_lookup_lg">\n <i class="icon ion-person-stalker"></i>\n {{\'REGISTRY.BTN_SHOW_WOT\' | translate}}\n </div>\n <a class="button button-tab ink dark" title="{{\'REGISTRY.BTN_SHOW_PAGES_HELP\' | translate}}" nav-transition="none" active-link="active" active-link-path-prefix="#/app/wot/page" ui-sref="app.registry_lookup_lg">\n <i class="icon ion-social-buffer"></i>\n {{\'REGISTRY.BTN_SHOW_PAGES\' | translate}}\n </a>\n </div>\n\n <div class="pull-right" ng-if="showNewPageButton">\n <button class="button button-small button-positive button-small-padding button-clear ink hidden-sm hidden-xs" ng-click="showNewPageModal()">\n <i class="icon ion-plus"></i>\n {{\'REGISTRY.BTN_NEW\' | translate}}\n </button>\n &nbsp;\n </div>\n</div>\n'),e.put("plugins/es/templates/wot/popover_certification_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!-- certify --\x3e\n <a class="item item-icon-left ink" ng-if="canCertify" ng-click="certify()">\n <i class="icon ion-ribbon-b"></i>\n {{\'WOT.BTN_CERTIFY\' | translate}}\n </a>\n\n \x3c!-- ask certification to current identities --\x3e\n <a class="item item-icon-left ink" ng-if="!isUserPubkey(formData.pubkey) && formData.isMember" ng-click="askCertification()">\n <i class="icon-secondary ion-ribbon-b" style="left: 16px; top: 0px; font-size: 25px;"></i>\n <b class="icon-secondary ion-help" style="left: 35px; top: 0px;"></b>\n {{\'WOT.BTN_ASK_CERTIFICATION\' | translate}}\n </a>\n\n \x3c!-- ask certifications to many identities --\x3e\n <a class="item item-icon-left ink" ng-if="isUserPubkey(formData.pubkey)" ng-click="showAskCertificationModal()">\n <i class="icon-secondary ion-ribbon-b" style="left: 16px; top: 0px; font-size: 25px;"></i>\n <b class="icon-secondary ion-help" style="left: 35px; top: 0px;"></b>\n {{\'WOT.BTN_ASK_CERTIFICATIONS_DOTS\' | translate}}\n </a>\n\n \x3c!-- suggest certifications to current identity --\x3e\n <a class="item item-icon-left ink" ng-if="!isUserPubkey(formData.pubkey)" ng-click="showSuggestCertificationModal()">\n <i class="icon-secondary ion-person-stalker" style="left: 16px; top: 0px; font-size: 25px;"></i>\n <b class="icon-secondary ion-help" style="left: 37px; top: -4px;"></b>\n {{\'WOT.BTN_SUGGEST_CERTIFICATIONS_DOTS\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/wot/view_certifications_extend.html",'\x3c!-- nav buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'nav-buttons\' && !$root.config.readonly">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showCertificationActionsPopover($event)">\n </button>\n\n</ng-if>\n\n\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\' && !$root.config.readonly">\n\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showCertificationActionsPopover($event)" title="{{\'COMMON.POPOVER_ACTIONS_TITLE\' | translate}}">\n </button>\n\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 <small class="light" style="display: inline-block;" ng-include="::\'plugins/es/templates/common/view_likes.html\'"></small>\n</ng-if>\n\n\x3c!-- Top fab buttons --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons-top-fab\' && !$root.config.readonly">\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-email"></i>\n </button>\n</ng-if>\n\n\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\' && !$root.config.readonly">\n <button class="button button-stable button-small-padding icon ion-email" ng-disabled="loading" ng-click="showNewMessageModal()" title="{{\'MESSAGE.BTN_WRITE\' | translate}}">\n </button>\n</ng-if>\n\n\x3c!-- End of buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'after-buttons\' && !$root.config.readonly">\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 === \'after-general\'">\n\n <span class="item item-divider item-divider-top-border">\n <span>\n {{\'PROFILE.PROFILE_DIVIDER\' | translate}}\n <a style="font-size: 12pt; cursor: pointer;" ng-click="showProfileHelp=!showProfileHelp" class="icon positive ion-ios-help-outline ink" title="{{\'PROFILE.PROFILE_DIVIDER_HELP\' | translate}}"></a>\n </span>\n </span>\n\n <div class="item item-text-wrap positive item-small-height" ng-show="showProfileHelp">\n <small translate>PROFILE.PROFILE_DIVIDER_HELP</small>\n </div>\n\n <ng-include src="::\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=false;"></ng-include>\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 <a class="item item-icon-left assertive ink" ng-if="canDelete" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>\n\n \x3c!-- Like --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.likes" ng-click="hideActionsPopover() && toggleLike($event)">\n <i class="icon" ng-class="{\'ion-heart-broken\': likeData.likes.wasHit, \'ion-heart\': !likeData.likes.wasHit}"></i>\n {{(likeData.likes.wasHit ? \'COMMON.BTN_LIKE_REMOVE\' : \'COMMON.BTN_LIKE\' )| translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses" ng-disabled="!!likeData.abuses.wasHitCount" ng-class="{\'gray\': !!likeData.abuses.wasHitCount}" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\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!-- 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!-- TX output 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_identity_tx_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n\n <button class="button button-stable button-small-padding icon ion-stats-bars" ui-sref="app.wot_identity_stats({pubkey: formData.pubkey})" title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n </button>\n\n</ng-if>\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 \x3c!-- - - - - WOT - - - -\n <div class="item item-divider" translate>\n GRAPH.ACCOUNT.WOT_DIVIDER\n </div>\n\n <div class="item no-padding-xs"\n ng-include="::\'plugins/graph/templates/account/graph_certifications.html\'"\n ng-controller="GpAccountCertificationCtrl"\n ng-init="setSize(350, 1000)">\n </div>--\x3e\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/account/view_wallet_tx_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n\n <button class="button button-stable button-small-padding icon ion-stats-bars" ui-sref="app.wot_identity_stats({pubkey: formData.pubkey})" title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n </button>\n\n</ng-if>\n'),e.put("plugins/graph/templates/blockchain/graph_block_issuers.html",'\n <div class="row responsive-lg">\n\n \x3c!-- bar --\x3e\n <div class="col col-75">\n <canvas id="bar" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-labels="labels" chart-colors="colors" chart-options="barOptions" chart-click="onChartClick">\n </canvas>\n </div>\n\n \x3c!-- pie --\x3e\n <div class="col col-25 padding-top">\n <canvas id="blocksByIssuer-pie" class="chart-pie" chart-data="data" chart-labels="labels" chart-colors="colors" chart-click="onChartClick">\n </canvas>\n\n <div class="gray padding-top text-center">\n <small ng-bind-html="\'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_HELP\'| translate:{issuerCount: data.length, blockCount: blockCount }"></small>\n </div>\n </div>\n </div>\n'),e.put("plugins/graph/templates/blockchain/graph_tx_count.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="tx-line" 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/blockchain/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}{{id}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="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" ng-if="!loading">\n\n\n \x3c!-- TX count --\x3e\n <ng-controller ng-controller="GpBlockchainTxCountCtrl">\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.BLOCKCHAIN.TX_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 no-padding-sm" ng-if="!loading" ng-include="::\'plugins/graph/templates/blockchain/graph_tx_count.html\'" ng-init="setSize(350, 1000)">\n </div>\n </ng-controller>\n\n\n \x3c!-- Blocks issuer --\x3e\n <ng-controller ng-controller="GpBlockchainIssuersCtrl">\n\n <div class="item item-divider" ng-if="!loading" translate>GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_DIVIDER</div>\n\n <div class="item no-padding-xs no-padding-sm" ng-if="!loading" ng-include="::\'plugins/graph/templates/blockchain/graph_block_issuers.html\'" ng-init="setSize(300, 750)">\n </div>\n\n </ng-controller>\n\n </div></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!-- scale --\x3e\n <a class="item item-icon-left ink" ng-click="toggleScale()">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.scale==\'logarithmic\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.LOGARITHMIC_SCALE\' | translate"></span>\n </a>\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/currency/graph_du.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 no-padding-sm pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <canvas id="monetaryMass-bar" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-labels="labels" chart-colors="colors" chart-dataset-override="datasetOverride" chart-options="options" chart-click="showBlock">\n </canvas>\n'),e.put("plugins/graph/templates/currency/graph_members_count.html",' <canvas id="membersCount-bar" class="chart-line" height="{{height}}" width="{{width}}" chart-data="data" chart-labels="labels" chart-colors="colors" chart-options="options" chart-dataset-override="datasetOverride" chart-click="onChartClick">\n </canvas>\n'),e.put("plugins/graph/templates/currency/graph_monetary_mass.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="monetaryMass-bar" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-labels="labels" chart-colors="colors" chart-dataset-override="datasetOverride" chart-options="options" chart-click="onChartClick">\n </canvas>\n'),e.put("plugins/graph/templates/currency/popover_monetary_mass_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-click="toggleScale()">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.scale==\'logarithmic\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.LOGARITHMIC_SCALE\' | translate"></span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/currency/tab_blocks_extend.html",'\x3c!-- buttons --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n <div class="item item-divider">\n <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_blocks_stats">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n </a>\n </div>\n</ng-if>\n'),e.put("plugins/graph/templates/currency/tabs/tab_blocks_stats.html",'<ion-view>\n <ion-content>\n <div ng-include="::\'plugins/graph/templates/blockchain/graph_tx_count.html\'" ng-controller="GpBlockchainTxCountCtrl" ng-init="setSize(500,700,false)">\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_network_stats.html",'<ion-view>\n <ion-content>\n\n <div class="list">\n <div class="item" ng-include="::\'plugins/graph/templates/blockchain/graph_block_issuers.html\'" ng-controller="GpBlockchainIssuersCtrl" ng-init="setSize(500,700,true)">\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_parameters_stats.html",'<ion-view>\n <ion-content>\n <div class="list no-padding-xs no-padding-sm">\n\n <ng-container ng-controller="GpCurrencyMonetaryMassCtrl">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n \x3c!-- Monetary mass --\x3e\n <div class="item" ng-include="::\'plugins/graph/templates/currency/graph_monetary_mass.html\'" ng-init="setSize(500,700,true)">\n </div>\n </ng-container>\n\n \x3c!-- DU --\x3e\n <ng-container ng-controller="GpCurrencyDUCtrl">\n <div class="item" ng-include="::\'plugins/graph/templates/currency/graph_du.html\'" ng-init="setSize(500,700,true)">\n </div>\n </ng-container>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_wot_stats.html",'<ion-view>\n <ion-content>\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list no-padding">\n <div class="item no-padding-top" ng-include="::\'plugins/graph/templates/currency/graph_members_count.html\'" ng-init="setSize(600,700,false)">\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/view_currency_extend.html",'\n\x3c!-- section actual parameters --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'parameters-actual\'">\n\n <ng-if ng-if="!smallscreen">\n <div class="item padding-left padding-right no-padding-xs no-padding-sm" ng-include="::\'plugins/graph/templates/currency/graph_monetary_mass.html\'" ng-controller="GpCurrencyMonetaryMassCtrl" ng-init="displayShareAxis=false;">\n </div>\n <div class="item buttons no-padding-top">\n <a class="pull-right button button-text button-small button-small-padding ink" ui-sref="app.currency_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\n </a>\n </div>\n </ng-if>\n\n <div class="item item-divider" ng-if="smallscreen">\n <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_parameters_stats">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n </a>\n </div>\n</ng-if>\n\n\x3c!-- section Wot --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'wot-actual\'">\n\n <ng-if ng-if="!smallscreen">\n <div class="item padding-left padding-right no-padding-xs no-padding-sm" ng-include="::\'plugins/graph/templates/currency/graph_members_count.html\'" ng-controller="GpCurrencyMembersCountCtrl">\n </div>\n <div class="item buttons no-padding-top">\n <a class="pull-right button button-text button-small button-small-padding ink" ui-sref="app.currency_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\n </a>\n </div>\n </ng-if>\n\n <div class="item item-divider" ng-if="smallscreen">\n <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_wot_stats">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n </a>\n </div>\n</ng-if>\n\n\x3c!-- section Wot --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'network-actual\'">\n\n <div class="item padding-left padding-right no-padding-xs no-padding-sm" ng-if="!smallscreen" ng-include="::\'plugins/graph/templates/blockchain/graph_block_issuers.html\'" ng-controller="GpBlockchainIssuersCtrl">\n </div>\n\n <div class="item item-divider" ng-if="smallscreen">\n <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_network_stats">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n </a>\n </div>\n</ng-if>\n\n'),e.put("plugins/graph/templates/currency/view_stats_lg.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n\n\n <div class="list">\n\n \x3c!-- Monetary mass --\x3e\n <ng-controller ng-controller="GpCurrencyMonetaryMassCtrl">\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-include="::\'plugins/graph/templates/currency/graph_monetary_mass.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n <div ng-if="!loading" class="item item-toggle dark no-border text-right">\n <span class="" translate>COMMON.BTN_RELATIVE_UNIT</span>\n <label class="toggle toggle-royal" id="helptip-currency-change-unit">\n <input type="checkbox" ng-model="formData.useRelative">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </ng-controller>\n\n \x3c!-- DU --\x3e\n <ng-controller ng-controller="GpCurrencyDUCtrl">\n <div class="item no-padding-xs" ng-if="!loading" ng-include="::\'plugins/graph/templates/currency/graph_du.html\'" ng-init="setSize(250, 1000)">\n </div>\n </ng-controller>\n\n \x3c!-- Member count --\x3e\n <ng-controller ng-controller="GpCurrencyMembersCountCtrl">\n <div class="item no-padding-xs" ng-if="!loading" ng-include="::\'plugins/graph/templates/currency/graph_members_count.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n\n </ng-controller></div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/currency/view_wot_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n\n <ion-content scroll="true">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <ng-include ng-if="!loading" src="\'plugins/graph/templates/currency/graph_members_count.html\'"></ng-include>\n </ion-content>\n </ion-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 no-padding-sm 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 no-padding-sm" 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 === \'documents-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(node)">\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(node)">\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/network/view_network_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'blockchain-buttons\'">\n <a class="button button-text button-small ink" ui-sref="app.blockchain_stats">\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_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" ui-sref="app.view_peer_stats({pubkey: node.pubkey})">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.PEER.VIEW.BLOCK_COUNT_LABEL</span>\n <span class="badge" ng-if="!loading" ng-class="{\'badge-stable\': blockCount > 0, \'badge-assertive\': !blockCount}">\n {{!blockCount ? \'GRAPH.PEER.VIEW.NO_BLOCK\' : \'GRAPH.PEER.VIEW.BLOCK_COUNT\' | translate:{count: blockCount} }}\n </span>\n <ion-spinner class="badge" icon="android" ng-if="loading"></ion-spinner>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n</ng-if>\n\n'),e.put("plugins/graph/templates/network/view_peer_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}{{id}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="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" ng-if="!loading">\n\n \x3c!-- - - - - TX divider - - - - --\x3e\n <div class="item item-divider hidden-xs hidden-sm" translate>\n GRAPH.BLOCKCHAIN.TX_DIVIDER\n </div>\n\n <div class="item no-padding-xs" ng-include="::\'plugins/graph/templates/blockchain/graph_tx_count.html\'" ng-init="setSize(350, 1000)">\n </div>\n\n </div></ion-content>\n\n</ion-view>\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/map/templates/common/edit_position_extend.html",'<div class="item no-padding hidden-xs hidden-sm {{ionItemClass}}" ng-if="formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon">\n <leaflet id="{{::mapId}}" height="250px" center="map.center" markers="map.markers" defaults="map.defaults">\n </leaflet>\n</div>\n'),e.put("plugins/map/templates/network/item_search_tooltip.html","<a href=\"#\">\n {{peer.dns || peer.server}}\n <span class=\"{{peer.uid ? 'positive' : 'gray'}}\">\n <i class=\"icon {{peer.uid ? 'ion-person' : 'ion-key'}}\"></i>\n {{peer.uid ? (peer.name||peer.uid) : (peer.pubkey|formatPubkey) }}\n </span>\n <span class=\"gray\">{{peer.ipv4 ? (peer.ipv4 + ':' + peer.port) : ''}}</span>\n <span class=\"{{peer.bma.useSsl ? '' : 'ng-hide'}}\"><i class=\"ion-locked\"></i> <small>SSL</small></span>\n</a>\n"),e.put("plugins/map/templates/network/lookup_extend.html",'\x3c!-- FIXME issue #755 - https://git.duniter.org/clients/cesium-grp/cesium/issues/755\n<a ng-if="enable"\n class="button button-text button-small ink hidden-sm hidden-xs"\n title="{{\'MAP.NETWORK.LOOKUP.BTN_MAP_HELP\' | translate}}"\n ui-sref="app.view_network_map">\n <i class="icon ion-ios-location"></i>\n {{\'MAP.NETWORK.LOOKUP.BTN_MAP\' | translate}}\n</a>\n --\x3e\n'),e.put("plugins/map/templates/network/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-network">\n <ion-nav-title>\n <span class="hidden-xs" translate>MAP.NETWORK.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n </ion-nav-buttons>\n\n <ion-content data-tap-disabled="true">\n <leaflet id="{{::mapId}}" height="100%" center="map.center" markers="map.markers" layers="map.layers">\n </leaflet>\n </ion-content>\n</ion-view>\n'),e.put("plugins/map/templates/registry/item_search_tooltip.html","<a href=\"#\" class=\"{{type}}\">\n <i class=\"{{'cion-page-' + type}}\"></i>\n {{name != uid ? name +' ' : ''}}\n <span class=\"gray\">\n {{pubkey ? (pubkey|formatPubkey) : ''}}\n </span>\n</a>\n"),e.put("plugins/map/templates/registry/lookup_lg_extend.html",'<a class="button button-text button-small ink hidden-sm hidden-xs" title="{{\'MAP.REGISTRY.LOOKUP.BTN_MAP_HELP\' | translate}}" ui-sref="app.view_registry_map">\n <i class="icon ion-ios-location"></i>\n {{\'MAP.REGISTRY.LOOKUP.BTN_MAP\' | translate}}\n</a>\n'),e.put("plugins/map/templates/registry/popup_marker.html",'<div class="item no-border no-padding item-avatar" ng-if="loadingMarker">\n\n <i class="item-image icon ion-person"></i>\n\n <div class="item-content item-avatar-left-padding padding-top">\n <h2 class="stable-bg">\n &nbsp;\n </h2>\n <h4 class="stable-bg col-75">\n &nbsp;\n </h4>\n <h4 class="stable-bg col-50">\n &nbsp;\n </h4>\n </div>\n</div>\n\n<a class="item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide" ng-show="!loadingMarker" ui-sref="app.view_page({id: formData.id, title: formData.name})">\n <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}}"></i>\n <i ng-if="!formData.avatar" class="item-image icon cion-page-{{::formData.type}}"></i>\n <div class="item-content item-avatar-left-padding padding-top">\n <h2 class="dark">\n {{::formData.name}}\n </h2>\n <h4 ng-if="::formData.category" class="gray" title="{{::formData.category.name}}">\n <b class="ion-flag"></b> {{::formData.category.name}}\n </h4>\n <h4 ng-if="::formData.city" class="gray" title="{{::formData.city}}">\n <b class="ion-location"></b> {{::formData.city}}\n </h4>\n </div>\n</a>\n\x3c!-- buttons --\x3e\n<div class="item no-border no-padding">\n <div class="pull-left gray">\n \x3c!-- show description --\x3e\n <a class="animate-fade-in animate-show-hide gray ng-hide" ng-class="{\'ion-arrow-down-b\': !showDescription, \'ion-arrow-up-b\': showDescription}" ng-click="showDescription=!showDescription;" title="{{\'PROFILE.DESCRIPTION\'|translate}}" ng-show="!loadingMarker && formData.description">\n &nbsp;\n </a>\n </div>\n</div>\n<div class="item no-border no-padding item-text-wrap hidden-xs ng-hide" ng-show="showDescription">\n <small trust-as-html="::formData.description|truncText:500"></small>\n</div>\n'),e.put("plugins/map/templates/registry/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-registry">\n <ion-nav-title>\n <span class="hidden-xs" translate>MAP.REGISTRY.VIEW.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="load()">\n </button>\n </ion-nav-buttons>\n\n <ion-content data-tap-disabled="true">\n <a id="helptip-map-registry" style="left: 150px; top: 50px; position: relative;"></a>\n <leaflet id="{{::mapId}}" height="100%" layers="map.layers" markers="map.markers" lf-center="map.center" bounds="map.bounds">\n </leaflet>\n </ion-content>\n</ion-view>\n'),
e.put("plugins/map/templates/settings/es_settings_extend.html",'\n\x3c!--<span class="item item-divider" translate>MAP.SETTINGS.MAP_DIVIDER</span>\n\n<label class="item item-toggle dark item-text-wrap">\n <span translate>MAP.SETTINGS.ENABLE_GOOGLE_API</span>\n <h4 class="gray" translate>MAP.SETTINGS.ENABLE_GOOGLE_API_HELP</h4>\n <div class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.enableGoogleApi">\n <div class="track">\n <div class="handle"></div>\n </div>\n </div>\n</label>\n\n<ion-item class="item-input"\n ng-if="!$root.config.plugins.es.googleApiKey"\n ng-class="{\'item-input-error\': formData.enableGoogleApi && !formData.googleApiKey}">\n <div class="input-label col-33">\n <span class="" ng-class="{\'gray\': !formData.enableGoogleApi}"translate>MAP.SETTINGS.GOOGLE_API_KEY</span>\n <h4>\n <a ng-click="openLink($event, \'https://console.developers.google.com/apis/credentials/key\')" translate>MAP.SETTINGS.BTN_GOOGLE_API</a>\n <span class="gray"> ({{\'MAP.SETTINGS.BTN_GOOGLE_API_WARNING\'|translate}})</span>\n </h4>\n </div>\n <input type="text"\n placeholder="{{\'MAP.SETTINGS.GOOGLE_API_KEY_PLACEHOLDER\' | translate}}"\n ng-model="formData.googleApiKey"\n ng-if="formData.enableGoogleApi">\n</ion-item>\n<div class="form-errors"\n ng-show="formData.enableGoogleApi && !formData.googleApiKey">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>--\x3e\n'),e.put("plugins/map/templates/wot/item_search_tooltip.html","<a href=\"#\" class=\"{{type}}\">\n <i class=\"{{pending ? 'ion-clock': (type ? 'cion-page-' + type : '')}}\"></i>\n {{name != uid ? name +' ' : ''}}\n <span class=\"{{uid ? 'positive' : 'gray'}}\">\n <i class=\"{{uid ? 'ion-person' : 'ion-key'}}\"></i>\n {{uid ? uid : (pubkey|formatPubkey) }}\n </span>\n</a>\n"),e.put("plugins/map/templates/wot/lookup_lg_extend.html",'<a ng-if="enable" class="button button-text button-small ink hidden-sm hidden-xs" title="{{\'MAP.WOT.LOOKUP.BTN_MAP_HELP\' | translate}}" ui-sref="app.view_wot_map">\n <i class="icon ion-ios-location"></i>\n {{\'MAP.WOT.LOOKUP.BTN_MAP\' | translate}}\n</a>\n'),e.put("plugins/map/templates/wot/popup_marker.html",'\n<div class="item no-border no-padding item-avatar" ng-if="loadingMarker">\n\n <i class="item-image icon ion-person"></i>\n\n <div class="item-content item-avatar-left-padding padding-top">\n <h2 class="stable-bg">\n &nbsp;\n </h2>\n <h4 class="stable-bg col-75">\n &nbsp;\n </h4>\n <h4 class="stable-bg col-50">\n &nbsp;\n </h4>\n </div>\n</div>\n\n<a class="item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide" ng-show="!loadingMarker" ui-sref="app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})">\n\n <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}})"></i>\n <i ng-if="!formData.avatar && formData.uid" class="item-image icon ion-person"></i>\n <i ng-if="!formData.avatar && !formData.uid" class="item-image icon ion-card"></i>\n\n <div class="item-content item-avatar-left-padding padding-top">\n <h2 class="dark">\n {{formData.name}}\n </h2>\n <h4>\n <span ng-if="formData.uid" class="positive">\n <b class="ion-person"></b>\n {{formData.uid}}\n </span>\n <span class="gray" title="{{formData.pubkey}}"><b class="ion-key"></b> {{formData.pubkey|formatPubkey}}</span>\n <span class="assertive" ng-if="!formData.isMember">\n {{::\'WOT.NOT_MEMBER_PARENTHESIS\'|translate}}\n </span>\n </h4>\n <h4 ng-if="formData.profile.city" class="gray" title="{{formData.profile.city}}">\n <b class="ion-location"></b> {{formData.profile.city}}\n </h4>\n </div>\n</a>\n\x3c!-- buttons --\x3e\n<div class="item no-border no-padding">\n <div class="pull-left gray">\n \x3c!-- show description --\x3e\n <a class="animate-fade-in animate-show-hide gray ng-hide" ng-class="{\'ion-arrow-down-b\': !showDescription, \'ion-arrow-up-b\': showDescription}" ng-click="showDescription=!showDescription;" title="{{\'PROFILE.DESCRIPTION\'|translate}}" ng-show="!loadingMarker && formData.profile.description">\n &nbsp;\n </a>\n </div>\n <div style="font-size: 18px;" class="pull-right gray">\n \x3c!-- share --\x3e\n <a class="icon ion-android-share-alt" ng-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}">&nbsp;</a>\n \x3c!-- certify --\x3e\n <a class="icon ion-ribbon-b" ng-click="certify()" title="{{\'WOT.BTN_CERTIFY\' | translate}}" ng-hide="!canCertify">&nbsp;</a>\n \x3c!-- compose message --\x3e\n <a class="icon ion-compose" ng-click="showNewMessageModal()" title="{{\'MESSAGE.BTN_WRITE\' | translate}}">&nbsp;</a>\n \x3c!-- transfer --\x3e\n <a class="icon ion-card" ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})" title="{{\'COMMON.BTN_SEND_MONEY\' | translate}}">&nbsp;</a>\n\n </div>\n</div>\n<div class="item no-border no-padding item-text-wrap hidden-xs ng-hide" ng-show="showDescription">\n <small trust-as-html="formData.profile.description|truncText:500"></small>\n</div>\n'),e.put("plugins/map/templates/wot/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-wot">\n <ion-nav-title>\n <span class="hidden-xs" translate>MAP.WOT.VIEW.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="load()">\n </button>\n </ion-nav-buttons>\n\n <ion-content data-tap-disabled="true">\n <a id="helptip-map-wot" style="left: 150px; top: 50px; position: relative;"></a>\n <leaflet id="{{::mapId}}" height="100%" layers="map.layers" markers="map.markers" lf-center="map.center" bounds="map.bounds">\n </leaflet>\n </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/01-button.html",'\x3c!-- Button that call a function of the controller --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive" ng-click="onButtonClick()" title="{{\'RML9.BTN_OPEN\' | translate}}">\n</button>\n\n\x3c!-- Button: Open a view, using `ui-sref` attribute\n<button class="button button-balanced button-small-padding icon ion-plus-circled"\n ui-sref="app.rml9({pubkey: formData.pubkey})"\n title="{{\'RML9.BTN_OPEN\' | translate}}">\n</button> --\x3e\n\n'),e.put("plugins/rml9/templates/02-view.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n {{\'RML9.VIEW.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content>\n <div class="list">\n\n \x3c!-- the pubkey --\x3e\n <div class="item">\n {{\'COMMON.PUBKEY\'|translate}}\n <div class="badge">{{pubkey|formatPubkey}}</div>\n </div>\n\n \x3c!-- a text divider--\x3e\n <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n \x3c!-- iterate on each TX --\x3e\n <div class="item" ng-repeat="item in items">\n <h3>{{item.time|formatDate}}</h3>\n <h4>{{item.pubkey|formatPubkey}}</h4>\n <div class="badge">{{item.amount|formatAmount}}</div>\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/03-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive" ui-sref="app.rml9({pubkey: formData.pubkey})" title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/03-view_with_button.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n {{\'RML9.VIEW.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content>\n <div class="list">\n\n \x3c!-- buttons bar --\x3e\n <div class="center padding">\n <div class="buttons">\n <button class="button button-balanced icon-left icon ion-archive" ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n </button>\n </div>\n </div>\n\n \x3c!-- the pubkey --\x3e\n <div class="item">\n {{\'COMMON.PUBKEY\'|translate}}\n <div class="badge">{{pubkey|formatPubkey}}</div>\n </div>\n\n \x3c!-- the balance --\x3e\n <div class="item">\n {{\'RML9.VIEW.BALANCE\'|translate}}\n <div class="badge badge-calm">\n {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n </div>\n </div>\n\n \x3c!-- a text divider--\x3e\n <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n \x3c!-- iterate on each TX --\x3e\n <div class="item item-text-wrap" ng-repeat="item in items">\n\n <h3>\n {{item.time|formatDate}}\n <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n </h3>\n\n <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n <div class="badge" ng-class="{\'badge-balanced\': item.amount > 0}">\n {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n </div>\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/04-view_chart.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n {{\'RML9.VIEW.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content>\n <div class="list">\n\n \x3c!-- buttons bar --\x3e\n <div class="center padding">\n <div class="buttons">\n <button class="button button-balanced icon-left icon ion-archive" ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n </button>\n </div>\n </div>\n\n \x3c!-- the pubkey --\x3e\n <div class="item">\n {{\'COMMON.PUBKEY\'|translate}}\n <div class="badge">{{pubkey|formatPubkey}}</div>\n </div>\n\n \x3c!-- the balance --\x3e\n <div class="item">\n {{\'RML9.VIEW.BALANCE\'|translate}}\n <div class="badge badge-calm">\n {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n </div>\n </div>\n\n \x3c!-- a text divider--\x3e\n <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n\n <div class="row">\n <div class="col col-75">\n \x3c!-- iterate on each TX --\x3e\n <div class="item item-text-wrap" ng-repeat="item in items">\n\n <h3>\n {{item.time|formatDate}}\n <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n </h3>\n\n <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n <div class="badge" ng-class="{\'badge-balanced\': item.amount > 0}">\n {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n </div>\n </div>\n </div>\n\n <div class="col col-25">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray" translate>RML9.CHART.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">\n </canvas>\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray" translate>RML9.CHART.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">\n </canvas>\n </div>\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/06-button.html",'\x3c!-- [NEW] Display only if plugin is enable --\x3e\n\n \x3c!-- Button: call a method from the state controller --\x3e\n <button ng-if="enable" class="button button-balanced button-small-padding icon ion-android-archive" ng-click="onButtonClick()" title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n </button>\n\n\n'),e.put("plugins/rml9/templates/06-settings_item.html",'\n<div class="item item-toggle dark">\n <div class="input-label" translate>RML9.SETTINGS.ENABLE_TOGGLE</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.plugins.rml9.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n</div>\n'),e.put("plugins/rml9/templates/07-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive" ui-sref="app.rml9({pubkey: formData.pubkey})" title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/07-view.html",'<leaflet id="map-geojson" center="map.center" geojson="map.geojson"></leaflet>\n'),e.put("plugins/rml9/templates/final-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button ng-if class="button button-balanced button-small-padding icon ion-android-archive" ui-sref="app.rml9({pubkey: formData.pubkey})" title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/final-view.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n {{\'RML9.VIEW.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content>\n <div class="list">\n\n \x3c!-- buttons bar --\x3e\n <div class="center padding">\n <div class="buttons">\n <button class="button button-balanced icon-left icon ion-archive" ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n </button>\n </div>\n </div>\n\n \x3c!-- the pubkey --\x3e\n <div class="item">\n {{\'COMMON.PUBKEY\'|translate}}\n <div class="badge">{{pubkey|formatPubkey}}</div>\n </div>\n\n \x3c!-- the balance --\x3e\n <div class="item">\n {{\'RML9.VIEW.BALANCE\'|translate}}\n <div class="badge badge-calm">\n {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n </div>\n </div>\n\n \x3c!-- a text divider--\x3e\n <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n \x3c!-- iterate on each TX --\x3e\n <div class="row">\n <div class="col col-75">\n <div class="item item-text-wrap" ng-repeat="item in items">\n\n <h3>\n {{item.time|formatDate}}\n <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n </h3>\n\n <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n <div class="badge" ng-class="{\'badge-balanced\': item.amount > 0}">\n {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n </div>\n </div>\n\n </div>\n\n <div class="col col-25">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray" translate>RML9.CHART.INPUT_CHART_TITLE</p>\n <canvas id="chart-received-pie" class="chart-pie" chart-data="inputChart.data" chart-labels="inputChart.labels">\n </canvas>\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\n <canvas id="chart-sent-pie" class="chart-pie" chart-data="outputChart.data" chart-labels="outputChart.labels">\n </canvas>\n </div>\n </div>\n </div>\n </ion-content>\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.currency.controllers","cesium.es.wot.controllers","cesium.es.wallet.controllers","cesium.es.profile.controllers","cesium.es.message.controllers","cesium.es.notification.controllers","cesium.es.blockchain.controllers","cesium.es.network.controllers","cesium.es.registry.controllers","cesium.es.group.controllers","cesium.es.invitation.controllers","cesium.es.subscription.controllers","cesium.es.document.controllers","cesium.es.like.controllers"]),X.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[.]/},X.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("-")},X.prototype.copyValues=function(e){var t=this;["version","currency","pub","endpoints","hash","status","block","signature"].forEach((function(n){e[n]=t[n]}))},X.prototype.copyValuesFrom=function(e){var t=this;["version","currency","pub","endpoints","block","signature"].forEach((function(n){t[n]=e[n]}))},X.prototype.json=function(){var e=this,t={};return["version","currency","endpoints","status","block","signature"].forEach((function(n){t[n]=e[n]})),t.raw=this.raw&&this.getRaw(),t.pubkey=this.pubkey,t},X.prototype.getEP=function(){if(this.ep)return this.ep;var e=null,t=this.regexp.API_REGEXP;return this.endpoints.forEach((function(n){var i=!e&&t.exec(n);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||{}},X.prototype.getEndpoints=function(e){return e?("string"==typeof e&&(e=new RegExp("^"+e)),this.endpoints.reduce((function(t,n){return n.match(e)?t.concat(n):t}),[])):this.endpoints},X.prototype.hasEndpoint=function(e){var t=this.regexp[e]||new RegExp("^"+e),n=this.getEndpoints(t);return n&&n.length>0},X.prototype.hasEsEndpoint=function(){var e=this.getEsEndpoints();return e&&e.length>0},X.prototype.getEsEndpoints=function(){return this.getEndpoints(/^(ES_CORE_API|ES_USER_API|ES_SUBSCRIPTION_API|GCHANGE_API)/)},X.prototype.getDns=function(){var e=this.ep||this.getEP();return e.dns?e.dns:null},X.prototype.getIPv4=function(){var e=this.ep||this.getEP();return e.ipv4?e.ipv4:null},X.prototype.getIPv6=function(){var e=this.ep||this.getEP();return e.ipv6?e.ipv6:null},X.prototype.getPort=function(){var e=this.ep||this.getEP();return e.port?e.port:null},X.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+"]":""},X.prototype.getURL=function(){var e=this.ep||this.getEP(),t=this.getHost();return(443==e.port||e.useSsl?"https":"http")+"://"+t+(e.port?":"+e.port:"")},X.prototype.getServer=function(){var e=this.ep||this.getEP(),t=this.getHost();return t+(t&&e.port?":"+e.port:"")},X.prototype.hasValid4=function(e){return!(!e.ipv4||e.ipv4.match(this.regexp.LOCAL_IP_ADDRESS))},X.prototype.isReachable=function(){return!!this.getServer()},X.prototype.isSsl=function(){return(this.ep||this.getEP()).useSsl},X.prototype.isTor=function(){return(this.ep||this.getEP()).useTor},X.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.blockchain.services","cesium.es.registry.services","cesium.es.group.services","cesium.es.wallet.services","cesium.es.invitation.services","cesium.es.subscription.services","cesium.es.wot.services","cesium.es.tx.services","cesium.es.geo.services","cesium.es.document.services","cesium.es.network.services","cesium.es.like.services"]),angular.module("cesium.es.comment.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.profile.services"]).factory("esComment",["$rootScope","$q","esHttp","csWallet","csWot",function(e,t,n,i,a){return{instance:function(o){var r={commons:["issuer","creationTime","time","message","reply_to"]},s={index:o,fields:{commons:r.commons},raw:{search:n.post("/"+o+"/comment/_search"),remove:n.record.remove(o,"comment"),wsChanges:n.ws("/ws/_changes"),add:new n.record.post("/"+o+"/comment",{creationTime:!0}),update:new n.record.post("/"+o+"/comment/:id/_update",{creationTime:!0})}};return s.raw.refreshTreeLinks=function(e){return s.raw.addTreeLinks(e,!0)},s.raw.addTreeLinks=function(e,i){(e=e||{}).result=e.result||[],e.mapById=e.mapById||{};var a={};if(_.forEach(_.values(e.mapById),(function(t){if(t.reply_to&&!t.parent){var n=e.mapById[t.reply_to];n||(n=new z(t.reply_to),a[n.id]=t.id,e.mapById[n.id]=n),i&&n.containsReply(t)||n.addReply(t)}})),!_.size(a)){var o=t.defer();return o.resolve(e),o.promise}var l={query:{terms:{_id:_.keys(a)}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:0,size:1e3,_source:r.commons};return console.debug("[ES] [comment] Getting missing comments in tree"),s.raw.search(l).then((function(t){return t.hits.total?(_.forEach(t.hits.hits,(function(t){var i=e.mapById[t._id];i.copyFromJson(t._source),i.html=n.util.parseAsHtml(i.message),delete a[i.id]})),_.size(a)&&console.error("Comments has invalid [reply_to]: "+_.values(a).join(",")),s.raw.addTreeLinks(e)):(console.error("[ES] [comment] Comments has invalid [reply_to]: "+_.values(a).join(",")),e)}))},s.raw.loadDataByRecordId=function(e,t){(t=t||{}).from=t.from||0,t.size=t.size||20,t.loadAvatar=!angular.isDefined(t.loadAvatar)||t.loadAvatar,t.loadAvatarAllParent=!!angular.isDefined(t.loadAvatarAllParent)&&t.loadAvatar&&t.loadAvatarAllParent,t.size<0&&(t.size=1e3);var i={query:{term:{record:e}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:t.from,size:t.size,_source:r.commons},o={total:0,mapById:{},result:[],pendings:{}};return s.raw.search(i).then((function(e){return e.hits.total?(o.total=e.hits.total,o.result=e.hits.hits.reduce((function(e,t){var i=new z(t._id,t._source);return i.html=n.util.parseAsHtml(i.message),o.mapById[i.id]=i,e.concat(i)}),o.result),s.raw.addTreeLinks(o)):o})).then((function(){if(t.loadAvatar)return t.loadAvatarAllParent?a.extendAll(_.values(o.mapById),"issuer"):a.extendAll(o.result,"issuer")})).then((function(){return o.result=o.result.sort((function(e,t){return e.creationTime-t.creationTime})),o}))},s.raw.createOnDeleteListener=function(e){return function(n){var a=_.findIndex(e.result,{id:n.id});if(-1!==a)return e.result.splice(a,1),delete e.mapById[n.id],(i.isUserPubkey(n.issuer)?i:i.children.getByPubkey(n.issuer))?s.raw.remove(n.id).catch((function(e){throw console.error(e),new Error("COMMENTS.ERROR.FAILED_REMOVE_COMMENT")})):t.reject("No wallet found corresponding to the comment issuer")}},s.raw.startListenChanges=function(t,r,l){(r=r||{}).result=r.result||[],r.mapById=r.mapById||{},r.pendings=r.pendings||{},l=l||e;var c=s.raw.createOnDeleteListener(r);_.forEach(r.result,(function(e){e.addOnRemoveListener(c)}));var d=Date.now();console.info("[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]".format(o,t.substr(0,8)));var u=n.websocket.changes(o+"/comment");return u.open().then((function(){console.debug("[ES] [comment] Websocket opened in {0} ms".format(Date.now()-d)),u.on((function(e){e&&l.$applyAsync((function(){var o=r.mapById[e._id];"DELETE"===e._operation?o&&o.remove():e._source&&e._source.record===t&&(o?(o.copyFromJson(e._source),o.html=n.util.parseAsHtml(o.message),s.raw.refreshTreeLinks(r)):r.pendings&&r.pendings[e._source.creationTime]||e._source.issuer==i.data.pubkey?console.debug("Skip comment received by WS (already in pending)"):((o=new z(e._id,e._source)).addOnRemoveListener(c),o.isnew=!0,o.html=n.util.parseAsHtml(o.message),r.mapById[e._id]=o,s.raw.refreshTreeLinks(r).then((function(){return a.extend(o,"issuer")})).then((function(){r.result.push(o)}))))}))}))}))},s.raw.save=function(e,t,a){(t=t||{}).result=t.result||[],t.mapById=t.mapById||{},t.pendings=t.pendings||{};var o,r=a.id,l={creationTime:r?a.creationTime||a.time:moment().utc().unix(),message:a.message,record:e,issuer:i.data.pubkey};return a.reply_to||a.parent?l.reply_to=a.reply_to||a.parent.id:l.reply_to=null,r?(o=t.mapById[r]).copy(a):((o=new z(null,l)).addOnRemoveListener(s.raw.createOnDeleteListener(t)),o.uid=i.data.uid,o.name=i.data.name,o.avatar=i.data.avatar,o.isnew=!0,a.parent&&a.parent.addReply(o),t.result.push(o)),o.html=n.util.parseAsHtml(o.message),r?s.raw.update(l,{id:r}).then((function(){return o})):(t.pendings=t.pendings||{},t.pendings[l.creationTime]=l,s.raw.add(l).then((function(e){return o.id=e,t.mapById[e]=o,delete t.pendings[l.creationTime],o})))},s.raw.stopListenChanges=function(e){console.debug("[ES] [comment] Stopping websocket on comments"),_.forEach(e.result,(function(e){e.cleanAllListeners()})),s.raw.wsChanges().close()},s.load=s.raw.loadDataByRecordId,s.save=s.raw.save,s.changes={start:s.raw.startListenChanges,stop:s.raw.stopListenChanges},s}}}]),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,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b,g,f){var h=!!("true"===u.httpsMode||!0===u.httpsMode||"force"===u.httpsMode||r.location&&"https:"===r.location.protocol);function T(i,a,r,T){var v,I,O=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:u.plugins&&u.plugins.es&&u.plugins.es.maxUploadBodySize||2097152},R={IMAGE_SRC:P("data:([A-Za-z//]+);base64,(.+)"),URL:k("(www\\.|https?://(www\\.)?)[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)"),HASH_TAG:k("(?:^|[\t\n\rs ])#([0-9_-\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)"),USER_TAG:k("(?:^|[\t\n\rs ])@("+E.constants.regexp.USER_ID+")"),ES_USER_API_ENDPOINT:P(N.ES_USER_API_ENDPOINT),API_ENDPOINT:P(N.ANY_API_ENDPOINT)},A=0,S=s("truncUrl");function C(e,t,n){!e&&p.data&&(e=e||(p.data.plugins&&p.data.plugins.es?p.data.plugins.es.host:null),t=t||(e?p.data.plugins.es.port:null),n=angular.isDefined(n)?n:443==t||p.data.plugins.es.useSsl||h),O.alive=!1,O.host=e,O.port=t||(n||h?443:80),O.useSsl=angular.isDefined(n)?n:443==O.port||h,O.server=d.getServer(e,t)}function L(e){if(!(e=e||p.data).plugins||!e.plugins.es)return!1;var t=e.plugins.es.host,n=443==e.plugins.es.port||e.plugins.es.useSsl||h;return D(t,e.plugins.es.port||(n?443:80),n)}function D(e,t,n){return O.host===e&&O.port===t&&(angular.isUndefined(n)||n==O.useSsl)}function y(e){O.data.isFallback=e}function P(e){return new RegExp("^"+e+"$")}function k(e){return new RegExp(e)}function M(t,n){return n=n||e.defer(),O.data.isFallback&&O.started&&O.stop(),O.data.isFallback=!1,I=null,n.resolve(t),n.promise}function w(e,t){for(var n="@"===(t=t||"#")?R.USER_TAG:R.HASH_TAG,i=e&&n.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&&n.exec(e)}return a}O.data={isFallback:!1},O.useCache=!!angular.isDefined(T)&&T,O.raw={getByPath:{},postByPath:{},wsByPath:{}},O.api=new f(this,"esHttp"),O.started=!1,O.init=C,C(i,a,r),O.closeWs=function(){O.raw&&(console.warn("[ES] [http] Closing all websockets..."),_.keys(O.raw.wsByPath||{}).forEach((function(e){O.raw.wsByPath[e].close()})),O.raw.wsByPath={})},O.cleanCache=function(){console.debug("[ES] [http] Cleaning cache {prefix: '{0}'}...".format("esHttp-")),m.clear("esHttp-"),O.raw.getByPath={},O.raw.postByPath={},O.raw.wsByPath={}},O.copy=function(e){return O.started&&O.stop(),O.init(e.host,e.port,e.useSsl||443==e.port),O.data.isTemporary=!1,O.start(!0)},O.date={now:d.date.now},O.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},O.getUrl=function(e){return d.getUrl(O.host,O.port,e,O.useSsl)},O.get=function(t,n){n=O.useCache&&n;var i=t+(n?"#"+n:""),a=function(o){if(!O.started)return O._startPromise||console.warn("[ES] [http] Trying to get [{0}] before start(). Waiting...".format(t)),O.ready().then((function(t){return t?a(o):e.reject("ERROR.ES_CONNECTION_ERROR")}));var r=O.raw.getByPath[i];return r||(r=n?d.getWithCache(O.host,O.port,t,O.useSsl,n,null,null,"esHttp-"):d.get(O.host,O.port,t,O.useSsl),O.raw.getByPath[i]=r),r(o)};return a},O.post=function(t){var n=function(i,a){if(!O.started)return O._startPromise||console.error("[ES] [http] Trying to post [{0}] before start()...".format(t)),O.ready().then((function(t){return t?n(i,a):e.reject("ERROR.ES_CONNECTION_ERROR")}));var o=O.raw.postByPath[t];return o||(o=d.post(O.host,O.port,t,O.useSsl),O.raw.postByPath[t]=o),o(i,a)};return n},O.ws=function(e){return function(){var t=O.raw.wsByPath[e];return t&&!t.isClosed()||((t=d.ws(O.host,O.port,e,O.useSsl)).onclose=function(){delete O.raw.wsByPath[e]},O.raw.wsByPath[e]=t),t}},O.wsChanges=function(e){var t=O.ws("/ws/_changes")();if(!e)return t;var n=t.open;return t.open=function(){return n.call(t).then((function(t){t?t.send(e):console.warn("Trying to access ws changes, but no sock anymore... already open ?")}))},t},O.isAlive=function(){return d.get(O.host,O.port,"/node/summary",O.useSsl)().then((function(e){var t=e&&e.duniter&&e.duniter.software||"unknown";return"cesium-plus-pod"===t||"duniter4j-elasticsearch"===t||(console.error("[ES] [http] Not a Cesium+ Pod, but a {0} node. Please check '/node/summary'".format(t)),!1)})).catch((function(){return!1}))},O.checkNodeAlive=function(e){if(e)return y(!L()),!0;if(angular.isUndefined(e))return O.isAlive().then(O.checkNodeAlive);var t=p.data.plugins&&p.data.plugins.es||{};I=I||{host:t.host,port:t.port};var n=t.fallbackNodes&&A<t.fallbackNodes.length&&t.fallbackNodes[A++];if(!n)return o("ERROR.ES_CONNECTION_ERROR",{server:O.server}).then(c.alert.info),!1;var i=d.getServer(n.host,n.port);return c.loading.hide(),o("CONFIRM.ES_USE_FALLBACK_NODE",{old:O.server,new:i}).then(c.alert.confirm).then((function(e){return!!e&&(O.cleanCache(),O.init(n.host,n.port,n.useSsl||443==n.port),O.isAlive().then(O.checkNodeAlive))}))},O.isStarted=function(){return O.started},O.ready=function(){return O.started?e.when(!0):O._startPromise||O.start()},O.start=function(t){return O._startPromise?O._startPromise:O.started?e.when(O.alive):(O._startPromise=g.ready().then((function(){t||O.init()})).then((function(){console.debug("[ES] [http] Starting on [{0}]{1}...".format(O.server,O.useSsl?" (SSL on)":""));var e=Date.now();return O.checkNodeAlive().then((function(t){return O.alive=t,t?(v=[p.api.data.on.reset(n,M,O)],console.debug("[ES] [http] Started in "+(Date.now()-e)+"ms"),O.api.node.raise.start(),O.started=!0,delete O._startPromise,A=0,!0):(console.error("[ES] [http] Could not start [{0}]: node unreachable".format(O.server)),O.started=!0,delete O._startPromise,A=0,!1)}))})),O._startPromise)},O.stop=function(){return O.started||O._startPromise?(console.debug("[ES] [http] Stopping..."),_.forEach(v,(function(e){e()})),v=[],y(!1),delete O._startPromise,O.alive?(O.closeWs(),O.cleanCache(),O.alive=!1,O.started=!1,O.api.node.raise.stop()):O.started=!1,e.when()):e.when()},O.restart=function(){return O.stop(),t(O.start,200)},O.image={},O.image.fromHit=function(e,t){if(e&&e._source){var n=e._source[t];if(n&&n._content_type&&n._content_type.startsWith("image/")){var i={};if(n._content)i.src="data:"+n._content_type+";base64,"+n._content;else{var a=n._content_type.substr(6),o=[e._index,e._type,e._id,"_image",t].join("/");o="/"+o+"."+a,i.src=O.getUrl(o)}return n._title&&(i.title=n._title),n._name&&(i.name=n._name),i}}},O.api.registerEvent("node","start"),O.api.registerEvent("node","stop");var U={getServer:d.getServer,node:{summary:O.get("/node/summary"),moderators:O.get("/node/moderators"),parseEndPoint:function(e){var t=R.API_ENDPOINT.exec(e);if(t)return{api:t[1]||"",dns:t[2]||"",ipv4:t[3]||"",ipv6:t[4]||"",port:t[5]||80,path:t[6]||"",useSsl:443==t[5]}},same:D,sameAsSettings:L,isFallback:function(){return O.data.isFallback}},version:{latest:function(){var e=O.raw.getLatestRelease;if(!e){var t=d.uri.parse(p.data.plugins.es.latestReleaseUrl),n=443==t.port||"https:"===t.protocol||h;e=d.getWithCache(t.host,t.port,"/"+t.pathname,n,m.constants.LONG),O.raw.getLatestRelease=e}return e().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)}))}},websocket:{changes:O.wsChanges,block:O.ws("/ws/block"),peer:O.ws("/ws/peer")},wot:{member:{uids:O.get("/wot/members")}},network:{peering:{self:O.get("/network/peering")},peers:O.get("/network/peers")},blockchain:{current:O.get("/blockchain/current?_source=number,hash,medianTime")},record:{post:function(t,n){n=n||{};var i=O.post(t);return function(t,a){var o=(a=a||{}).wallet||a.walletId&&b.children.get(a.walletId)||(!a.pubkey||b.isUserPubkey(a.pubkey))&&b||a.pubkey&&b.children.getByPubkey(a.pubkey),r=a.keypair||o&&o.data&&o.data.keypair;if(!r&&!o)throw new Error("Missing wallet or keypair, to sign record");delete a.wallet,delete a.walletId,delete a.keypair;var s=angular.copy(a);return s.pubkey=s.pubkey||o.data.pubkey,(o.isAuth()?e.when(o.data):o.auth({silent:!0,minData:!0})).then((function(){a.creationTime&&!t.creationTime&&(t.creationTime=moment().utc().unix());var e=moment().utc().unix();t.time=!t.time||t.time<e?e:t.time+1;var o=angular.copy(t);delete o.signature,delete o.hash,o.issuer=s.pubkey,o.version||(o.version=2),n.tagFields&&function(e,t){t=t||["title","description"],e.tags=t.reduce((function(t,n){var i=e[n],a=i&&w(i);return a?t.concat(a):t}),[])}(o,n.tagFields),n.ignoreFields&&_.forEach(n.ignoreFields,(function(e){angular.isDefined(o[e])&&delete o[e]}));var c=JSON.stringify(o);return l.util.hash(c).then((function(e){return l.sign(e,r).then((function(t){return c='{"hash":"{0}","signature":"{1}",'.format(e,t)+c.substring(1),i(c,s).then((function(e){return m.clear("esHttp-"),e})).catch((function(e){var t=O.byteCount(o);if(t>N.MAX_UPLOAD_BODY_SIZE)throw{message:"ERROR.ES_MAX_UPLOAD_BODY_SIZE",length:t};throw e}))}))}))}))}},remove:function(t,n){return function(i,a){var o=(a=a||{}).wallet||a.walletId&&b.children.get(a.walletId)||b;return(o.isAuth()?e.when(o.data):o.auth({silent:!0,minData:!0})).then((function(e){var a={version:2,index:t,type:n,id:i,issuer:e.pubkey,time:moment().utc().unix()},o=JSON.stringify(a);return l.util.hash(o).then((function(t){return l.sign(t,e.keypair).then((function(e){return o='{"hash":"{0}","signature":"{1}",'.format(t,e)+o.substring(1),O.post("/history/delete")(o).then((function(e){return e}))}))}))}))}},count:function(e,t,n){var i=O.get("/{0}/{1}/_search?size=0".format(e,t),n);return function(e){return i(e).then((function(e){return e&&e.hits&&e.hits.total}))}}},image:{fromAttachment:function(e){if(!e||!e._content_type||!e._content||0===e._content.length)return null;var t={src:"data:"+e._content_type+";base64,"+e._content};return e._title&&(t.title=e._title),e._name&&(t.name=e._name),t},toAttachment:function(e){if(!e||!e.src)return null;var t=R.IMAGE_SRC.exec(e.src);if(!t)return null;var n={_content_type:t[1],_content:t[2]};return e.title&&(n._title=e.title),e.name&&(n._name=e.name),n}},hit:{empty:function(){return{_id:null,_index:null,_type:null,_version:null,_source:{}}}},util:{parseTags:w,parseAsHtml:function(e,t){var n=e?function(e){return e?e.replace(/</g,"&lt;").replace(/>/g,"&gt;"):e}(e.trim()):void 0;if(n){(t=t||{}).tagState=t.tagState||"app.wot_lookup.tab_search",t.uidState=t.uidState||"app.wot_identity_uid",!t.newLine&&angular.isDefined(t.newLine)||(n=n.replace(/\n/g,"<br>\n"));var i=function(e){for(var t=e&&R.URL.exec(e),n=t&&[];t;){var i=t[0];_.contains(n,i)||n.push(i),t=(e=e.substr(t.index+t[0].length+1))&&R.URL.exec(e)}return n}(n);_.forEach(i,(function(e){var t=e.startsWith("http://")||e.startsWith("https://")?e:"http://"+e,i='<a on-tap="openLink($event, \'{0}\')" href="{1}" target="_blank">{2}</a>'.format(t,t,S(e));n=n.replace(e,i)}));var a=w(n);_.forEach(a,(function(e){var i="<a ui-sref=\"{0}({hash: '{1}'})\">#{2}</a>".format(t.tagState,e,e);n=n.replace("#"+e,i)}));var o=w(n,"@");_.forEach(o,(function(e){var i="<a ui-sref=\"{0}({uid: '{1}'})\">@{2}</a>".format(t.uidState,e,e);n=n.replace("@"+e,i)}));var r=function(e,t,n){for(var i=k("(?:^|[\\r\\s])("+(t=t||"##")+"([^#></]+)<br>)"),a=e&&i.exec(e),o=a&&[],r=a&&[];a;){var s=a[1];_.contains(o,s)||(o.push(s),r.push({line:s,title:a[2]})),a=(e=e.substr(a.index+a[1].length+1)).length>0&&i.exec(e)}return r}(n,"#+[ ]*");_.forEach(r,(function(e){var t=e.line.lastIndexOf("#",5)+1;n=n.replace(e.line,"<h{0}>{1}</h{2}>".format(t,e.title,t))}))}return n},findObjectInTree:function e(t,n){if(t)return t[n]?t[n]:Array.isArray(t)?t.reduce((function(t,i){return t||e(i,n)}),!1):"object"==typeof t?_.reduce(_.keys(t),(function(i,a){return i||e(t[a],n)}),!1):void 0}},constants:N};U.constants.regexp=R,angular.merge(O,U)}h&&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,t,n,i){return new T(e,t,n,i)},v.lightInstance=function(e,t,n,i){function a(n,i){return d.get(e,t,n)(i).then((function(e){return e&&e.hits&&e.hits.total}))}return t=t||80,n=angular.isDefined(n)?n:443==+t,{host:e,port:t,useSsl:n,node:{summary:d.getWithCache(e,t,"/node/summary",n,d.cache.LONG,!1,i)},network:{peering:{self:d.get(e,t,"/network/peering",n,i)},peers:d.get(e,t,"/network/peers",n,i)},blockchain:{current:d.get(e,t,"/blockchain/current?_source=number,hash,medianTime",n,i)},record:{count:function(e,t){return a("/{0}/{1}/_search?size=0".format(e,t))}},subscription:{count:function(e){return a("/subscription/record/_search?size=0&q="+_.keys(e||{}).reduce((function(t,n){return(t&&t+" AND "||"")+n+":"+e[n]}),""))}}}},v}]),angular.module("cesium.es.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esSettings")}]).factory("esSettings",["$rootScope","$q","$timeout","Api","esHttp","csConfig","csSettings","CryptoUtils","Device","UIUtils","csWallet",function(e,t,n,i,a,o,r,s,l,c,d){var u,p,m={includes:["locale","showUDHistory","useRelative","useLocalStorage","useLocalStorageEncryption","expertMode","logoutIdle","blockValidityWindow"],excludes:["timeout","cacheTimeMs","version","build","minVersion","fallbackLanguage"],plugins:{es:{excludes:["enable","host","port","useSsl","fallbackNodes","enableGoogleApi","googleApiKey","document","maxUploadBodySize","defaultCountry"],notifications:{}}},wallet:{includes:["alertIfUnusedWallet"],excludes:["notificationReadTime"]},helptip:{excludes:["installDocUrl"]},notifications:{excludes:["time","warnCount","unreadCount"]}},E=angular.merge({plugins:{es:{askEnable:!1,useRemoteStorage:!0,latestReleaseUrl:"https://api.github.com/repos/duniter/cesium-plus-pod/releases/latest",notifications:{txSent:!0,txReceived:!0,certSent:!0,certReceived:!0,emitHtml5:!1},invitations:{readTime:!0},defaultCountry:void 0,enableGoogleApi:!1,googleApiKey:void 0,wot:{enableMixedSearch:!0},document:{index:"user,page,group",type:"profile,record,comment"},registry:{defaultSearch:{location:null,geoPoint:null}},geoDistance:"20km"}}},{plugins:{es:o.plugins&&o.plugins.es||{}}}),b=this,g=new i("esSettings"),f=!1,h=!1;function T(e,n){return n=n||t.defer(),angular.merge(e,E),h=!1,n.resolve(e),n.promise}function v(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair&&e.keypair.signSk&&e.keypair.boxSk?(console.debug("[ES] [settings] Loading user settings..."),function(e,t){var n=Date.now();return b.get({id:e}).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e})).then((function(e){if(e&&e._source){var i=e._source;if(i.time!==r.data.time){var a=s.util.decode_base58(i.nonce);return s.box.open(i.content,a,t.boxPk,t.boxSk).then((function(e){var t=JSON.parse(e||"{}");return t.time=i.time,console.debug("[ES] [settings] Loaded and decrypted in "+(Date.now()-n)+"ms"),t})).catch((function(e){return console.error("[ES] [settings] Could not load remote settings: "+(e&&e.message||"decryption error")),delete r.data.time,null}))}console.debug("[ES] [settings] Loaded in "+(Date.now()-n)+"ms, but already up to date")}}))}(e.pubkey,e.keypair).then((function(e){if(e)return angular.merge(r.data,e),u=e,console.debug("[ES] [settings] Applied"),O()})).then((function(){n.resolve(e)})).catch((function(e){n.reject(e)})),n.promise):(n.resolve(),n.promise)}function I(e){if(!f){var n=p&&p.length>0;!a.isStarted()||a.node.isFallback()||a.node.sameAsSettings(e)||(N(),a.stop()),R(),b.isEnable()&&d.isAuth()&&(n?function(e){var n=function e(t,n){var i={};return n.includes&&_.forEach(_.keys(n),(function(e){"includes"!=e&&"excludes"!=e&&n.includes.push(e)})),_.forEach(_.keys(t),(function(a){n.includes&&!_.contains(n.includes,a)||n.excludes&&_.contains(n.excludes,a)||(t[a]&&"object"==typeof t[a]&&n[a]&&"object"==typeof n[a]?i[a]=e(t[a],n[a]):i[a]=t[a])})),i}(e,m);if(u&&angular.equals(n,u))return t.when();if(!r.data.plugins.es.useRemoteStorage)return O();var i=moment().utc().unix();console.debug("[ES] [settings] Saving user settings remotely..."),t.all([d.getKeypair(),s.util.random_nonce()]).then((function(t){var a=t[0],o=t[1];if(a.boxPk&&a.boxSk){var r={issuer:d.data.pubkey,nonce:s.util.encode_base58(o),time:i},l=JSON.stringify(n);return s.box.pack(l,o,a.boxPk,a.boxSk).then((function(t){return r.content=t,angular.isUndefined(e.time)?b.add(r):b.update(r,{id:r.issuer}).catch((function(e){if(e&&404==e.ucode)return b.add(r);throw e}))})).then((function(){return!0}))}})).then((function(t){if(t)return e.time=i,u=n,console.debug("[ES] [settings] Saved user settings remotely in "+(moment().utc().unix()-i)+"ms"),O()})).catch((function(e){throw console.error(e),e}))}(e):v(d.data))}}function O(){return f?t.when():(f=!0,r.store().then((function(){f=!1})).catch((function(e){throw f=!1,e})))}function N(){_.forEach(p,(function(e){e()})),p=[]}function R(){var t=b.isEnable();return!t&&p&&p.length>0?(console.debug("[ES] [settings] Disable"),N(),a.stop().then((function(){g.state.raise.changed(t)}))):!t||p&&0!==p.length&&a.isStarted()?void 0:a.start().then((function(n){return n?(console.debug("[ES] [settings] Enable"),function(){p=[r.api.data.on.reset(e,T,this),d.api.data.on.auth(e,v,this)]}(),d.isAuth()?v(d.data).then((function(){g.state.raise.changed(t)})):void g.state.raise.changed(t)):(r.data.plugins.es.enable=!1,r.data.plugins.es.askEnable=!0,h=!0,g.state.raise.changed(!1),void console.error("[ES] [settings] Disable, has ES node could not be started"))}))}return b.api=g,b.get=a.get("/user/settings/:id"),b.add=a.record.post("/user/settings"),b.update=a.record.post("/user/settings/:id/_update"),b.isEnable=function(){return r.data.plugins&&r.data.plugins.es&&r.data.plugins.es.enable&&!!r.data.plugins.es.host},b.notifications={},b.notifications.isEmitHtml5Enable=function(){return!!(b.isEnable()&&r.data.plugins.es.notifications&&angular.isDefined(r.data.plugins.es.notifications.emitHtml5))&&r.data.plugins.es.notifications.emitHtml5},b.wot={},b.wot.isMixedSearchEnable=function(){return b.isEnable()&&(!angular.isDefined(r.data.plugins.es.wot&&r.data.plugins.es.wot.enableMixedSearch)||r.data.plugins.es.wot.enableMixedSearch)},g.registerEvent("state","changed"),r.ready().then((function(){return r.api.data.on.changed(e,I,this),a.api.node.on.stop(e,(function(){u=null}),this),R()})).then((function(){if(!h&&o.plugins&&o.plugins.es&&o.plugins.es.askEnable&&!b.isEnable()&&r.data.plugins.es.askEnable)return c.alert.confirm("ES_SETTINGS.CONFIRM.ASK_ENABLE","ES_SETTINGS.CONFIRM.ASK_ENABLE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then((function(e){return e&&(r.data.plugins.es.enable=!0),r.data.plugins.es.askEnable=!1,r.store()}))})),b}]),angular.module("cesium.es.registry.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.like.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esRegistry")}]).factory("esRegistry",["$rootScope","$q","csPlatform","csSettings","csWallet","csWot","esHttp","esComment","esLike","esGeo",function(e,t,n,i,a,o,r,s,l,c){var d,u={commons:["title","description","issuer","time","address","city","creationTime","avatar._content_type","picturesCount","type","category","socials","pubkey","geoPoint"]},p=this;function m(e){e.pages=null}function E(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [registry] Loading pages count..."),p.raw.count({pubkey:e.pubkey}).then((function(t){e.pages=e.pages||{},e.pages.count=t&&t.hits&&t.hits.total,console.debug("[ES] [registry] Loaded pages count ("+e.pages.count+")"),n.resolve(e)})).catch((function(t){console.error("[ES] [registry] Error while counting page: "+(t.message?t.message:t)),n.resolve(e)})),n.promise):(n.resolve(),n.promise)}function b(){if(p.raw.categories&&p.raw.categories.length){var e=t.defer();return e.resolve(p.raw.categories),e.promise}return p.raw.category.all().then((function(e){if(0===e.hits.total)p.raw.categories=[];else{var t=e.hits.hits.reduce((function(e,t){var n=t._source;return n.id=t._id,e.concat(n)}),[]);_.forEach(t,(function(e){t[e.id]=e})),p.raw.categories=t}return p.raw.categories}))}function g(e,t){if(e){var n=e._source;return n.category&&n.category.id&&(n.category=t[n.category.id]),e.highlight&&(e.highlight.title&&(n.title=e.highlight.title[0]),e.highlight.description&&(n.description=e.highlight.description[0]),e.highlight.location&&(n.location=e.highlight.location[0]),e.highlight.tags&&(n.tags=e.highlight.tags.reduce((function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))}),[]))),n.avatar=r.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(n.pictures=e._source.pictures.reduce((function(e,t){return e.concat(r.image.fromAttachment(t.file))}),[])),n}}function f(){var t=r.alive;if(!t&&d&&d.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(d,(function(e){e()})),d=[],a.isLogin())return m(a.data)}else if(t&&(!d||0===d.length)&&(console.debug("[ES] [subscription] Enable"),function(){d=[a.api.data.on.load(e,E,this),a.api.data.on.init(e,m,this),a.api.data.on.reset(e,m,this)]}(),a.isLogin()))return E(a.data)}return p.raw={count:r.get("/page/record/_search?size=0&q=issuer::pubkey"),searchText:r.get("/page/record/_search?q=:search"),search:r.post("/page/record/_search"),get:r.get("/page/record/:id"),getCommons:r.get("/page/record/:id?_source="+u.commons.join(",")),category:{get:r.get("/page/category/:id"),all:r.get("/page/category/_search?sort=order&from=0&size=1000&_source=name,parent")}},n.ready().then((function(){return r.api.node.on.start(e,f,this),r.api.node.on.stop(e,f,this),f()})),p.category={all:b,get:function(e){return p.raw.category.get(e).then((function(e){var t=e._source;return t.id=e._id,t}))}},p.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:{}}},t.all([b(),p.raw.search(e)]).then((function(t){var n=t[0];if(!(t=t[1])||!t.hits||!t.hits.total)return{total:0,hits:[]};var i=r.util.findObjectInTree(e.query,"geo_distance"),a=i&&i.geoPoint,o=i&&i.distance&&i.distance.replace(new RegExp("[0-9 ]+","gm"),""),s=t.hits.hits.reduce((function(e,t){var i=g(t,n);return i.id=t._id,a&&i.geoPoint&&o&&(i.distance=c.point.distance(a.lat,a.lon,i.geoPoint.lat,i.geoPoint.lon,o)),e.concat(i)}),[]);return{total:t.hits.total,hits:s}}))},load:function(e,n){return(n=n||{}).raw=!!angular.isDefined(n.raw)&&n.raw,n.fecthPictures=angular.isDefined(n.fetchPictures)?n.fetchPictures:n.raw,t.all([b(),n.fecthPictures?p.raw.get({id:e}):p.raw.getCommons({id:e})]).then((function(e){var t=e[0],i=e[1],a=g(i,t);return n.raw||(a.description=r.util.parseAsHtml(a.description,{tagState:"app.wot_lookup.tab_registry"})),o.extend({pubkey:a.issuer}).then((function(e){return{id:i._id,issuer:e,record:a}}))}))},add:r.record.post("/page/record",{tagFields:["title","description"],creationTime:!0}),update:r.record.post("/page/record/:id/_update",{tagFields:["title","description"]}),remove:r.record.remove("page","record"),fields:{commons:u.commons},picture:{all:r.get("/page/record/:id?_source=pictures")},like:l.instance("page","record"),comment:s.instance("page")},p.currency={all:r.get("/currency/record/_search?_source=currencyName,peers.host,peers.port"),get:r.get("/currency/record/:id/_source")},p}]),angular.module("cesium.es.social.services",["cesium.es.crypto.services"]).factory("SocialUtils",["$filter","$q","CryptoUtils","BMA","csWallet","esCrypto","$timeout",function(e,t,n,i,a,o,r){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 l(e){return new RegExp("^"+e+"$")}function c(e){var t;if(s.URI.test(e)){var n=s.URI.exec(e)[1],i=e;if("http"==n||"https"==n){var a=e.indexOf("/",n.length+3);a>0&&(i=e.substring(0,a))}_.keys(s.socials).forEach((function(e){if(s.socials[e].test(i))return t=e,!1})),t||(t="web")}else s.EMAIL.test(e)?t="email":s.PHONE.test(e)&&(t="phone");return t||console.warn("[ES] [social] Unable to detect type of social URL: "+e),t}function d(e){if((e=e?e.trim():e)&&e.length>0)return e.startsWith("www.")&&(e="http://"+e),{type:c(e),url:e}}function u(t){if(!t||!t.length)return[];var n={};return t.forEach((function(t){if("curve25519"==t.type?(delete t.issuer,t.valid&&angular.merge(t,d(t.url))):t=d(t.url),t){var i=e("formatSlug")(t.url);n[i]=t}})),_.values(n)}return s.URI=l(s.URI),s.EMAIL=l(s.EMAIL),s.PHONE=l(s.PHONE),_.keys(s.socials).forEach((function(e){s.socials[e]=l(s.socials[e])})),{get:d,reduce:u,createForEncryption:function(e,t){return{recipient:e,type:"curve25519",url:t}},open:function e(i,l,c){if(c=c||a.data.pubkey,!n.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),r((function(){return e(i,l,c)}),100);var d=_.filter(i||[],(function(e){var t=e.url&&"curve25519"==e.type&&s.socials.curve25519.exec(e.url);return!!t&&(e.recipient=t[1],e.nonce=t[2],e.url=t[3],e.issuer=l,e.valid=e.recipient===c,e.valid)}));return d.length?o.box.open(d,void 0,"issuer","url").then((function(){return u(i)})):t.when(u(i))},pack:function e(i){if(!n.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),r((function(){return e(i)}),100);var a=_.filter(i||[],(function(e){return"curve25519"==e.type&&e.url&&e.recipient}));return a.length?n.util.random_nonce().then((function(e){return t.all(a.reduce((function(t,n){return t.concat(o.box.pack(n,void 0,"recipient","url",e))}),[]))})).then((function(e){return e.reduce((function(e,t){return e.concat({type:"curve25519",url:"curve25519://{0}:{1}@{2}".format(t.recipient,t.nonce,t.url)})}),[])})):t.when(i)}}}var l=s();return l.instance=s,l}]),angular.module("cesium.es.crypto.services",["ngResource","cesium.services"]).factory("esCrypto",["$q","$rootScope","CryptoUtils",function(e,t,n){function i(t){if(!t)throw new Error("Missing keypair");return t.boxPk&&t.boxSk?e.when(t):e.all([n.box.keypair.skFromSignSk(t.signSk),n.box.keypair.pkFromSignPk(t.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{box:{getKeypair:i,pack:function(t,a,o,r,s){if(!t[o=o||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(r=r||"content")&&(r=[r]),t=angular.copy(t);var l=n.util.decode_base58(t[o]);return e.all([i(a),n.box.keypair.pkFromSignPk(l),s?e.when(s):n.util.random_nonce()]).then((function(i){var a=i[0].boxSk,o=i[1],s=i[2];return e.all(r.reduce((function(e,i){return t[i]?e.concat(n.box.pack(t[i],s,o,a)):e}),[])).then((function(e){var i=0;return _.forEach(r,(function(n){t[n]?t[n]=e[i++]:t[n]=null})),t.nonce=n.util.encode_base58(s),t}))}))},open:function(t,a,o,r){o=o||"issuer","string"==typeof(r=r||"content")&&(r=[r]);var s=Date.now(),l={},c=[i(a)];return e.all(t.reduce((function(e,t){var i=t[o];if(!i)throw"Record has no "+o;return l[i]?res:e.concat(n.box.keypair.pkFromSignPk(n.util.decode_base58(i)).then((function(e){l[i]=e})))}),c)).then((function(i){var a=i[0];return e.all(t.reduce((function(e,t){var i=l[t[o]],s=n.util.decode_base58(t.nonce);return t.valid=!0,e.concat(r.reduce((function(e,o){return t[o]?e.concat(n.box.open(t[o],s,i,a.boxSk).then((function(e){t[o]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+o),t.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+(Date.now()-s)+"ms"),t}))}}}}]),angular.module("cesium.es.profile.services",["cesium.services","cesium.es.http.services","cesium.es.like.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esProfile")}]).factory("esProfile",["$rootScope","$q","esHttp","SocialUtils","csWot","csWallet","csCache","csPlatform","esSettings","esLike",function(e,t,n,i,a,o,r,s,l,c){var d,u=this;function p(e,t){return((t=t||{}).raw?u.raw.getAll:u.raw.get)({id:e}).then((function(a){if(a&&a.found&&a._source){var r={name:a._source.title,source:a._source};return r.name&&r.name.length>30&&(r.name=r.name.substr(0,27)+"..."),r.avatar=n.image.fromHit(a,"avatar"),!t.raw&&r.source.description&&(r.descriptionHtml=n.util.parseAsHtml(r.source.description)),r.source.socials&&r.source.socials.length&&(r.source.socials=_.uniq(r.source.socials,!1,(function(e){return e.url}))),o.isLogin()?i.open(r.source.socials,e).then((function(){return r})):(r.source.socials=_.filter(r.source.socials,(function(e){return"curve25519"!==e.type})),r)}})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))}function m(e,t){return E(null,e,t)}function E(e,i,a,o){if(o=o||t.defer(),!(e||i&&i.length))return o.resolve(i),o.promise;var r;a=a||"pubkey";var s,c=(e=e?e.toLowerCase().trim():e)?n.util.parseTags(e):void 0,d={query:{},highlight:{fields:{title:{},tags:{}}},from:0,size:100,_source:["title","avatar._content_type"]},p=e&&l.wot.isMixedSearchEnable();if(p&&(d._source=d._source.concat(["description","city","creationTime","membersCount","type"]),console.debug("[ES] [profile] Mixed search: enable")),i.length>0){r={},_.forEach(i,(function(e){var t=e[a];if(t){var n=r[t];n?n.push(e):(n=[e],r[t]=n)}}));var m=_.keys(r);d.size=m.length<=d.size?d.size:m.length,e?(d.query.bool={should:[{terms:{"_id^4":m}},{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},c&&d.query.bool.should.push({terms:{tags:c}})):(delete d.highlight,d.query.constant_score={filter:{terms:{_id:m}}})}else{if(!e)return o.resolve(i),o.promise;d.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},c&&d.query.bool.should.push({terms:{tags:c}})}return e&&p&&(d.indices_boost={user:100,page:1,group:.01}),(p?u.raw.mixedSearch:u.raw.search)(d).then((function(e){if((s=e.hits).total>0){var t,l={};_.forEach(s.hits,(function(e){var o="avatar";if("user"==e._index){if(!(t=r&&r[e._id])){var s={};s[a]=e._id,t=[s],i.push(s)}}else if("user"!=e._index){l[e._index]||(l[e._index]=!0,i.push({id:"divider-"+e._index,divider:!0,index:e._index}));var c={id:e._index+"-"+e._id,index:e._index,templateUrl:"plugins/es/templates/wot/lookup_item_{0}.html".format(e._index),state:"app.view_{0}".format(e._index),stateParams:{id:e._id,title:e._source.title},creationTime:e._source.creationTime,memberCount:e._source.memberCount,type:e._source.type};t=[c],i.push(c),o="avatar"}var d=n.image.fromHit(e,o);_.forEach(t,(function(t){t.avatar=d,function(e,t,i){e.avatar=e.avatar||n.image.fromHit(t,"avatar"),e.name=t._source.title,e.name&&e.name.length>30&&(e.name=e.name.substr(0,27)+"..."),e.description=t._source.description||e.description,e.city=t._source.city||e.city,t.highlight&&(t.highlight.title&&(e.name=t.highlight.title[0]),t.highlight.tags&&(e.tags=t.highlight.tags.reduce((function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))}),[])))}(t,e)}))})),_.keys(l).length&&i.splice(0,0,{id:"divider-identities",divider:!0,index:"profile"})}o.resolve(i)})).catch((function(e){e&&e.ucode&&404==e.ucode?o.resolve(i):o.reject(e)})),o.promise}function b(e,n){return n=n||t.defer(),e&&e.pubkey?(console.debug("[ES] [profile] Extending identity {{0}} ...".format(e.pubkey.substr(0,8))),t.all([p(e.pubkey).then((function(t){t?(e.name=t.name,e.avatar=t.avatar,e.profile=e.profile||{},angular.merge(e.profile,t.source,{descriptionHtml:t.descriptionHtml})):(e.name=null,e.avatar=null,e.profile=null),n.resolve(e)})),m((e.received_cert||[]).concat(e.received_cert_pending||[]).concat(e.given_cert||[]).concat(e.given_cert_pending||[]))]).catch((function(e){n.reject(e)})),n.promise):(n.resolve(),n.promise)}function g(){var t=n.alive;!t&&d&&d.length>0?(console.debug("[ES] [profile] Disable"),_.forEach(d,(function(e){e()})),d=[]):!t||d&&0!==d.length||(console.debug("[ES] [profile] Enable"),function(){d=[a.api.data.on.load(e,b,this),a.api.data.on.search(e,E,this)]}())}return u.raw={getFields:n.get("/user/profile/:id?&_source_exclude=avatar._content&_source=:fields"),get:n.get("/user/profile/:id?&_source_exclude=avatar._content",r.constants.MEDIUM),getAll:n.get("/user/profile/:id",r.constants.MEDIUM),search:n.post("/user/profile/_search",r.constants.MEDIUM),mixedSearch:n.post("/user,page,group/profile,record/_search",r.constants.MEDIUM),remove:n.record.remove("user","profile")},s.ready().then((function(){return n.api.node.on.start(e,g,this),n.api.node.on.stop(e,g,this),g()})),{getAvatarAndName:function(e){return u.raw.getFields({id:e,fields:"title,avatar._content_type"}).then((function(e){var t;return e&&e._source&&((t={name:e._source.title}).avatar=n.image.fromHit(e,"avatar")),t})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))},get:p,add:n.record.post("/user/profile",{tagFields:["title","description"],ignoreFields:["enableGeoPoint","descriptionHtml","moderator"]}),update:n.record.post("/user/profile/:id/_update",{tagFields:["title","description"],ignoreFields:["enableGeoPoint","descriptionHtml","moderator"]}),remove:function(e,t){return u.raw.remove(e,t).then((function(e){return r.clear("csWot-"),r.clear("csWot-"),e}))},avatar:n.get("/user/profile/:id?_source=avatar"),fillAvatars:m,like:c.instance("user","profile")}}]),angular.module("cesium.es.notification.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esNotification")}]).factory("esNotification",["$rootScope","$q","$timeout","$translate","$state","csHttp","csConfig","csSettings","esHttp","esSettings","csWallet","csWot","UIUtils","filterTranslations","BMA","CryptoUtils","csPlatform","Api",function(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b,g,f){var h,T,v={MESSAGE_CODES:["MESSAGE_RECEIVED"],INVITATION_CODES:["INVITATION_TO_CERTIFY"],DEFAULT_LOAD_SIZE:20},I={commons:["type","code","params","reference","recipient","time","hash","read_signature"]},O=this,N=new f(this,"esNotification");function R(e,t){(t=t||{}).codes=t.codes||{},t.codes.excludes=t.codes.excludes||v.EXCLUDED_CODES;var n={bool:{must:[{term:{recipient:e}}]}};if(t.codes&&t.codes.includes)n.bool.must.push({terms:{code:t.codes.includes}});else{var i=[];s.getByPath("plugins.es.notifications.txSent",!1)||i.push("TX_SENT"),s.getByPath("plugins.es.notifications.txReceived",!0)||i.push("TX_RECEIVED"),s.getByPath("plugins.es.notifications.certSent",!1)||i.push("CERT_SENT"),s.getByPath("plugins.es.notifications.certReceived",!0)||i.push("CERT_RECEIVED"),t.codes.excludes&&_.forEach(t.codes.excludes,(function(e){i.push(e)})),i.length&&(n.bool.must_not={terms:{code:i}})}return t.readTime&&n.bool.must.push({range:{time:{gt:t.readTime}}}),n}function A(e,n){if(!e)return t.reject("[ES] [notification] Unable to load - missing pubkey");var i={query:R(e,n)};return i.query.bool.must.push({missing:{field:"read_signature"}}),O.raw.postCount(i).then((function(e){return e.count}))}function S(e){var t=(e=e||{}).wallet||d;return new Promise((function(e){if(!t.data||!t.data.events||!t.data.events.length)return e([]);var n=o.date.now()-m.MEDIAN_TIME_OFFSET;e((t.data.events||[]).reduce((function(e,i){if("warn"!==i.type&&"error"!==i.type)return e;var a=new j({},(function(e){e.read||(e.read=!0,t.data.notifications&&t.data.notifications.warnCount>0&&t.data.notifications.warnCount--)}));return a.id=i.code,a.time=n,a.read=!1,a.state="app.view_wallet",a.avatarIcon="ion-alert-circled",a.icon="ion-alert-circled assertive",a.message=i.message,a.messageParams=i.messageParams,e.concat(a)}),[]))}))}function C(t){if(t&&d.isLogin())if(_.contains(v.INVITATION_CODES,t.code))N.event.raise.newInvitation(t);else{if(!_.contains(v.MESSAGE_CODES,t.code)){var n=new j(t,k);return n.id=t.id||n.id,u.extendAll([n]).then((function(){e.$$phase?L(n):e.$applyAsync((function(){L(n)}))})).then((function(){if(c.notifications.isEmitHtml5Enable())return y(n)}))}N.event.raise.newMessage(t)}}function L(e){return d.data.notifications=d.data.notifications||{},d.data.notifications.unreadCount++,N.data.raise.new(e),e}function D(e){return e?String(e).replace(/<[^>]*>/gm,"").replace(/&[^;]+;/gm,""):""}function y(n,o){t.all([i(o||"COMMON.NOTIFICATION.TITLE"),i(n.message,n)]).then((function(t){P(D(t[0]),{body:D(t[1]),icon:n.avatar&&n.avatar.src||"./img/logo.png",lang:i.use(),tag:n.id,onclick:function(){e.$applyAsync((function(){"function"==typeof n.markAsRead&&n.markAsRead(),n.state&&a.go(n.state,n.stateParams)}))}})}))}function P(e,t){if("Notification"in window)if("granted"===Notification.permission){var n=new Notification(e,t);n.onclick=t.onclick||n.onclick}else"denied"!==Notification.permission&&Notification.requestPermission((function(n){"granted"===n&&P(e,t)}))}function k(e){if(!e.read&&e.id)if(e.id){if(d.isAuth())return e.read=!0,d.getKeypair().then((function(t){return b.sign(e.hash,t).then((function(t){return O.raw.postReadById(t,{id:e.id})})).catch((function(e){console.error("[ES] [notification] Error while trying to mark event as read.",e)}))}))}else console.error("[ES] [notification] Could not mark as read: no 'id' found!",e)}function M(e){e.notifications=e.notifications||{},e.notifications.unreadCount=null,e.notifications.warnCount=null,e.notifications.time=null,T&&(console.debug("[ES] [notification] Closing websocket..."),T(),T=null)}function w(e,i){if(i=i||t.defer(),!e||!e.pubkey||!e.keypair)return n((function(){i.resolve(e)})),i.promise;var a=Date.now(),o=Math.trunc(a/1e3);if(e.notifications&&e.notifications.time&&o-e.notifications.time<30)return e.notifications.warnCount=x(e),console.debug("[ES] [notification] Skipping load (loaded "+(o-e.notifications.time)+"s ago)"),n((function(){i.resolve(e)})),i.promise;var r=d.isUserPubkey(e.pubkey);return console.debug("[ES] [notification] Loading count..."+e.pubkey.substr(0,8)),A(e.pubkey,{readTime:e.notifications&&e.notifications.time||0,excludeCodes:v.EXCLUDED_CODES}).then((function(t){e.notifications=e.notifications||{},e.notifications.unreadCount=t,e.notifications.warnCount=x(e),t>0&&c.notifications.isEmitHtml5Enable()&&r&&n((function(){y({message:"COMMON.NOTIFICATION.HAS_UNREAD",count:t,state:"app.view_notifications"},e.ui||e.name||e.pubkey&&e.pubkey.substr(0,8))}),500),console.debug("[ES] [notification] Loaded count ("+t+") in "+(Date.now()-a)+"ms"),i.resolve(e)})).catch((function(t){console.error("Error while counting notification: "+(t.message?t.message:t)),i.resolve(e)})),i.promise}function U(e,t){return w(e,t).then((function(){console.debug("[ES] [notification] Starting listen user event...");var t=O.raw.ws.getUserEvent();t.on(C,{pubkey:e.pubkey,locale:s.data.locale.id}).catch((function(e){console.error("[ES] [notification] Unable to listen user event",e),p.alert.error("ACCOUNT.ERROR.WS_CONNECTION_FAILED")})),T=function(){t.close()}}))}function x(e){return e.events?e.events.reduce((function(e,t){return"warn"==t.type?e+1:e}),0):0}function B(){var t=l.alive;if(!t&&h&&h.length>0)console.debug("[ES] [notification] Disable"),_.forEach(h,(function(e){e()})),h=[],d.isLogin()&&M(d.data);else if(t&&(!h||0===h.length)&&(console.debug("[ES] [notification] Enable"),function(){h=[d.api.data.on.login(e,U,this),d.api.data.on.load(e,w,this),d.api.data.on.init(e,M,this),d.api.data.on.reset(e,M,this)]}(),d.isLogin()))return U(d.data)}return v.EXCLUDED_CODES=v.MESSAGE_CODES.concat(v.INVITATION_CODES),O.raw={postCount:l.post("/user/event/_count"),postSearch:l.post("/user/event/_search"),postReadById:l.post("/user/event/:id/_read"),ws:{getUserEvent:l.ws("/ws/event/user/:pubkey/:locale"),getChanges:l.ws("/ws/_changes")}},N.registerEvent("data","new"),N.registerEvent("event","newInvitation"),N.registerEvent("event","newMessage"),g.ready().then((function(){return l.api.node.on.start(e,B,this),l.api.node.on.stop(e,B,this),B()})),O.load=function(e){if(!(e=e||{}).pubkey)return t.reject("[ES] [notification] Unable to load - missing options.pubkey");e.from=e.from||0,e.size=e.size||v.DEFAULT_LOAD_SIZE;var n={query:R(e.pubkey,e),sort:[{time:{order:"desc"}}],from:e.from,size:e.size,_source:I.commons};return t.all([S(e),O.raw.postSearch(n)]).then((function(e){var t=e[0]||[];if(!(e=e[1]).hits||!e.hits.total)return t;var n=e.hits.hits.reduce((function(e,t){var n=new j(t._source,k);return n.id=t._id,e.concat(n)}),t);return u.extendAll(n)}))},O.unreadCount=A,O.html5={emit:P},O.api=N,O.websocket={event:O.raw.ws.getUserEvent,change:O.raw.ws.getChanges},O.constants=v,O}]),angular.module("cesium.es.message.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esMessage")}]).factory("esMessage",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","esHttp","csWallet","esWallet","csWot","esNotification",function(e,t,n,i,a,o,r,s,l,c,d,u,p,m){var E,b={commons:["issuer","recipient","title","content","time","nonce","read_signature"],notifications:["issuer","time","hash","read_signature"]},g={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")},f=new a(this,"esMessage");function h(e){e.messages=e.messages||{},e.messages.unreadCount=null,e.messages.time=null}function T(e){e.messages&&delete e.messages}function v(t,i){if(i=i||e.defer(),!t||!t.pubkey)return n((function(){i.resolve(t)})),i.promise;var a=Date.now(),o=Math.trunc(a/1e3);return t.messages&&t.messages.time&&o-t.messages.time<30?(console.debug("[ES] [message] Skipping load (loaded "+(o-t.messages.time)+"s ago)"),n((function(){i.resolve(t)})),i.promise):(console.debug("[ES] [message] Loading count..."),function(e){var t=(e=e||{}).wallet||e.walletId&&d.children.get(e.walletId)||d,n=e.pubkey||t&&t.data&&t.data.pubkey;if(!n)throw new Error("no pubkey or wallet found in options, and user not connected.");var i={query:{bool:{must:[{term:{recipient:n}},{missing:{field:"read_signature"}}]}}};return c.post("/message/inbox/_count")(i).then((function(e){return e.count}))}({pubkey:t.pubkey}).then((function(e){t.messages=t.messages||{},t.messages.unreadCount=e,t.messages.time=o,console.debug("[ES] [message] Loaded count ("+e+") in "+(Date.now()-a)+"ms"),i.resolve(t)})).catch((function(e){console.error("Error while counting messages: "+(e.message?e.message:e)),i.resolve(t)})),i.promise)}function I(e,t){console.debug("[ES] [message] detected new message (from notification service)");var n=new j(e);if(n.issuer=n.pubkey,delete n.pubkey,n.issuer){if(!(t=t||n.issuer&&d.isUserPubkey(n.issuer)&&d||n.issuer&&d.children.getByPubkey(n.issuer)))throw new Error("No wallet for pubkey: {0}".format(n.issuer.substring(0,6)));p.extend(n,"issuer").then((function(){t.data.messages=t.data.messages||{},t.data.messages.unreadCount++,f.data.raise.new(n)}))}}function O(e,t,n,i){return n=n||"/message/inbox",u.box.record.pack(e,t,i,["title","content"]).then((function(e){return c.record.post(n)(e,{pubkey:e.issuer,keypair:t})}))}function N(e,t){e=e||d.data.pubkey,(t=t||{}).type=t.type||"inbox",t.from=t.from||0,t.size=t.size||1e3,t._source=t._source||b.commons;var n={sort:{time:"desc"},from:t.from,size:t.size,_source:t._source};return"inbox"==t.type?n.query={bool:{filter:{term:{recipient:e}}}}:n.query={bool:{filter:{term:{issuer:e}}}},g.postSearchByType(n,{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 R(t,n,i){var a=Date.now(),r={},s=[u.box.getKeypair(n)];return e.all(t.reduce((function(e,t){return r[t.issuer]?res:e.concat(o.box.keypair.pkFromSignPk(o.util.decode_base58(t.issuer)).then((function(e){r[t.issuer]=e})))}),s)).then((function(n){var a=n[0];return e.all(t.reduce((function(e,t){var n=r[t.issuer],s=o.util.decode_base58(t.nonce);return t.valid=!0,e.concat(o.box.open(t.title,s,n,a.boxSk).then((function(e){t.title=e})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher title"),t.valid=!1})),o.box.open(t.content,s,n,a.boxSk).then((function(e){t.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)+"..."))}(t):e&&(t.html=c.util.parseAsHtml(e))})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher content"),t.valid=!1})))}),[]))})).then((function(){return console.debug("[ES] [message] All messages decrypted in "+(Date.now()-a)+"ms"),t}))}function A(e){return _.sortBy(e,(function(e){return-1*(1e3*(e.titleMatch||0)+100*(e.contentMatch||0)+e.time/1e10)}))}function S(t){var n=s.developers||[{pubkey:"38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE"}];t&&t.content&&n&&n.length&&(console.info("[ES] [message] Sending logs to developers..."),t.issuer=d.data.pubkey,t.title=t.title||"Sending log",t.time=moment().utc().unix(),d.getKeypair().then((function(i){return e.all(n.reduce((function(e,n){return n.pubkey?e.concat(O(angular.merge({recipient:n.pubkey},t),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=[],d.isLogin()&&T(d.data)):!e||E&&0!==E.length||(console.debug("[ES] [message] Enable"),function(){E=[d.api.data.on.init(t,h,this),d.api.data.on.login(t,v,this),d.api.data.on.load(t,v,this),d.api.data.on.reset(t,T,this),m.api.event.on.newMessage(t,I,this),d.api.error.on.send(t,S,this)]}(),d.isLogin()&&v(d.data))}return f.registerEvent("data","new"),f.registerEvent("data","delete"),f.registerEvent("data","sent"),r.ready().then((function(){return c.api.node.on.start(t,C,this),c.api.node.on.stop(t,C,this),C()})),{api:f,search:g.postSearch,notifications:{load:function(t){(t=t||{}).from=t.from||0,t.size=t.size||10;var n=t.wallet||t.walletId&&d.children.get(t.walletId)||d;if(delete t.wallet,!n.isLogin())return e.when([]);var i={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:n.data.pubkey}}}},from:t.from,size:t.size,_source:b.notifications};return g.postSearch(i).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce((function(e,t){var n=t._source;return n.id=t._id,n.read=!!n.read_signature,delete n.read_signature,e.concat(n)}),[]);return p.extendAll(t,"issuer")}))}},load:function e(t){(t=t||{}).type=t.type||"inbox",t._source=b.commons,t.summary=!angular.isDefined(t.summary)||t.summary,t.filter=angular.isDefined(t.filter)?t.filter:void 0,t.from=t.from||0;var n=t.wallet||t.walletId&&d.children.get(t.walletId)||d;delete t.wallet;var i=n.auth().then((function(e){return N(e.pubkey,t).then((function(n){return R(n,e.keypair,t.summary)}))})).then((function(e){var n="inbox"==t.type?"issuer":"recipient";return p.extendAll(e,n)})).then((function(i){if(i.length&&t.filter){var a=function(e,t){return t&&!t.trim().length?e:(e.forEach((function(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim()||"")})),t.trim().split(" ").forEach((function(t){var n=new RegExp(t,"gi");e.forEach((function(e){var i=n.exec(e.title);if(i)for(e.title=e.title.replace(n,"<b>$&</b>"),e.titleMatch=(e.titleMatch||0)+1;(i=n.exec(e.title.substring(i.index+t.length)))&&!(e.titleMatch>=10);)e.titleMatch=e.titleMatch+1;else if(i=n.exec(e.summary)){for(i.index>140&&(e.summary="..."+e.summary.substring(i.index-20)),e.summary=e.summary.replace(n,"<b>$&</b>"),e.contentMatch=(e.contentMatch||0)+1;(i=n.exec(e.summary.substring(i.index+t.length)))&&!(e.contentMatch>=10);)e.contentMatch++;e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"...")}}))})),e=_.filter(e,(function(e){return e.titleMatch||e.contentMatch})))}(i,t.filter);if(a.length<i.length)return(t=angular.copy(t)).from+=t.size,t.size=i.length-a.length,t.wallet=n,e(t).then((function(e){return a.concat(e)}))}return 0!==t.from||t.filter||(n.data.messages=n.data.messages||{},n.data.messages.count=i.length),i}));return 0===t.from&&t.filter&&i.then(A),i},get:function(e,t,n){return t=t||"inbox",(n=n||{}).summary=!!angular.isDefined(n.summary)&&n.summary,(n.wallet||n.walletId&&d.children.get(n.walletId)||d).auth().then((function(i){return g.getByTypeAndId({id:e,type:t}).then((function(e){if(e.found){var a=e._source;return a.id=e._id,a.read="outbox"==t||!!a.read_signature,delete a.read_signature,R([a],i.keypair,n.summary).then((function(){var e="inbox"==t?"issuer":"recipient";return p.extend(a,e)}))}}))}))},send:function(e,t){var n=(t=t||{}).wallet||t.walletId&&d.children.get(t.walletId)||d;return delete t.wallet,e.issuer=e.issuer||n.data.pubkey,n.getKeypair().then((function(t){return O(e,t).then((function(n){return l.data.plugins.es.message&&angular.isDefined(l.data.plugins.es.message.outbox)&&!l.data.plugins.es.message.outbox?n:O(e,t,"/message/outbox","issuer").catch((function(e){return console.error("Failed to store message to outbox: "+e),n}))})).then((function(e){return f.data.raise.sent(e),e}))}))},remove:function(e,t,n){t=t||"inbox";var i=n.wallet||n.walletId&&d.children.get(n.walletId)||d;return c.record.remove("message",t)(e,{wallet:i}).then((function(n){return"inbox"===t&&(i.data.messages=i.data.messages||{},i.data.messages.count=i.data.messages.count>0?i.data.messages.count-1:0),i.isDefault()&&f.data.raise.delete(e),n}))},removeAll:function(t,n){t=t||"inbox";var i=n&&n.walletId&&d.children.get(n.walletId)||d;return i.auth().then((function(n){return N(n.pubkey,{type:t,from:0,size:1e3,_source:!1}).then((function(n){if(n&&n.length){var a=_.pluck(n,"id");return e.all(n.reduce((function(e,n){return e.concat(c.record.remove("message",t)(n.id,{wallet:i}))}),[])).then((function(){return a}))}})).then((function(e){"inbox"===t&&(i.data.messages=i.data.messages||{},i.data.messages.count=0,i.data.messages.unreadCount=0),i.isDefault()&&_.forEach(e,f.data.raise.delete)}))}))},markAsRead:function(t,n){var i=(n=n||{}).wallet||n.walletId&&d.children.get(n.walletId)||d,a=n&&n.type||(i.isUserPubkey(t.recipient)?"inbox":"outbox");if(t.read){var r=e.defer();return r.resolve(),r.promise}return t.read=!0,i.getKeypair().then((function(e){return o.sign(t.hash,e)})).then((function(e){return g.postReadById(e,{id:t.id})})).then((function(){"inbox"===a&&(i.data.messages=i.data.messages||{},i.data.messages.unreadCount=i.data.messages.unreadCount?i.data.messages.unreadCount-1:0)}))},markAllAsRead:function(t){var n=(t=t||{}).wallet||t.walletId&&d.children.get(t.walletId)||d;return n.auth().then((function(t){return N(t.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,t.keypair).then((function(e){return g.postReadById(e,{id:n.id})})))}),[]))})).then((function(){n.data.messages=n.data.messages||{},n.data.messages.unreadCount=0}))}))},fields:{commons:b.commons}}}]),angular.module("cesium.es.modal.services",["cesium.modal.services","cesium.es.message.services"]).factory("esModals",["$state","ModalUtils","UIUtils","csWallet",function(e,t,n,i){function a(){if(i.data.notifications.unreadCount=0,i.data.notifications&&i.data.notifications.history.length){var e=i.data.notifications.history[0],t=e?e.time:0;csSettings.data.wallet=csSettings.data.wallet||{},t&&csSettings.data.wallet.notificationReadTime!=t&&(csSettings.data.wallet.notificationReadTime=t,csSettings.store())}}return{showMessageCompose:function(e){return t.show("plugins/es/templates/message/modal_compose.html","ESMessageComposeModalCtrl",e,{focusFirstInput:!0})},showNotifications:function(t,i){return n.popover.show(i,{templateUrl:"plugins/es/templates/common/popover_notification.html",scope:t,autoremove:!1,afterHidden:a}).then((function(t){t&&(t.onRead&&"function"==typeof t.onRead&&t.onRead(),t.state&&e.go(t.state,t.stateParams))}))},showNewInvitation:function(e){return i.auth({minData:!0}).then((function(i){return n.loading.hide(),i.isMember?t.show("plugins/es/templates/invitation/modal_new_invitation.html","ESNewInvitationModalCtrl",e):n.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")}))},showNewPage:function(a){var o=a&&a.wallet||i;return o.auth({minData:!0}).then((function(){return n.loading.hide(),t.show("plugins/es/templates/registry/modal_record_type.html",void 0,{title:"REGISTRY.EDIT.TITLE_NEW"}).then((function(t){t&&e.go("app.registry_add_record",{type:t,wallet:o.id})}))}))},showNetworkLookup:function(e){return t.show("plugins/es/templates/network/modal_network.html","ESNetworkLookupModalCtrl",e,{focusFirstInput:!1})}}}]),angular.module("cesium.es.blockchain.services",["cesium.services","cesium.es.http.services"]).factory("esBlockchain",["$rootScope","$q","$timeout","BMA","csCache","esHttp",function(e,n,i,a,o,r){return s=a.constants.regexp.PUBKEY,40,"ES_CORE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))",l={SEARCH_FILTER:{TX_PUBKEY:new RegExp("\\(transactions\\.issuers:("+s+") OR transactions\\.outputs:\\*("+s+")\\)([ ]+AND)?"),ISSUER:new RegExp("issuer:("+s+")([ ]+AND)?"),MEMBER_FLOWS:new RegExp("\\(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded\\)([ ]+AND)?"),EXISTING_TRANSACTION:new RegExp("_exists_:transactions([ ]+AND)?"),PERIOD:new RegExp("medianTime:>=?([0-9]+)[ ]+AND[ ]+medianTime:<=?([0-9]+)([ ]+AND)?")},LAST_AND:/[ ]+AND$/},c={MINIMAL:["number","hash","medianTime","issuer"],COMMONS:["number","hash","medianTime","issuer","currency","version","powMin","dividend","membersCount","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions"]},(d={node:{},block:{},raw:{block:{search:r.post("/:currency/block/_search",o.constants.SHORT),searchText:r.get("/:currency/block/_search?q=:text"),get:r.get("/:currency/block/:number/_source",o.constants.SHORT)}},regexp:{ES_CORE_API_ENDPOINT:new RegExp("^ES_CORE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))$")}}).regex=d.regexp,d.node.parseEndPoint=function(e){var t=d.regexp.ES_CORE_API_ENDPOINT.exec(e);if(t)return{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80}},d.raw.block.processSearchResult=function(e,n){(n=n||{}).excludeCurrent=!angular.isDefined(n.excludeCurrent)||n.excludeCurrent,n.fillAvatar=!angular.isDefined(n.fillAvatar)||n.fillAvatar,n.cleanData=!angular.isDefined(n.cleanData)||n.cleanData;var i=!1;return{hits:(e&&e.hits&&e.hits.hits||[]).reduce((function(e,a){if("current"==a._id&&n.excludeCurrent)return i=!0,e;if(!a._source)return e;var o=new t(a._source);return n.cleanData&&o.cleanData(),e.concat(o)}),[]),took:e.took,total:e&&e.hits&&e.hits.total?i?e.hits.total-1:e.hits.total:0}},d.block.search=function(e,t){var n=t?angular.copy(t):{};return delete n.excludeCurrent,delete n.fillAvatar,delete n.skipData,n.from=n.from||0,n.size=n.size||40,n._source=t._source||c.COMMONS,t._source&&"*"==t._source&&delete n._source,d.raw.block.search(n,{currency:e}).then((function(e){return d.raw.block.processSearchResult(e,t)}))},d.block.searchText=function(e,t,n){n&&angular.isUndefined(n.excludeCurrent)&&(n.excludeCurrent=!0);var i=n?angular.copy(n):{};return delete i.excludeCurrent,delete i.fillAvatar,delete i.skipData,i.from=i.from||0,i.size=i.size||40,i._source=n._source||c.COMMONS.join(","),n._source&&"*"==n._source&&delete i._source,i.currency=e,i.text=t||"",d.raw.block.searchText(i).then((function(e){return d.raw.block.processSearchResult(e,n)}))},d.block.parseSearchText=function(e,t){var n=e;return{filters:t=_.keys(l.SEARCH_FILTER).reduce((function(e,t){var i=l.SEARCH_FILTER[t].exec(n);if(i){var a=i[0];n=n.replace(a,"");var o={type:t,text:a=a.replace(l.LAST_AND,""),params:i};return e.concat(o)}return e}),t||[]),text:n.trim()}},d;var s,l,c,d}]),angular.module("cesium.es.group.services",["cesium.platform","cesium.es.http.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.comment.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esGroup")}]).factory("esGroup",["$q","$rootScope","csPlatform","BMA","csSettings","esHttp","CryptoUtils","csWot","csWallet","esNotification","esComment",function(e,t,n,i,a,o,r,s,l,c,d){var u,p={list:["issuer","title","description","type","creationTime","avatar._content_type"],commons:["issuer","title","description","creationTime","time","signature"],notifications:["issuer","time","hash","read_signature"]},m={_internal:{}};function E(e){e.groups=e.groups||{},e.groups.unreadCount=null}function b(e){e.groups&&delete e.groups}function g(t,n){return n=n||e.defer(),t&&t.pubkey?(c.unreadCount(t.pubkey,{codes:{includes:["GROUP_INVITATION"],excludes:[]}}).then((function(e){t.groups=t.groups||{},t.groups.unreadCount=e,console.debug("[ES] [group] Detecting "+e+" unread notifications"),n.resolve(t)})).catch((function(e){console.error("Error while counting group notifications: "+(e.message?e.message:e)),n.resolve(t)})),n.promise):(n.resolve(),n.promise)}function f(e,t){if(e){var n=e._source;return t&&e.highlight&&(e.highlight.title&&(n.title=e.highlight.title[0]),e.highlight.description&&(n.description=e.highlight.description[0]),e.highlight.location&&(n.location=e.highlight.location[0]),e.highlight.tags&&(data.tags=e.highlight.tags.reduce((function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))}),[]))),t&&(n.description=o.util.parseAsHtml(n.description)),n.avatar=o.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(n.pictures=e._source.pictures.reduce((function(e,t){return e.concat(o.image.fromAttachment(t.file))}),[])),n}}function h(e){return m._internal.search(e).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce((function(e,t){var n=f(t,!0);return n.id=t._id,n?e.concat(n):e}),[]);return console.debug("[ES] [group] Loading {0} groups".format(t.length)),t}))}function T(e){return h({sort:{time:"desc"},from:(e=e||{}).from||0,size:e.size||50,_source:e._source||p.list})}function v(){var e=o.alive;!e&&u&&u.length>0?(console.debug("[ES] [group] Disable"),_.forEach(u,(function(e){e()})),u=[],l.isLogin()&&b(l.data)):!e||u&&0!==u.length||(console.debug("[ES] [group] Enable"),function(){u=[l.api.data.on.login(t,g,this),l.api.data.on.init(t,E,this),l.api.data.on.reset(t,b,this)]}(),l.isLogin()&&g(l.data))}return m._internal.search=o.post("/group/record/_search"),m._internal.get=o.get("/group/record/:id"),m._internal.getCommons=o.get("/group/record/:id?_source="+p.commons.join(",")),n.ready().then((function(){return o.api.node.on.start(t,v,this),o.api.node.on.stop(t,v,this),v()})),{record:{last:T,search:function(e){var t=(e=e||{}).text&&e.text.trim();if(!t)return T(e);var n={from:e.from||0,size:e.size||50,highlight:{fields:{title:{},tags:{}}},_source:e._source||p.list},a=[],o=[];return i.regexp.PUBKEY.test(t)?(o.push({term:{issuer:t}}),o.push({term:{pubkey:t}})):(t=t.toLowerCase(),a.push({multi_match:{query:t,fields:["title","description"],type:"phrase_prefix"}}),a.push({match:{title:t}}),a.push({match:{description:t}})),n.query={bool:{}},a.length>0&&(n.query.bool.should=a),o.length>0&&(n.query.bool.filter=o),h(n)},load:function(e,t){return(t=t||{}).fecthPictures=!!angular.isDefined(t.fetchPictures)&&t.fetchPictures,t.html=!angular.isDefined(t.html)||t.html,(t.fecthPictures?m._internal.get({id:e}):m._internal.getCommons({id:e})).then((function(e){var n=f(e,t.html);return s.extend({pubkey:n.issuer}).then((function(t){return{id:e._id,issuer:t,record:n}}))}))},add:o.record.post("/group/record",{tagFields:["title","description"]}),update:o.record.post("/group/record/:id/_update",{tagFields:["title","description"]}),remove:o.record.remove("group","record"),fields:{commons:p.commons},picture:{all:o.get("/group/record/:id?_source=pictures")},comment:d.instance("group")}}}]),angular.module("cesium.es.invitation.services",["cesium.platform","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esInvitation")}]).factory("esInvitation",["$rootScope","$q","$timeout","CryptoUtils","csPlatform","Api","esHttp","csWallet","esWallet","csWot","esNotification",function(e,t,n,i,a,o,r,s,l,c,d){var u,p=this,m={DEFAULT_LOAD_SIZE:20},E={commons:["issuer","time","hash","content","nonce","comment"]},b=new o(this,"esInvitation");function g(e){e.invitations=e.invitations||{},e.invitations.unreadCount=null,e.invitations.time=null}function f(e){e.invitations&&delete e.invitations}function h(e,i){if(i=i||t.defer(),!e||!e.pubkey)return n((function(){i.resolve(e)})),i.promise;var a=Date.now(),o=Math.trunc(a/1e3);return e.invitations&&e.invitations.time&&o-e.invitations.time<30?(console.debug("[ES] [invitation] Skipping load (loaded {0}s ago)".format(o-e.invitations.time)),n((function(){i.resolve(e)})),i.promise):(console.debug("[ES] [invitation] Loading count..."),function(e){if(!(e=e||(s.isLogin()?s.data.pubkey:e)))throw new Error("User not connected or no pubkey");var t={query:{bool:{must:[{term:{recipient:e}}]}}};return r.post("/invitation/certification/_count")(t).then((function(e){return e.count}))}(e.pubkey).then((function(t){e.invitations=e.invitations||{},e.invitations.unreadCount=t,e.invitations.time=o,console.debug("[ES] [invitation] Loaded count ("+t+") in "+(Date.now()-a)+"ms"),i.resolve(e)})).catch((function(t){console.error("Error while counting invitation: "+(t.message?t.message:t)),i.resolve(e)})),i.promise)}function T(e){if(s.data.invitations&&s.data.invitations.list){var n=_.where(s.data.invitations.list,{type:"certification",pubkey:e.pubkey});if(n&&n.length)return t.all(n.reduce((function(e,t){return e.concat(O(t))}),[]))}}function v(t){console.debug("[ES] [invitation] detected new invitation (from notification service)"),s.isAuth()?I(t.reference.id,t.reference.type).then((function(e){s.data.invitations=s.data.invitations||{},s.data.invitations.unreadCount++,s.data.invitations.list&&s.data.invitations.list.splice(0,0,e),b.data.raise.new(e)})):e.$applyAsync((function(){s.data.invitations=s.data.invitations||{},s.data.invitations.unreadCount++}))}function I(e,n){return n=n||"certification",t.all([l.box.getKeypair(),p.raw[n].get({id:e,fields:E.commons.join(",")})]).then((function(e){var t=e[0],n=e[1],i=n._source;return i.id=n._id,i.type=n._type,l.box.record.open([i],t,"issuer",["content","comment"])})).then((function(e){var t=e[0];if(t&&t.valid){var n=new q(t);return c.extendAll(n.issuer?[n,n.issuer]:[n],"pubkey").then((function(){return n}))}}))}function O(e,t){if(!e||!e.id)throw"Invalid invitation (empty or without id). Could not delete.";var n=e.type||"certification",i=t&&t.walletId&&s.children.get(t.walletId)||s;return p.raw[n].remove(e.id,{wallet:i}).then((function(){i.data.invitations.unreadCount=0,i.data.invitations&&i.data.invitations.list&&i.data.invitations.list.splice(i.data.invitations.list.indexOf(e),1)}))}function N(e,n,i){return e&&e.length?(n=n||"certification",t.all(e.reduce((function(e,t){return e.concat(p.raw[n].remove(t,i))}),[]))):t.when()}function R(){var t=r.alive;!t&&u&&u.length>0?(console.debug("[ES] [invitations] Disable"),_.forEach(u,(function(e){e()})),u=[],s.isLogin()&&f(s.data)):!t||u&&0!==u.length||(console.debug("[ES] [invitations] Enable"),function(){u=[s.api.data.on.init(e,g,this),s.api.data.on.login(e,h,this),s.api.data.on.load(e,h,this),s.api.data.on.reset(e,f,this),s.api.action.on.certify(e,T,this),d.api.event.on.newInvitation(e,v,this)]}(),s.isLogin()&&h(s.data))}return p.raw={certification:{get:r.get("/invitation/certification/:id?_source:fields"),add:r.record.post("/invitation/certification"),postSearch:r.post("/invitation/certification/_search"),remove:r.record.remove("invitation","certification"),getIds:r.get("/invitation/certification/_search?q=recipient::pubkey&_source=false&size=1000")}},b.registerEvent("data","new"),a.ready().then((function(){return r.api.node.on.start(e,R,this),r.api.node.on.stop(e,R,this),R()})),p.api=b,p.load=function(e,n){if(!s.isLogin())return t.when([]);(e=e||{}).from=e.from||0,e.size=e.size||m.DEFAULT_LOAD_SIZE;var i={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:e.issuer||s.data.pubkey}}}},from:e.from,size:e.size,_source:E.commons};return e.readTime&&(query.bool.must=[{range:{time:{gt:e.readTime}}}]),p.raw.certification.postSearch(i).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce((function(e,t){var n=t._source;return n.id=t._id,n.type=t._type,n.read=!!n.read_signature,delete n.read_signature,e.concat(n)}),[]);return l.box.record.open(t,n,"issuer",["content","comment"])})).then((function(t){var n=[];return t=t.reduce((function(e,t){if(!t||!t.valid)return e;var i=new q(t);return n.push(i),i.issuer&&n.push(i.issuer),e.concat(i)}),[]),c.extendAll(n,"pubkey").then((function(){return s.data.invitations=s.data.invitations||{},s.data.invitations.list?(s.data.invitations.list.length&&s.data.invitations.list.splice(e.from,s.data.invitations.list.length-e.from),_.forEach(t,(function(e){s.data.invitations.list.push(e)}))):s.data.invitations.list=t,s.data.invitations.list}))}))},p.get=I,p.send=function(e,t){(t=t||{}).type=t.type||"certification";var n=t.keypair||t.wallet&&t.wallet.data.keypair;return l.box.record.pack(e,n,"recipient",["content","comment"]).then((function(e){return p.raw[t.type].add(e,t)}))},p.delete=O,p.deleteByIds=N,p.deleteAll=function(e,t){e=e||"certification";var n=Date.now();console.debug("[ES] [invitation] Deleting all {0} invitations...".format(e));var i=t&&t.pubkey&&s.children.getByPubkey(t.pubkey)||t&&t.walletId&&s.children.getByPubkey(t.walletId)||s,a=i.data.invitations&&i.data.invitations.count||0,o=i.data.invitations&&i.data.invitations.unreadCount||0;return p.raw[e].getIds({pubkey:i.data.pubkey}).then((function(t){if(t&&t.hits&&t.hits.total)return N(t.hits.hits.reduce((function(e,t){return e.concat(t._id)}),[]),e,{walletId:i.id}).then((function(){i.data.invitations=i.data.invitations||{},i.data.invitations.count>=a?i.data.invitations.count-=a||0:i.data.invitations.count=0,i.data.invitations.unreadCount>=o?i.data.invitations.unreadCount-=o||0:i.data.invitations.unreadCount=0,console.debug("[ES] [invitation] All {0} invitations deleted in {1}ms".format(e,Date.now()-n))}))}))},p.constants=m,p}]),angular.module("cesium.es.subscription.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esSubscription")}]).factory("esSubscription",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","esSettings","CryptoUtils","UIUtils","csWallet","csWot","BMA","csPlatform","esWallet",function(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){var b,g=this;function f(e){e.subscriptions=null}function h(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [subscription] Loading subscriptions count..."),g.raw.count({pubkey:e.pubkey}).then((function(t){e.subscriptions=e.subscriptions||{},e.subscriptions.count=t&&t.hits&&t.hits.total,console.debug("[ES] [subscription] Loaded count ("+e.subscriptions.count+")"),n.resolve(e)})).catch((function(t){console.error("[ES] [subscription] Error while counting subscription: "+(t.message?t.message:t)),n.resolve(e)})),n.promise):(n.resolve(),n.promise)}function T(){var t=i.alive;if(!t&&b&&b.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(b,(function(e){e()})),b=[],d.isLogin())return f(d.data)}else if(t&&(!b||0===b.length)&&(console.debug("[ES] [subscription] Enable"),function(){b=[d.api.data.on.load(e,h,this),d.api.data.on.init(e,f,this),d.api.data.on.reset(e,f,this)]}(),d.isLogin()))return h(d.data)}return g.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()})),g.record={load:function(e,t){return g.raw.getAll({issuer:e}).then((function(e){var n=e&&e.hits&&e.hits.total&&e.hits.hits.reduce((function(e,t){var n=t._source;return n.id=t._id,e.concat(n)}),[])||[];return E.box.record.open(n,t,"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,n){if(!(e&&e.type&&e.content&&e.recipient))return t.reject("Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'");var i=n&&n.wallet||n&&n.walletId&&d.children.get(n.walletId)||d,a=i.data.pubkey,o=JSON.stringify(e.content);return l.util.random_nonce().then((function(n){return t.all([E.box.record.pack({issuer:a,issuerContent:o},i.data.keypair,"issuer","issuerContent",n),E.box.record.pack({recipient:e.recipient,recipientContent:o},i.data.keypair,"recipient","recipientContent",n)])})).then((function(t){var n=angular.merge(t[0],t[1]);return n.type=e.type,g.raw.add(n,{wallet:i}).then((function(t){return e.id=t,e}))}))},update:function(e,n){if(!e||!e.content||!e.recipient)return t.reject("Missing arguments 'record' or 'record.content', or 'record.recipient'");var i=n&&n.wallet||n&&n.walletId&&d.children.get(n.walletId)||d,a=i.data.pubkey,o=JSON.stringify(e.content);return l.util.random_nonce().then((function(n){return t.all([E.box.record.pack({issuer:a,issuerContent:o},i.data.keypair,"issuer","issuerContent",n),E.box.record.pack({recipient:e.recipient,recipientContent:o},i.data.keypair,"recipient","recipientContent",n)])})).then((function(t){var n=angular.merge(t[0],t[1]);return n.type=e.type,g.raw.update(n,{id:e.id,wallet:i}).then((function(){return e}))}))},remove:i.record.remove("subscription","record")},g.category={all:function(){if(g.raw.categories&&g.raw.categories.length){var e=t.defer();return e.resolve(g.raw.categories),e.promise}return g.raw.category.all().then((function(e){if(0===e.hits.total)g.raw.categories=[];else{var t=e.hits.hits.reduce((function(e,t){var n=t._source;return n.id=t._id,e.concat(n)}),[]);_.forEach(t,(function(e){t[e.id]=e})),g.raw.categories=t}return g.raw.categories}))},get:function(e){return g.raw.category.get(e).then((function(e){var t=e._source;return t.id=e._id,t}))}},g.constants={},g}]),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","csSettings","esCrypto","esProfile","esHttp",function(e,t,n,i,a,o,r,s,l,c){var d;function u(e){e.name=null,e.avatar=null,e.profile=null,e.moderator=null,o.events.cleanByContext("esWallet"),e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function p(t,n){return n=n||e.defer(),s.box.getKeypair(t.keypair).then((function(e){t.keypair.boxSk=e.boxSk,t.keypair.boxPk=e.boxPk,console.debug("[ES] [wallet] Box keypair successfully computed"),n.resolve()})).catch(n.reject),n.promise}function m(e){(e=e||o.data).keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function E(t,a){if(a=a||e.defer(),!t||!t.pubkey||!t.keypair)return a.resolve(),a.promise;if(!i.isLoaded())return console.debug("[ES] [wallet] Waiting crypto lib loading..."),n((function(){return E(t,a)}),50);console.debug("[ES] [wallet] Loading user avatar+name...");var o=Date.now(),s=[l.getAvatarAndName(t.pubkey).then((function(e){e?(t.name=e.name,t.avatarStyle=e.avatarStyle,t.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(t)}))];return r.data.expertMode&&s.push(c.node.moderators().then((function(e){t.moderator=_.contains(e&&e.moderators,t.pubkey)})).catch((function(e){console.error("[ES] [wallet] Cannot check is user is moderator: ",e&&e.message||e)}))),e.all(s).then((function(){a.resolve(t)})).catch(a.reject),a.promise}function b(t,n){n=n||e.defer(),o.events.cleanByContext("esWallet"),!t.name&&!t.requirements.revoked&&t.requirements.pendingMembership&&t.requirements.needCertificationCount>0&&o.events.add({type:"info",message:"ACCOUNT.EVENT.MEMBER_WITHOUT_PROFILE",context:"esWallet"}),console.debug("[ES] [wallet] Loading full user profile...");var i=Date.now();return l.get(t.pubkey).then((function(e){e&&(t.name=e.name,t.avatar=e.avatar,t.profile=t.profile||{},angular.merge(t.profile,e.source,{descriptionHtml:e.descriptionHtml}),console.debug("[ES] [wallet] Loaded full user profile in {0}ms".format(Date.now()-i))),n.resolve(t)})).catch(n.reject),n.promise}function g(t){if(!t&&!o.isAuth())throw new Error("Unable to get box keypair: user not authenticated !");return(t?e.when(t):o.getKeypair({silent:!0})).then((function(t){return t&&t.boxPk&&t.boxSk?e.when(t):s.box.getKeypair(t).then((function(e){return t.boxSk=e.boxSk,t.boxPk=e.boxPk,console.debug("[ES] [wallet] Box keypair successfully computed"),t}))}))}function f(){var e=c.alive;if(!e&&d&&d.length>0){if(console.debug("[ES] [wallet] Disable"),_.forEach(d,(function(e){e()})),d=[],o.isLogin())return u(o.data)}else if(e&&(!d||0===d.length)&&(console.debug("[ES] [wallet] Enable"),function(){d=[o.api.data.on.login(t,E,this),o.api.data.on.load(t,b,this),o.api.data.on.init(t,u,this),o.api.data.on.reset(t,u,this),o.api.data.on.unauth(t,m,this),o.api.data.on.auth(t,p,this)]}(),o.isLogin()))return E(o.data)}return a.ready().then((function(){return c.api.node.on.start(t,f,this),c.api.node.on.stop(t,f,this),f()})),this.box={getKeypair:g,record:{pack:function(e,t,n,i,a){return g(t).then((function(t){return s.box.pack(e,t,n,i,a)}))},open:function(e,t,n,i){return g(t).then((function(t){return s.box.open(e,t,n,i)}))}}},this}]),angular.module("cesium.es.wot.services",["ngResource","cesium.es.http.services"]).factory("esWot",["$rootScope","$q","esHttp","csCache",function(e,t,n,i){var a=i.get("esWot-memberships-",i.constants.MEDIUM),o={user:{event:n.post("/user/event/_search")}};function r(){console.debug("[ES] [wot] Cleaning cache {prefix: '{0}'}...".format("esWot-")),i.clear("esWot-")}return n.api.node.on.stop(e,r,this),{memberships:function(e,n){var i=!1!==(n=n||{}).cache?a.get(e):null;if(i)return t.when(i);var r={size:1e3,query:{bool:{filter:[{term:{recipient:e}},{terms:{code:["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"]}}]}},sort:[{time:{order:"asc"}}],_source:["code","time"]};return o.user.event(r).then((function(t){if(t.hits&&t.hits.total){var n,i=t.hits.hits.reduce((function(e,t){var i="MEMBER_JOIN"===t._source.code||"MEMBER_ACTIVE"===t._source.code;return i&&!n?n=t._source.time:!i&&n&&(e=e.concat({joinTime:n,leaveTime:t._source.time}),n=0),e}),[]);return n&&i.push({joinTime:n,leaveTime:moment().utc().unix()}),a.put(e,i),i}}))},cache:{clearAll:r}}}]),angular.module("cesium.es.tx.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.wot.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esTx")}]).factory("esTx",["$q","$rootScope","csPlatform","csCurrency","csTx","esHttp","esWot",function(e,t,n,i,a,o,r){var s,l={block:{search:o.post("/:currency/block/_search")}};function c(t,n){return n=n||e.defer(),(t=t||{}).pubkey||n.reject("Missing [pubkey] when calling [loadUDs] extension point"),e.all([i.get(),r.memberships(t.pubkey)]).then((function(n){var i=n[0]&&n[0].name,a=n[1];if(i&&a&&a.length)return-1!==t.fromTime&&(a=a.reduce((function(e,n){return n.leaveTime<t.fromTime?e:(n.joinTime=Math.max(n.joinTime,t.fromTime),e.concat(n))}),[])),e.all(a.reduce((function(e,n){var a={query:{filtered:{filter:{bool:{must:[{exists:{field:"dividend"}},{range:{medianTime:{from:n.joinTime+1,to:n.leaveTime}}}]}}}},size:t.size||1e4,from:t.from||0,sort:{medianTime:"desc"},_source:["medianTime","number","dividend","unitbase"]};return e.concat(l.block.search(a,{currency:i}))}),[]))})).then((function(e){if(e&&e.length)return e.reduce((function(e,t){return t.hits.total&&t.hits.hits.length?e.concat(t.hits.hits.reduce((function(e,t){var n,i,a=t._source;return e.concat({time:a.medianTime,amount:(n=a.dividend,i=a.unitbase,i<=0?n:n*Math.pow(10,i)),isUD:!0,block_number:a.number})}),[])):t}),[])})).then((function(e){n.resolve(e)})).catch((function(e){n.reject(e)})),n.promise}function d(){var e=o.alive;!e&&s&&s.length>0?(console.debug("[ES] [tx] Disable"),_.forEach(s,(function(e){e()})),s=[]):!e||s&&0!==s.length||(console.debug("[ES] [tx] Enable"),function(){s=[a.api.data.on.loadUDs(t,c,this)]}())}return n.ready().then((function(){return o.api.node.on.start(t,d,this),o.api.node.on.stop(t,d,this),d()})),{}}]),angular.module("cesium.es.geo.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esGeo")}]).factory("esGeo",["$rootScope","$q","csConfig","csSettings","csHttp",function(e,t,n,i,a){var o=this;function r(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,t){return e.concat({display_name:t.address_components&&t.address_components.reduce((function(e,t){return t.long_name?e.concat(t.long_name):e}),[]).join(", "),lat:t.geometry&&t.geometry.location&&t.geometry.location.lat,lon:t.geometry&&t.geometry.location&&t.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")},freegeoip:{search:a.get("freegeoip.net",443,"/json/:ip"),license:{name:"freegeoip",url:"https://freegeoip.net"}}},o.raw.google.apiKey=n.plugins&&n.plugins.es&&n.plugins.es.googleApiKey;var s=!!o.raw.google.apiKey;return i.ready().then((function(){function t(e){s||(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,t,this),t(i.data)})),{point:{current:function(){var e=t.defer();return navigator.geolocation?navigator.geolocation.getCurrentPosition((function(t){t&&t.coords?e.resolve({lat:t.coords.latitude,lon:t.coords.longitude}):console.error("[ES] [geo] navigator geolocation > Unknown format:",t)}),(function(t){e.reject(t)}),{timeout:5e3}):e.reject(),e.promise},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 t=Date.now();return o.raw.osm.search(e).then((function(e){if(e)return e=e.reduce((function(e,t){return"waterway"!=t.class&&"railway"!=t.class&&t.address?(t.address.city=t.address.city||t.address.village||t.address.town||t.address.postcode,t.address.road=t.address.road||t.address.suburb||t.address.hamlet,t.address.postcode&&t.address.city==t.address.postcode&&delete t.address.postcode,t.address.city?e.concat({id:t.place_id,name:t.display_name,address:t.address,lat:t.lat,lon:t.lon,class:t.class,license:o.raw.osm.license}):e):e}),[]),console.debug("[ES] [geo] Found {0} address position(s)".format(e&&e.length||0,Date.now()-t),e),e.length?e:void 0})).catch((function(t){return n=t,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"),r(i).catch((function(e){throw console.debug("[ES] [geo] Search position failed on [google] service"),n||e}));var n,i}))},distance:function(e,t,n,i,a){var o=Math.PI*e/180,r=Math.PI*n/180,s=t-i,l=Math.PI*s/180,c=Math.sin(o)*Math.sin(r)+Math.cos(o)*Math.cos(r)*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},ip:{search:function(e){return o.raw.freegeoip.search({ip:e}).then((function(e){return e?{lat:e.latitude,lng:e.longitude}:void 0}))},license:o.raw.freegeoip.license}},google:{isEnable:function(){return o.raw.google.enable&&o.raw.google.apiKey},searchByAddress:r}}}]),angular.module("cesium.es.document.services",["ngResource","cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esDocument")}]).factory("esDocument",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","csWot","csWallet","esHttp",function(e,t,n,i,a,o,r,s,l,c,d,u){var p={commons:["issuer","pubkey","hash","time","recipient","nonce","read_signature"],peer:["*"],movement:["*"]},m={search:u.post("/:index/:type/_search"),searchText:u.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 t="desc";return"peer"===e.type?(e.sort&&!e.sort.time||(t=e.sort&&e.sort.time||t,e.sort={"stats.medianTime":{nested_path:"stats",order:t}}),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||(t=e.sort&&e.sort.time||t,e.sort={medianTime:t}),e._source=e._source||p.movement,e.getTimeFunction=function(e){return e.time=e.medianTime,e.time}),e}function b(e,t){t.issuerField=t.issuerField||"pubkey";var n=(e&&e.hits&&e.hits.hits||[]).reduce((function(e,n){var i=n._source||{};return i.docType=i.type,i.index=n._index,i.type=n._type,i.id=n._id,i.pubkey=i.issuer||t.issuerField&&i[t.issuerField]||i.pubkey,i.time=t.getTimeFunction&&t.getTimeFunction(i)||i.time,i.thumbnail=u.image.fromHit(n,"avatar")||u.image.fromHit(n,"thumbnail"),e.concat(i)}),[]),i=n.reduce((function(e,t){return t.recipient?(t.recipient={pubkey:t.recipient},e.concat(t.recipient)):e}),[]);return c.extendAll(n.concat(i)).then((function(){return{hits:n,took:e.took,total:e&&e.hits&&e.hits.total||0}}))}return{search:function(e){var t={from:(e=E(e)).from||0,size:e.size||40,sort:e.sort||{time:"desc"},_source:e._source||p.commons};return e.query&&(t.query=e.query),m.search(t,{index:e.index,type:e.type}).then((function(t){return b(t,e)}))},searchText:function(e,t){var n={text:e,index:(t=t||{}).index||"user",type:t.type||"profiles",from:t.from||0,size:t.size||40,sort:t.sort||"time:desc",source:t._source&&t._source.join(",")||p.commons.join(",")};console.debug("[ES] [wallet] [document] [{0}/{1}] Loading documents...".format(t.index,t.type));var i=Date.now();return m.searchText(n).then((function(e){return b(e,t)})).then((function(e){return console.debug("[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms".format(t.index,t.type,e&&e.hits&&e.hits.length||0,Date.now()-i)),e}))},remove:function(t,n){return t&&t.index&&t.type&&t.id?u.record.remove(t.index,t.type)(t.id,n):e.reject("Could not remove document: missing mandatory fields")},removeAll:function(t,n){if(t&&t.length){var i=n&&n.walletId&&d.children.get(n.walletId)||d;return i.auth().then((function(){return e.all(t.reduce((function(e,t){return e.concat(u.record.remove(t.index,t.type)(t.id,{wallet:i}))}),[]))}))}},fields:{commons:p.commons},fromHit:function(e){return b({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,t,n,i,a,o,r,s,l,c){function d(e){var d,u="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,compact:!0},groupBy:"pubkey",expertMode:!1,knownBlocks:[],mainBlock:null,searchingPeersOnNetwork:!1,timeout:r.timeout},E=function(e){return e&&[e.number,e.hash].join("-")},b=function(){m.pod=null,m.listeners=[],m.peers.splice(0),m.filter={endpointFilter:null,online:!0},m.sort={type:null,asc:!0},m.groupBy="pubkey",m.expertMode=!1,m.knownBlocks=[],m.mainBlock=null,m.loading=!0,m.searchingPeersOnNetwork=!1,m.timeout=r.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"}},g=function(){m.peers=[],m.searchingPeersOnNetwork=!0,m.loading=!0,m.pod=m.pod||s;var e=[];return d&&n.cancel(d),d=n((function(){e.length?v(e):m.loading&&!m.searchingPeersOnNetwork&&(m.loading=!1,n.cancel(d),O(!0),console.debug("[network] Finish: {0} peers found.".format(m.peers.length)))}),1e3),t.when().then((function(){return m.filter.online?m.pod.network.peers().then((function(n){var i=[];if(_.forEach(n.peers,(function(t){"UP"===t.status&&i.push(f(t,e))})),i.length)return t.all(i)})).catch((function(e){console.error(e)})):m.pod.network.peers().then((function(n){var i=[];if(_.forEach(n.peers,(function(t){"UP"!==t.status&&i.push(f(t,e))})),i.length)return t.all(i)}))})).then((function(){m.searchingPeersOnNetwork=!1})).catch((function(e){console.error(e),m.searchingPeersOnNetwork=!1}))},f=function(e,n){n=n||m.newPeers;var i=h(e),a=!1,o=i.reduce((function(e,t){var i=_.findWhere(m.peers,{id:t.id}),o=i?i.buid:null,r=!!i&&i.online;return e.concat(T(t).then((function(e){if(i)if(!e||e.online!==m.filter.online&&"all"!==m.filter.online){var s=m.peers.indexOf(i);-1!==s&&(console.debug("[network] Peer [{0}] removed (cause: {1})".format(t.server,e?e.online?"UP":"DOWN":"filtered")),m.peers.splice(s,1),a=!0)}else e.buid!==o?(console.debug("[network] {0} endpoint [{1}] new current block".format(e.ep&&e.ep.api||"",e.server)),a=!0):r!==e.online?(console.debug("[network] {0} endpoint [{1}] is now {2}".format(e.ep&&e.ep.api||"",e.server,e.online?"UP":"DOWN")),a=!0):console.debug("[ES] [network] {0} endpoint [{1}] unchanged".format(e.ep&&e.ep.api||"",e.server));else!e||e.online!==m.filter.online&&"all"!==m.filter.online||(console.debug("[ES] [network] {0} endpoint [{1}] is {2}".format(e.ep&&e.ep.api||"",e.server,e.online?"UP":"DOWN")),n.push(e),a=!0)})))}),[]);return(1===o.length?o[0]:t.all(o)).then((function(){return a}))},h=function(e,t){if(!e)return[];var n=new X(e);if(!t){var i=n.getEndpoints();if(!i)return[];var a=i.reduce((function(e,t){var n=s.node.parseEndPoint(t);return n?e.concat(n):e}),[]);if(a.length>1)return a.reduce((function(t,n){return t.concat(h(e,n))}),[]);t=a[0]}return n.ep=t,n.server=n.getServer(),n.dns=n.getDns(),n.blockNumber=n.block&&n.block.replace(/-.+$/,""),n.id=n.keyID(),[n]},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&&(m.filter.online||"DOWN"!==e.status)&&e.getHost()?u&&!e.isSsl()?(e.online="UP"===e.status,e.buid=-1,delete e.version,t.when(e)):e.ep.useTor?(e.online="UP"==e.status,e.buid=-1,delete e.software,delete e.version,t.when(e)):(e.api=e.api||s.lightInstance(e.getHost(),e.getPort(),e.isSsl(),m.timeout),e.api.blockchain.current().then((function(t){return e.currentNumber=t.number,e.online=!0,e.buid=E(t),e.medianTime=t.medianTime,-1===m.knownBlocks.indexOf(e.buid)&&m.knownBlocks.push(e.buid),e})).catch((function(t){if(t&&t.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 n=e.ep||e.getEP();if(n.dns&&-1===e.server.indexOf(n.dns))return e.secondTry=!0,e.api=s.lightInstance(n.dns,e.getPort(),e.isSsl(),m.timeout),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={},t.all([m.expertMode?e.api.node.summary().then((function(t){e.software=t&&t.duniter&&t.duniter.software||void 0,e.version=t&&t.duniter&&t.duniter.version||"?"})).catch((function(){e.software=void 0,e.version="?"})):t.when(),e.api.record.count(m.document.index,m.document.type).then((function(t){e.docCount.record=t})).catch((function(){e.docCount.record=void 0})),e.api.subscription.count({recipient:e.pubkey,type:"email"}).then((function(t){e.docCount.emailSubscription=t})).catch((function(){e.docCount.emailSubscription=void 0}))])):e})).then((function(){return delete e.api,e}))):(e.online=!1,t.when(e)):t.when()},v=function(e,t){if((e=e||m.newPeers).length){var n=_.map(m.peers,(function(e){return e.id})),i=!1,a=0;_.forEach(e.splice(0),(function(e){n[e.id]||(m.peers.push(e),n[e.id]=e,i=!0,a++)})),i&&(console.debug("[network] Flushing {0} new peers...".format(a)),O(t))}},I=function(e,t,n){if(!e)return 0;var i=0;t>(e=e.toLowerCase()).length&&(t=e.length),i+=e.charCodeAt(0);for(var a=1;a<t;a++)i+=Math.pow(.001,a)*e.charCodeAt(a);return n?1e3-i:i},O=function(e){var t={};_.forEach(m.peers,(function(e){if(e.buid){var n=t[e.buid];n&&n.medianTime?!n.medianTime&&e.medianTime&&(n.medianTime=e.medianTime):(n={buid:e.buid,medianTime:e.medianTime,count:0},t[e.buid]=n),-1!==n.buid&&n.count++}})),_.forEach(_.values(t),(function(e){e.pct=100*e.count/m.peers.length}));var n,i=_.max(t,(function(e){return e.count}));_.forEach(m.peers,(function(e){e.hasMainConsensusBlock=e.buid==i.buid,e.hasConsensusBlock=e.buid&&!e.hasMainConsensusBlock&&t[e.buid].count>1,e.hasConsensusBlock&&(e.consensusBlockDelta=t[e.buid].medianTime-i.medianTime)})),m.peers=_.uniq(m.peers,!1,(function(e){return e.id})),m.peers=_.sortBy(m.peers,(function(e){var n=0;if(m.sort.type){var i=0;i+="name"==m.sort.type?I(e.name,10,m.sort.asc):0,i+="software"==m.sort.type?I(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,n+=1e10*(i+="doc_count"==m.sort.type&&e.docCount?m.sort.asc?1e9-e.docCount:e.docCount:0)}return n+=1e9*(e.online?1:0),n+=1e8*(e.hasMainConsensusBlock?1:0),n+=1e6*(e.hasConsensusBlock?t[e.buid].pct:0),m.expertMode?(n+=100*(e.difficulty?1e4-e.difficulty:0),n+=1*(e.uid?I(e.uid,2,!0):0)):(n+=100*(e.uid?I(e.uid,2,!0):0),n+=1*(e.uid?0:I(e.pubkey,2,!0))),-n})),m.groupBy&&m.peers.forEach((function(e){e.compacted=n&&e[m.groupBy]&&e[m.groupBy]===n[m.groupBy],n=e})),e&&i&&i.buid&&(!m.mainBlock||m.mainBlock.buid!==i.buid)&&(m.mainBlock=i,p.data.raise.mainBlockChanged(i)),p.data.raise.changed(m)},N=function(e,t){return t=t||{},s.ready().then((function(){R(),b(),m.pod=e||s,m.filter=t.filter?angular.merge(m.filter,t.filter):m.filter,m.sort=t.sort?angular.merge(m.sort,t.sort):m.sort,m.expertMode=angular.isDefined(t.expertMode)?t.expertMode:m.expertMode,m.timeout=angular.isDefined(t.timeout)?t.timeout:r.timeout,console.info("[ES] [network] Starting network from [{0}]".format(m.pod.server));var n=Date.now();return m.listeners=[m.pod.websocket.block().onListener((function(e){if(e&&!m.loading){var t=[e.number,e.hash].join("-");-1===m.knownBlocks.indexOf(t)&&(console.debug("[network] Receiving block: "+t.substring(0,20)),m.knownBlocks.push(t),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 t=[];f(e,t).then((function(e){e&&(t.length>0?v(t,!0):(console.debug("[network] [ws] Peers updated received"),O(!0)))}))}}))],g().then((function(e){return console.debug("[ES] [network] Started in "+(Date.now()-n)+"ms"),e}))}))},R=function(){m.pod&&(console.info("[ES] [network-service] Stopping..."),_.forEach(m.listeners,(function(e){e()})),m.listeners=[],b())},A=function(e){return m.pod?N().then((function(){return t(e)})):t(e)};return p.registerEvent("data","changed"),p.registerEvent("data","mainBlockChanged"),p.registerEvent("data","rollback"),{id:e,data:m,start:N,close:R,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,O(!1)},getTrustedPeers:function(){return A((function(e,t){e(m.peers.reduce((function(e,t){return t.hasMainConsensusBlock&&t.uid?e.concat(t):e}),[]))}))},getKnownBlocks:function(){return m.knownBlocks},getMainBlockUid:function(){return A((function(e,t){e(m.mainBuid)}))},loadPeers:g,isBusy:function(){return m.loading},api:p}}var u=new d("default");return u.instance=function(e){return new d(e)},u}]),angular.module("cesium.es.like.services",["ngResource","cesium.services","cesium.es.http.services"]).factory("esLike",["$q","csWallet","esHttp",function(e,t,n){return{constants:{KINDS:["LIKE","ABUSE"]},instance:function(i,a){var o=this;function r(n,r){
if((r=r||{}).kind=r.kind&&r.kind.toUpperCase()||"LIKE",!t.isLogin())return e.reject("Wallet must be login before sending record to ES node");var s={version:2,index:i,type:a,id:n,kind:r.kind};return r.comment&&(s.comment=r.comment),angular.isDefined(r.level)&&(s.level=r.level),o.raw.postRecord(s,r)}function s(e,t){if(!e)throw new Error("Missing 'id' argument");return o.raw.removeRecord(e,t)}return o.raw={getSearch:n.get("/like/record/_search?_source=false&q=:q"),searchBaseQueryString:"index:{0} AND type:{1} AND id:".format(i,a),postSearch:n.post("/like/record/_search"),postRecord:n.record.post("/{0}/{1}/:id/_like".format(i,a)),removeRecord:n.record.remove("like","record")},{index:i,type:a,toggle:function(n,i){(i=i||{}).kind=i.kind||"LIKE";var a=i.pubkey||i.wallet&&i.wallet.data.pubkey||t.isLogin()&&t.data.pubkey;return a?(i.wallet=i.wallet||t.getByPubkey(a),function(e,t){(t=t||{}).kind=t.kind||"LIKE";var n=o.raw.searchBaseQueryString+e;return t.kind&&(n+=" AND kind:"+t.kind.toUpperCase()),t.issuer&&(n+=" AND issuer:"+t.issuer),o.raw.getSearch({q:n}).then((function(e){return(e&&e.hits&&e.hits.hits||[]).map((function(e){return e._id}))}))}(n,{kind:i.kind,issuer:a}).then((function(t){return t&&t.length?e.all(_.map(t,(function(e){return s(e,i)}))).then((function(){return-1*t.length})):r(n,i).then((function(){return 1}))}))):e.reject("User not log in!")},add:r,remove:s,count:function(e,t){(t=t||{}).kind=t.kind||"LIKE";var n={query:{bool:{filter:[{term:{index:i}},{term:{type:a}},{term:{id:e}},{term:{kind:t.kind.toUpperCase()}}]}},size:0},r=t.issuer?[t.issuer]:t.issuers;return r&&r.length&&(n.query.bool.should={terms:{issuer:r}},n.size=r.length,n._source=["issuer"]),o.raw.postSearch(n).then((function(e){var t=e&&e.hits,n={total:t&&t.total||0,wasHitByPubkey:{},wasHitCount:0};return _.forEach(r,(function(e){var i=t?_.findIndex(t.hits||[],(function(t){return t._source.issuer===e})):-1;n.wasHitByPubkey[e]=-1!==i||!1,n.wasHitCount+=-1!==i?1:0})),n}))}}}}}]),Q.$inject=["$scope","UIUtils","$q","Device"],ee.$inject=["$scope","$focus","$filter","UIUtils","SocialUtils"],te.$inject=["$scope"],Z.$inject=["$scope","$filter","$state","$focus","$timeout","$anchorScroll","UIUtils"],J.$inject=["$scope","UIUtils","$timeout","parameters"],ne.$inject=["$scope","$sce"],ie.$inject=["$scope","csConfig","esGeo","ModalUtils"],ae.$inject=["$scope","$q","csConfig","esGeo","ModalUtils"],oe.$inject=["$scope","$timeout","ModalUtils","csConfig","esGeo"],re.$inject=["$scope","$q","$translate","esGeo","parameters"],angular.module("cesium.es.common.controllers",["ngResource","cesium.es.services"]).controller("ESPicturesEditCtrl",Q).controller("ESPicturesEditCtrl",Q).controller("ESSocialsEditCtrl",ee).controller("ESSocialsViewCtrl",te).controller("ESCommentsCtrl",Z).controller("ESCategoryModalCtrl",J).controller("ESAvatarModalCtrl",ne).controller("ESPositionEditCtrl",ie).controller("ESLookupPositionCtrl",ae).controller("ESSearchPositionItemCtrl",oe).controller("ESSearchPositionModalCtrl",re),se.$inject=["$scope","esSettings","PluginService"],le.$inject=["$scope","$state","$controller","UIUtils","csWallet"],ce.$inject=["$scope","$q","$state","esSettings","csWallet"],angular.module("cesium.es.app.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&(e.extendState("app",{points:{"nav-buttons-right":{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",se).controller("ESMenuExtendCtrl",le).controller("ESProfilePopoverExtendCtrl",ce),de.$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,t,n){n.plugins&&n.plugins.es&&(e.extendState("app.settings",{points:{plugins:{templateUrl:"plugins/es/templates/settings/settings_extend.html",controller:"ESExtensionCtrl"}}}),t.state("app.es_settings",{url:"/settings/es",views:{menuContent:{templateUrl:"plugins/es/templates/settings/plugin_settings.html",controller:"ESPluginSettingsCtrl"}}}))}]).controller("ESPluginSettingsCtrl",de),angular.module("cesium.es.currency.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.extendState("app.currency.tab_blocks",{points:{"nav-buttons":{templateUrl:"plugins/es/templates/currency/tab_blocks_extend.html",controller:"ESExtensionCtrl"}}})}]),ue.$inject=["$scope","$controller","$state","csWallet","esModals"],pe.$inject=["$scope","$controller","UIUtils","esHttp","esProfile"],angular.module("cesium.es.wallet.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.extendStates(["app.view_wallet","app.view_wallet_by_id"],{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"}}}).extendState("app.view_wallets",{points:{"item-wallet":{templateUrl:"plugins/es/templates/wallet/item_wallet_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("ESWalletViewCtrl",ue).controller("ESWalletLikesCtrl",pe),me.$inject=["$scope","$controller","$state"],Ee.$inject=["$scope","$ionicPopover","$q","$controller","$timeout","UIUtils","Modals","csWallet","esHttp","esLike","esModals","esWallet","esProfile","esInvitation"],angular.module("cesium.es.wot.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){n.plugins&&n.plugins.es&&t.extendState("app.wot_lookup",{points:{tabs:{templateUrl:"plugins/es/templates/wot/lookup_extend.html",controller:"ESExtensionCtrl"}}}).extendState("app.wot_lookup_lg",{points:{top:{templateUrl:"plugins/es/templates/wot/lookup_lg_extend.html",controller:"ESWotLookupExtendCtrl"}}}).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"},"after-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"}}}).extendStates(["app.wot_cert","app.wot_cert_lg","app.wallet_cert","app.wallet_cert_lg"],{points:{"nav-buttons":{templateUrl:"plugins/es/templates/wot/view_certifications_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_certifications_extend.html",controller:"ESWotIdentityViewCtrl"}}})}]).controller("ESWotLookupExtendCtrl",me).controller("ESWotIdentityViewCtrl",Ee),be.$inject=["$scope","$focus","$timeout","$filter","$controller","$location","$translate","$ionicPopover","Device","UIUtils","ModalUtils","BMA","csSettings","csWallet","esModals","esRegistry","esHttp"],ge.$inject=["$scope","$controller","$timeout","UIUtils","esModals","csWallet"],fe.$inject=["$scope","$rootScope","$state","$q","$timeout","$ionicPopover","$ionicHistory","$translate","$controller","$anchorScroll","csConfig","csWallet","esRegistry","UIUtils","esHttp"],_e.$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.wot_lookup.tab_registry",{url:"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{tab_registry:{templateUrl:"plugins/es/templates/registry/tabs/tab_registry.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:"/account/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0,silentLocationChange:!0}}).state("app.wallet_pages_by_id",{url:"/wallets/:id/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0,silentLocationChange:!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?wallet",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?wallet",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}})}]).controller("ESRegistryLookupCtrl",be).controller("ESWalletPagesCtrl",ge).controller("ESRegistryRecordViewCtrl",fe).controller("ESRegistryRecordEditCtrl",_e),he.$inject=["$scope","$q","$timeout","$state","$focus","$translate","$controller","$ionicHistory","$ionicPopover","UIUtils","csWallet","esHttp","esProfile","ModalUtils","Device"],angular.module("cesium.es.profile.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_profile",{url:"/wallet/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{auth:!0}}).state("app.edit_profile_by_id",{url:"/wallets/:id/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{login:!0}})}]).controller("ESViewEditProfileCtrl",he),Te.$inject=["$scope","$state","$translate","$ionicHistory","$ionicPopover","$timeout","csWallet","esModals","UIUtils","esMessage"],ve.$inject=["$scope","$controller"],Ie.$inject=["$scope","$controller"],Oe.$inject=["$scope","$controller"],Ne.$inject=["$scope","Modals","UIUtils","csWallet","esHttp","esMessage","parameters"],Re.$inject=["$scope","$state","$timeout","$translate","$ionicHistory","$ionicPopover","UIUtils","esModals","esMessage","csWallet"],Ae.$inject=["$scope","UIUtils","$state","csWallet","esHttp","esMessage","esModals","$timeout"],angular.module("cesium.es.message.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.user_message",{url:"/user/message",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup.html"}}}).state("app.user_message.tab_inbox",{url:"/inbox",views:{tab_inbox:{controller:"ESMessageInboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{auth:!0,minData:!0,large:"app.user_messages_lg_inbox"}}).state("app.user_message.tab_outbox",{url:"/outbox",views:{tab_outbox:{controller:"ESMessageOutboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{auth:!0,minData:!0,large:"app.user_messages_lg_outbox"}}).state("app.user_messages_lg_inbox",{url:"/user/message/lg/inbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageInboxListCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_messages_by_id",{url:"/wallets/:id/message",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_by_id.html"}}}).state("app.user_messages_by_id.tab_inbox",{url:"/inbox",views:{tab_inbox:{controller:"ESMessageInboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{large:"app.user_messages_lg_inbox_by_id"}}).state("app.user_messages_by_id.tab_outbox",{url:"/outbox",views:{tab_outbox:{controller:"ESMessageOutboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{large:"app.user_messages_lg_outbox_by_id"}}).state("app.user_messages_lg_inbox_by_id",{url:"/wallets/:id/message/lg/inbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageInboxListCtrl"}}}).state("app.user_messages_lg_outbox",{url:"/user/message/lg/outbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageOutboxListCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_messages_lg_outbox_by_id",{url:"/wallets/:id/message/lg/outbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageOutboxListCtrl"}}}).state("app.user_new_message",{cache:!1,url:"/user/message/new?pubkey&uid&title&content&isReply",views:{menuContent:{templateUrl:"plugins/es/templates/message/compose.html",controller:"ESMessageComposeCtrl"}}}).state("app.user_view_message",{cache:!1,url:"/user/message/view/:type/:messageId",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_view_message_by_id",{cache:!1,url:"/wallets/:id/message/view/:type/:messageId",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}}})}]).controller("ESMessageAbstractListCtrl",Te).controller("ESMessageInboxListCtrl",ve).controller("ESMessageOutboxListCtrl",Ie).controller("ESMessageComposeCtrl",Oe).controller("ESMessageComposeModalCtrl",Ne).controller("ESMessageViewCtrl",Re).controller("PopoverMessageCtrl",Ae),Se.$inject=["$scope","$ionicPopover","$state","$timeout","UIUtils","esHttp","csWallet","esNotification"],Ce.$inject=["$scope","$timeout","$controller","$state","UIUtils","csWallet"],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"}},data:{login:!0}}).state("app.view_notifications_by_id",{url:"/wallets/:id/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}},data:{login:!0}})}]).controller("NotificationsCtrl",Se).controller("PopoverNotificationsCtrl",Ce),Le.$inject=["$scope","$controller","$ionicPopover","$location","UIUtils","esBlockchain"],angular.module("cesium.es.blockchain.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.lookup_blocks_currency",{url:"/currencies/:currency/blocks?q",views:{menuContent:{templateUrl:"plugins/es/templates/blockchain/lookup.html",controller:"ESBlockLookupCtrl"}}}).state("app.blockchain_search",{url:"/blockchain/search?q&type",views:{menuContent:{templateUrl:"plugins/es/templates/blockchain/lookup.html",controller:"ESBlockLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESBlockLookupCtrl",Le),De.$inject=["$scope","$state","$location","$ionicPopover","$window","$translate","esHttp","UIUtils","csConfig","csSettings","csCurrency","esNetwork","csWot"],ye.$inject=["$scope","$controller","parameters"],Me.$inject=["$scope","$q","$window","$state","UIUtils","csWot","esHttp","csHttp","csSettings"],Pe.$inject=["$scope","$controller"],ke.$inject=["$scope","$q","csSettings","csCurrency","csHttp","esHttp"],angular.module("cesium.es.network.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.extendState("app.network",{points:{"network-buttons":{templateUrl:"plugins/es/templates/network/view_network_extend.html",controller:"ESExtensionCtrl"},"blockchain-buttons":{templateUrl:"plugins/es/templates/network/view_network_extend.html",controller:"ESExtensionCtrl"}}})}]).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",De).controller("ESNetworkLookupModalCtrl",ye).controller("ESPeerViewCtrl",Me).controller("ESNetworkLookupPopoverCtrl",Pe).controller("ESPeerInfoPopoverCtrl",ke),we.$inject=["$scope","UIUtils","$state","csWallet","esGroup","ModalUtils"],Ue.$inject=["$scope","$state","$ionicPopover","$ionicHistory","$translate","UIUtils","csConfig","esGroup","csWallet"],xe.$inject=["$scope","esGroup","UIUtils","$state","$q","Device","$ionicHistory","ModalUtils","$focus","esHttp"],angular.module("cesium.es.group.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.groups",{url:"/group?type&location",views:{menuContent:{templateUrl:"plugins/es/templates/group/lookup.html",controller:"ESGroupListCtrl"}}}).state("app.add_group",{url:"/group/add/:type",views:{menuContent:{templateUrl:"plugins/es/templates/group/edit_group.html",controller:"ESGroupEditCtrl"}}}).state("app.edit_group",{url:"/group/edit/:id",views:{menuContent:{templateUrl:"plugins/es/templates/group/edit_group.html",controller:"ESGroupEditCtrl"}}}).state("app.view_group",{url:"/group/view/:id",views:{menuContent:{templateUrl:"plugins/es/templates/group/view_record.html",controller:"ESGroupViewCtrl"}}})}]).controller("ESGroupListCtrl",we).controller("ESGroupViewCtrl",Ue).controller("ESGroupEditCtrl",xe),Be.$inject=["$scope","$q","$ionicPopover","$state","$timeout","UIUtils","csWallet","esHttp","esModals","esNotification","esInvitation"],He.$inject=["$scope","$controller","csWallet"],Fe.$inject=["$scope","$q","Modals","UIUtils","csWallet","esHttp","esWallet","esInvitation","parameters"],angular.module("cesium.es.invitation.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.view_invitations",{url:"/invitations?id",views:{menuContent:{templateUrl:"plugins/es/templates/invitation/view_invitations.html",controller:"InvitationsCtrl"}},data:{auth:!0}}).state("app.view_invitations_by_id",{url:"/wallets/:id/invitations",views:{menuContent:{templateUrl:"plugins/es/templates/invitation/view_invitations.html",controller:"InvitationsCtrl"}},data:{login:!0}})}]).controller("InvitationsCtrl",Be).controller("PopoverInvitationCtrl",He).controller("ESNewInvitationModalCtrl",Fe),We.$inject=["$scope","$q","$ionicHistory","csWot","csWallet","UIUtils","ModalUtils","esSubscription"],Ve.$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",We).controller("ModalEmailSubscriptionsCtrl",Ve),Ge.$inject=["$scope","$ionicPopover","$location","$timeout","csSettings","csWallet","UIUtils","esHttp","esDocument"],Ye.$inject=["$scope","$controller","$timeout","$state","$filter"],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",Ge).controller("ESLastDocumentsCtrl",Ye),$e.$inject=["$scope","$q","$timeout","$translate","$ionicPopup","UIUtils","Modals","csWallet","esHttp","esLike"],angular.module("cesium.es.like.controllers",["ngResource","cesium.es.services"]).controller("ESLikesCtrl",$e),angular.module("cesium.graph.plugin",["cesium.graph.services","cesium.graph.common.controllers","cesium.graph.blockchain.controllers","cesium.graph.network.controllers","cesium.graph.currency.controllers","cesium.graph.account.controllers","cesium.graph.docstats.controllers","cesium.graph.synchro.controllers"]),angular.module("cesium.graph.services",["cesium.graph.color.services","cesium.graph.data.services"]),angular.module("cesium.graph.data.services",["cesium.wot.services","cesium.es.http.services","cesium.es.wot.services"]).factory("gpData",["$rootScope","$q","$timeout","csHttp","esHttp","BMA","csWot","csCache","esWot",function(e,t,n,i,a,o,r,s,l){var c=s.get("gpData-currency-",s.constants.SHORT),d={node:{},wot:{},blockchain:{},docstat:{},synchro:{execution:{}},raw:{block:{search:a.post("/:currency/block/_search")},blockstat:{search:a.post("/:currency/blockstat/_search")},movement:{search:a.post("/:currency/movement/_search")},user:{event:a.post("/user/event/_search?pretty")},docstat:{search:a.post("/document/stats/_search")},synchro:{search:a.post("/:currency/synchro/_search")}},regex:{}};function u(e,t){return t<=0?e:e*Math.pow(10,t)}function p(e,t,n,a){return t=t||80,n=angular.isDefined(n)?n:443==t,{docstat:{search:i.post(e,t,"/document/stats/_search",n,a)},synchro:{search:i.post(e,t,"/:currency/synchro/_search",n,a)}}}function m(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 d.blockchain.countByIssuer=function(e){return d.raw.block.search({size:0,aggs:{blocksByIssuer:{terms:{field:"issuer",size:0}}}},{currency:e}).then((function(e){var t=e.aggregations;if(t.blocksByIssuer&&t.blocksByIssuer.buckets&&t.blocksByIssuer.buckets.length){var n={blockCount:e.hits.total};return n.data=(t.blocksByIssuer.buckets||[]).reduce((function(e,t){return e.concat(t.doc_count)}),[]),n.issuers=(t.blocksByIssuer.buckets||[]).reduce((function(e,t){return e.concat({pubkey:t.key})}),[]),r.extendAll(n.issuers).then((function(){return n.labels=n.issuers.reduce((function(e,t){return e.concat(t.name||t.uid||t.pubkey.substr(0,8))}),[]),n}))}}))},d.blockchain.withDividend=function(e,n){n=n||{};var i=!angular.isDefined(n.withCache)||n.withCache,a=[e,JSON.stringify(n)].join("-");if(i){var r=c.get(a);if(r){if(!r.blocks){var s=t.defer();return r.then((function(e){return s.resolve(e),e})),s.promise}return console.debug("[graph] monetaryMass for ["+e+"] found in cache"),t.when(r)}}var l={query:{filtered:{filter:{bool:{must:[{exists:{field:"dividend"}}]}}}},size:n.size||1e4,from:n.from||0,_source:["medianTime","number","dividend","monetaryMass","membersCount","unitbase"],sort:{medianTime:"asc"}},p=t.all([n.withCurrent?o.blockchain.current().catch((function(e){if(!e||e.ucode!=o.errorCodes.NO_CURRENT_BLOCK)throw e})):t.when(),d.raw.block.search(l,{currency:e})]).then((function(e){var t=e[0];if((e=e[1]).hits.total&&e.hits.hits.length){var n={};if(n.blocks=e.hits.hits.reduce((function(e,t){var n=t._source;return n.dividend=u(n.dividend,n.unitbase),delete n.unitbase,e.concat(n)}),[]),t){var i=n.blocks.length&&t.medianTime-n.blocks[n.blocks.length-1].medianTime;i&&i>=3600&&(t.dividend=u(t.dividend,t.unitbase),delete t.unitbase,n.blocks.push(t))}return n.times=n.blocks.reduce((function(e,t){return e.concat(t.medianTime)}),[]),c.put(a,n),n}}));return c.put(a,p),p},d.blockchain.txCount=function(e,n){n=m(n);for(var i=[],a=moment.unix(n.startTime).utc().startOf(n.rangeDuration),o=moment.unix(n.endTime).utc().startOf(n.rangeDuration),r=[];a.isBefore(o);)if(r.push({from:a.unix(),to:a.add(1,n.rangeDuration).unix()}),r.length===n.maxRangeSize||!a.isBefore(o)){var s={size:0,aggs:{tx:{range:{field:"medianTime",ranges:r},aggs:{txCount:{stats:{field:"txCount"}},txAmount:{stats:{field:"txAmount"}}}}}};n.issuer&&(s.query={bool:{filter:{term:{issuer:n.issuer}}}}),r=[],10===i.length?(console.error("Too many parallel jobs!"),a=moment.unix(n.endTime).utc()):i.push(d.raw.blockstat.search(s,{currency:e}).then((function(e){var t=e.aggregations;if(t.tx&&t.tx.buckets&&t.tx.buckets.length)return(t.tx.buckets||[]).reduce((function(e,t){return e.concat({from:t.from,to:t.to,count:t.txCount.sum||0,amount:t.txAmount.sum||0,avgByBlock:Math.round(100*t.txCount.avg)/100,maxByBlock:t.txCount.max})}),[])})))}return t.all(i).then((function(e){return e=e.reduce((function(e,t){return t&&t.length?e.concat(t):e}),[]),e=_.sortBy(e,"from"),{count:_.pluck(e,"count"),avgByBlock:_.pluck(e,"avgByBlock"),maxByBlock:_.pluck(e,"maxByBlock"),amount:e.reduce((function(e,t){return e.concat(t.amount/100)}),[]),times:_.pluck(e,"from")}}))},d.node.blockCount=function(e,t){var n={size:0,query:{bool:{filter:{term:{issuer:t}}}}};return d.raw.block.search(n,{currency:e}).then((function(e){return e.hits.total}))},d.raw.movement.getByRange=function(e,t,n){if(!t)throw new Error("Missing 'pubkey' argument!");var i={size:0,query:{bool:{should:[{term:{recipient:t}},{term:{issuer:t}}]}},aggs:{tx:{range:{field:"medianTime",ranges:n},aggs:{received:{filter:{term:{recipient:t}},aggs:{received_stats:{stats:{field:"amount"}}}},sent:{filter:{term:{issuer:t}},aggs:{sent_stats:{stats:{field:"amount"}}}}}}}};return d.raw.movement.search(i,{currency:e}).then((function(e){var t=e.aggregations;if(t.tx&&t.tx.buckets&&t.tx.buckets.length)return(t.tx.buckets||[]).reduce((function(e,t){var n=t.sent.sent_stats,i=t.received.received_stats;return e.concat({from:t.from,to:t.to,sent:n.sum?-n.sum/100:0,received:i.sum?i.sum/100:0})}),[])}))},d.raw.movement.getUds=function(e,t,n){var i={size:0,query:{bool:{should:[{exists:{field:"dividend"}}]}},aggs:{ud:{range:{field:"medianTime",ranges:t},aggs:{ud_stats:{stats:{field:"dividend"}},unitbase_stats:{stats:{field:"unitbase"}}}}}};return d.raw.block.search(i,{currency:e}).then((function(e){var t=e.aggregations;if(t.ud&&t.ud.buckets&&t.ud.buckets.length)return(t.ud.buckets||[]).reduce((function(e,t){return e[n[t.from]]=u(t.ud_stats.sum,t.unitbase_stats.min)/100,e}),{})}))},d.blockchain.movement=function(e,n){(n=m(n)).withUD=!angular.isDefined(n.withUD)||n.withUD;var i=[];if(n.withUD&&!n.memberships)return l.memberships(n.pubkey).then((function(t){return n.memberships=t||[],d.blockchain.movement(e,n)}));var a=moment.unix(n.startTime).utc().startOf(n.rangeDuration),o=moment.unix(n.endTime).utc().startOf(n.rangeDuration),r=[],s=[],c={},u=angular.copy(n.memberships).reverse(),p=u.pop();function E(e){if(r.push(e),p&&p.joinTime<e.to){var t={from:Math.max(p.joinTime,e.from),to:Math.min(p.leaveTime,e.to)};for(s.push(t),c[t.from]=e.from;p&&p.leaveTime&&p.leaveTime<e.to;)p=u.pop()}}for(E({from:0,to:a.unix()});a.isBefore(o);)E({from:a.unix(),to:a.add(1,n.rangeDuration).unix()}),(!i.length&&r.length==n.maxRangeSize+1||i.length&&r.length==n.maxRangeSize||!a.isBefore(o))&&(s.length?i.push(t.all([d.raw.movement.getUds(e,s,c),d.raw.movement.getByRange(e,n.pubkey,r)]).then((function(e){var t=e[0];return(e=e[1]).forEach((function(e){e.ud=t[e.from]||0})),e}))):i.push(d.raw.movement.getByRange(e,n.pubkey,r).then((function(e){return e.forEach((function(e){e.ud=0})),e}))),r=[]);return t.all(i).then((function(e){if((e=e.reduce((function(e,t){return t&&t.length?e.concat(t):e}),[])).length){var t=(e=_.sortBy(e,"from")).splice(0,1)[0],n=t.received+t.sent+t.ud;return{times:_.pluck(e,"from"),ud:_.pluck(e,"ud"),sent:_.pluck(e,"sent"),received:_.pluck(e,"received"),balance:e.reduce((function(e,t){return n+=t.received+t.sent+t.ud,e.concat(n)}),[])}}}))},d.wot.certifications=function(e){return e=m(e),r.load(e.pubkey).then((function(t){if(t){var n={};_.forEach(t.given_cert||[],(function(t){var i=moment.unix(t.time).utc().startOf(e.rangeDuration).unix();n[i]=n[i]||{time:i,given:0,received:0},n[i].given++})),_.forEach(t.received_cert||[],(function(t){var i=moment.unix(t.time).utc().startOf(e.rangeDuration).unix();n[i]=n[i]||{time:i,given:0,received:0},n[i].received++})),n=_.sortBy(_.values(n),"time");var i={times:_.pluck(n,"time"),deltaGiven:_.pluck(n,"given"),deltaReceived:_.pluck(n,"received")},a=0;return i.given=i.deltaGiven.reduce((function(e,t){return a+=t,e.concat(a)}),[]),a=0,i.received=i.deltaReceived.reduce((function(e,t){return a+=t,e.concat(a)}),[]),i}}))},d.wot.memberships=function(e){var t={size:1e3,query:{bool:{filter:[{term:{recipient:(e=e||{}).pubkey}},{terms:{code:["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"]}}]}},sort:[{time:{order:"asc"}}],_source:["code","time"]};return d.raw.user.event(t).then((function(e){if(e.hits&&e.hits.total){var t,n=e.hits.hits.reduce((function(e,n){var i="MEMBER_JOIN"==n._source.code||"MEMBER_ACTIVE"==n._source.code;return i&&!t?t=n._source.time:!i&&t&&(e=e.concat({joinTime:t,leaveTime:n._source.time}),t=0),e}),[]);return t&&n.push({joinTime:t,leaveTime:moment().utc().unix()}),n}}))},d.docstat.get=function(e){e=m(e);var n=d.raw.docstat.search;if(e.server){var i=e.server.split(":");n=p(i[0],i[1]||80,e.useSsl).docstat.search}for(var a=[],o=moment.unix(e.startTime).utc().startOf(e.rangeDuration),r=moment.unix(e.endTime).utc().startOf(e.rangeDuration),s=[],l=function(e){var t=e.aggregations;return(t.range&&t.range.buckets||[]).reduce((function(e,t){var n={from:t.from,to:t.to};return _.forEach(t.index&&t.index.buckets||[],(function(e){var t=e.key;_.forEach(e.type&&e.type.buckets||[],(function(e){var i=t+"_"+e.key;n[i]=e.max.value,u[i]||(u[i]=!0)}))})),e.concat(n)}),[])};o.isBefore(r);)if(s.push({from:o.unix(),to:o.add(1,e.rangeDuration).unix()}),s.length===e.maxRangeSize||!o.isBefore(r)){var c={size:0,aggs:{range:{range:{field:"time",ranges:s},aggs:{index:{terms:{field:"index",size:0},aggs:{type:{terms:{field:"type",size:0},aggs:{max:{max:{field:"count"}}}}}}}}}};s=[];var u={},E={request_cache:!angular.isDefined(e.cache)||e.cache};10===a.length?(console.error("Too many parallel jobs!"),o=moment.unix(e.endTime).utc()):a.push(n(c,E).then(l))}return t.all(a).then((function(e){return e=e.reduce((function(e,t){return t&&t.length?e.concat(t):e}),[]),e=_.sortBy(e,"from"),_.keys(u).reduce((function(t,n){return t[n]=_.pluck(e,n),t}),{times:_.pluck(e,"from")})}))},d.synchro.execution.get=function(e){e=m(e);var n=d.raw.synchro.search;if(e.server){var i=e.server.split(":");n=p(i[0],i[1]||80,e.useSsl).synchro.search}for(var a=[],o=moment.unix(e.startTime).utc().startOf(e.rangeDuration),r=moment.unix(e.endTime).utc().startOf(e.rangeDuration),s=[],l=function(e){var t=e.aggregations;return(t.range&&t.range.buckets||[]).reduce((function(e,t){var n={from:t.from,to:t.to,inserts:t.result.inserts.value,updates:t.result.inserts.value,deletes:t.result.deletes.value,duration:t.duration.value};return _.forEach(t.api&&t.api.buckets||[],(function(e){n[e.key]=e.peer_count&&e.peer_count.value||0,u[e.key]||(u[e.key]=!0)})),e.concat(n)}),[])};o.isBefore(r);)if(s.push({from:o.unix(),to:o.add(1,e.rangeDuration).unix()}),s.length===e.maxRangeSize||!o.isBefore(r)){var c={size:0,aggs:{range:{range:{field:"time",ranges:s},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"}}}}}}}};s=[];var u={};10===a.length?(console.error("Too many parallel jobs!"),o=moment.unix(e.endTime).utc()):a.push(n(c,{currency:e.currency}).then(l))}return t.all(a).then((function(e){e=e.reduce((function(e,t){return t&&t.length?e.concat(t):e}),[]),e=_.sortBy(e,"from");var t={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(n){t[n]=_.pluck(e,n)})),t}))},a.api.node.on.stop(e,(function(){console.debug("[graph] Cleaning cache {prefix: '{0}'}...".format("gpData-")),s.clear("gpData-")}),this),d}]),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]}},t={scale:{}};return t.scale.custom=function(e,t,n,i){function a(e){switch(e){case 0:return 0;case 1:return-1;case 2:return 0;case 3:return 1}}t=t>0&&t||.55;for(var o=Math.round(e/2.5),r=n&&3==n.length?angular.copy(n):[255,0,0],s=i&&3==i.length?angular.copy(i):[0,2,3],l=n?[Math.round(255/o),Math.round(255/o),Math.round(255/o)]:[Math.round((r[0]-50)/o),Math.round((255-r[1])/o),Math.round((255-r[2])/o)],c=[a(s[0]),a(s[1]),a(s[2])],d=[0,0,0],u=[],p=0;p<e;p++){for(var m=0;m<3;m++)r[m]+=c[m]*l[m],d[m]++,((r[m]<=0||r[m]>=255)&&0!==c[m]||0===c[m]&&d[m]==o)&&(r[m]<=0?r[m]=0:r[m]>=255&&(r[m]=255),s[m]=(s[m]+1)%4,c[m]=a(s[m]),d[m]=0);u.push("rgba("+r[0]+","+r[1]+","+r[2]+","+t+")")}return u},t.scale.default=function(){return t.scale.custom(25)},t.scale.fix=function(e,n){return Array.apply(null,Array(e||25)).map(String.prototype.valueOf,n||t.rgba.calm(.5))},t.rgba=_.mapObject(e.css2Rgb,(function(e){var t="rgba("+e.join(",")+",";return function(n){return!n||n<0?"rgb("+e.join(",")+")":t+n+")"}})),t.rgba.translucent=function(){return"rgb(0,0,0,0)"},t.constants=e,t})),Ke.$inject=["$scope","$filter","$ionicPopover","$ionicHistory","$state","csSettings","csCurrency","esHttp","UIUtils"],angular.module("cesium.graph.common.controllers",["cesium.services"]).controller("GpCurrencyAbstractCtrl",Ke),je.$inject=["$scope","$controller","$q","$state","$filter","$translate","gpData","gpColor"],ze.$inject=["$scope","$controller","$q","$state","$translate","gpColor","gpData"],angular.module("cesium.graph.blockchain.controllers",["chart.js","cesium.services","cesium.graph.services"]).config(["$stateProvider",function(e){e.state("app.blockchain_stats",{url:"/blockchain/stats?currency&stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/blockchain/view_stats.html"}}}).state("app.currency_blockchain_stats",{url:"/:currency/blockchain/stats",views:{menuContent:{templateUrl:"plugins/graph/templates/blockchain/view_stats.html"}}})}]).controller("GpBlockchainTxCountCtrl",je).controller("GpBlockchainIssuersCtrl",ze),qe.$inject=["$scope","$timeout","PluginService","esSettings","csCurrency","gpData"],angular.module("cesium.graph.network.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){n.plugins&&n.plugins.es&&(t.extendState("app.network",{points:{"blockchain-buttons":{templateUrl:"plugins/graph/templates/network/view_network_extend.html",controller:"ESExtensionCtrl"}}}).extendState("app.view_peer",{points:{general:{templateUrl:"plugins/graph/templates/network/view_peer_extend.html",controller:"GpPeerViewExtendCtrl"}}}).extendState("app.es_network",{points:{"documents-buttons":{templateUrl:"plugins/graph/templates/network/view_es_network_extend.html",controller:"ESExtensionCtrl"}}}).extendState("app.view_es_peer",{points:{general:{templateUrl:"plugins/graph/templates/network/view_es_peer_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_peer_stats",{url:"/network/peer/:pubkey/stats",views:{menuContent:{templateUrl:"plugins/graph/templates/network/view_peer_stats.html",controller:"GpBlockchainTxCountCtrl"}}}))}]).controller("GpPeerViewExtendCtrl",qe),Xe.$inject=["$scope","PluginService","UIUtils","esSettings"],Qe.$inject=["$scope","$controller","$q","$state","$translate","UIUtils","gpColor","gpData","$filter","csSettings"],Je.$inject=["$scope","$q","$controller","$translate","gpColor","gpData","$filter","UIUtils"],Ze.$inject=["$scope","$controller","$q","$state","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.currency.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){e.state("app.currency.tab_parameters_stats",{url:"/parameters/stats",views:{"tab-parameters":{templateUrl:"plugins/graph/templates/currency/tabs/tab_parameters_stats.html"}}}).state("app.currency.tab_wot_stats",{url:"/community/stats",views:{"tab-wot":{templateUrl:"plugins/graph/templates/currency/tabs/tab_wot_stats.html",controller:"GpCurrencyMembersCountCtrl"}}}).state("app.currency.tab_network_stats",{url:"/network/stats",views:{"tab-network":{templateUrl:"plugins/graph/templates/currency/tabs/tab_network_stats.html"}}}).state("app.currency.tab_blocks_stats",{url:"/blocks/stats",views:{"tab-blocks":{templateUrl:"plugins/graph/templates/currency/tabs/tab_blocks_stats.html"}}}).state("app.currency_stats_lg",{url:"/currency/stats/lg?hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/currency/view_stats_lg.html"}}}),n.plugins&&n.plugins.es&&t.extendStates(["app.currency_name","app.currency","app.currency_name_lg","app.currency_lg"],{points:{"parameters-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"},"wot-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"},"network-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"}}}).extendStates(["app.currency.tab_blocks"],{points:{buttons:{templateUrl:"plugins/graph/templates/currency/tab_blocks_extend.html",controller:"GpCurrencyViewExtendCtrl"}}})}]).controller("GpCurrencyViewExtendCtrl",Xe).controller("GpCurrencyMonetaryMassCtrl",Qe).controller("GpCurrencyDUCtrl",Je).controller("GpCurrencyMembersCountCtrl",Ze),et.$inject=["$scope","$controller","$q","$state","$filter","$translate","csWot","gpData","gpColor","csWallet"],tt.$inject=["$scope","$controller","$filter","$state","csTx","gpColor"],nt.$inject=["$scope","$controller","$q","$state","$filter","$translate","gpData","gpColor","csWallet"],angular.module("cesium.graph.account.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){n.plugins&&n.plugins.es&&(t.extendState("app.view_wallet_tx",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_wallet_tx_extend.html",controller:"ESExtensionCtrl"}}}).extendState("app.view_wallet_tx_by_id",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_wallet_tx_extend.html",controller:"ESExtensionCtrl"}}}).extendStates(["app.wot_identity_tx_uid","app.wot_identity_tx_uid_lg"],{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_identity_tx_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_wallet_stats",{url:"/wallet/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}},data:{auth:!0}}).state("app.view_wallet_stats_by_id",{url:"/wallets/:id/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}},data:{auth:!0}}).state("app.wot_identity_stats",{url:"/wot/:pubkey/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}}}))}]).controller("GpAccountBalanceCtrl",et).controller("GpAccountSumTxCtrl",tt).controller("GpAccountCertificationCtrl",nt),it.$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,t,n){e.state("app.doc_stats_lg",{url:"/network/data/stats/:server?stepUnit&t&hide&scale&useSsl&useTor",views:{menuContent:{templateUrl:"plugins/graph/templates/docstats/view_stats.html",controller:"GpDocStatsCtrl"}}}).state("app.doc_stats_lg_old",{url:"/data/stats?stepUnit&t&hide&scale&useSsl&useTor",views:{menuContent:{templateUrl:"plugins/graph/templates/docstats/view_stats.html",controller:"GpDocStatsCtrl"}}}),n.plugins&&n.plugins.es}]).controller("GpDocStatsCtrl",it),at.$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,t,n){e.state("app.doc_synchro_lg",{url:"/network/data/synchro/:server?stepUnit&t&hide&scale&useSsl&useTor",views:{menuContent:{templateUrl:"plugins/graph/templates/synchro/view_stats.html",controller:"GpSynchroCtrl"}}}).state("app.doc_synchro_lg_old",{url:"/data/synchro?stepUnit&t&hide&scale&useSsl&useTor",views:{menuContent:{templateUrl:"plugins/graph/templates/synchro/view_stats.html",controller:"GpSynchroCtrl"}}}),n.plugins&&n.plugins.es}]).controller("GpSynchroCtrl",at),angular.module("cesium.map.plugin",["ui-leaflet","cesium.map.services","cesium.map.common.controllers","cesium.map.wot.controllers","cesium.map.registry.controllers","cesium.map.network.controllers","cesium.map.user.controllers","cesium.map.settings.controllers","cesium.map.help.controllers"]).config((function(){L.AwesomeMarkers.Icon.prototype.options.prefix="ion"})),angular.module("cesium.map.services",["cesium.map.wot.services","cesium.map.registry.services","cesium.map.utils.services"]),angular.module("cesium.map.wot.services",["cesium.services"]).factory("mapWot",["$q","csHttp","esHttp","esSettings","csWot","BMA","esGeo",function(e,t,n,i,a,o,r){var s=this,l={min:["title","geoPoint"],profile:["title","geoPoint","avatar._content_type","address","city"]};function c(e){var t={bool:{}};if((e=e||{}).searchAddress?t.bool.should=[{exists:{field:"geoPoint"}},{exists:{field:"city"}}]:t.bool.must=[{exists:{field:"geoPoint"}}],e.bounds&&e.bounds.northEast&&e.bounds.southWest){var n={geoPoint:{top_left:{lat:Math.max(Math.min(e.bounds.northEast.lat,90),-90),lon:Math.max(Math.min(e.bounds.southWest.lng,180),-180)},bottom_right:{lat:Math.max(Math.min(e.bounds.southWest.lat,90),-90),lon:Math.max(Math.min(e.bounds.northEast.lng,180),-180)}}};console.debug("[map] [wot] Filtering on bounds: ",e.bounds),t.bool.must=t.bool.must||[],t.bool.must.push({geo_bounding_box:n})}return t}function d(t,i,a,o){var s=new RegExp("[,]"),l=[],c=o.hits.hits.reduce((function(e,o){var r=o._id,c=i[r],d=c&&{uid:c}||a[r]||{};if(d.pubkey=r,d.index=o._index,d.city=o._source.city,d.address=o._source.address,d.geoPoint=o._source.geoPoint,d.geoPoint&&d.geoPoint.lat&&d.geoPoint.lon)d.geoPoint.lat&&"string"==typeof d.geoPoint.lat&&(d.geoPoint.lat=parseFloat(d.geoPoint.lat.replace(s,"."))),d.geoPoint.lon&&"string"==typeof d.geoPoint.lon&&(d.geoPoint.lon=parseFloat(d.geoPoint.lon.replace(s,".")));else{if(!t.searchAddress||!d.city)return e;d.searchAddress=d.city&&(o._source.address?o._source.address+", ":"")+d.city,l.push(d)}return d.avatar=n.image.fromHit(o,"avatar"),d.name=o._source.title,d.name&&d.name.length>30&&(d.name=d.name.substr(0,27)+"..."),d.description=o._source.description&&n.util.parseAsHtml(o._source.description),d.geoPoint?e.concat(d):e}),[]);if(l.length){var d=Date.now();console.debug("[map] [wot] Search positions of {0} addresses...".format(l.length));var u=0;return e.all(l.reduce((function(e,t){return t.city?e.concat(r.google.searchByAddress(t.searchAddress).then((function(e){e&&e.length&&(t.geoPoint=e[0],t.city==t.searchAddress&&(t.geoPoint.lon+=Math.random()/1e3,t.geoPoint.lat+=Math.random()/1e3),delete t.searchAddress,c.push(t),u++)})).catch((function(){}))):e}),[])).then((function(){return console.debug("[map] [wot] Resolved {0}/{1} addresses in {2}ms".format(u,l.length,Date.now()-d)),c}))}return e.when(c)}return s.raw={profile:{search:n.post("/user/profile/_search"),mixedSearch:n.post("/user,page,group/profile,record/_search")}},{load:function(t){(t=t||{}).from=t.from||0,t.size=t.size||1e3,t.searchAddress=r.google.isEnable()&&(!angular.isDefined(t.searchAddress)||t.searchAddress),t.fields=t.fields||{},t.fields.description=!!angular.isDefined(t.fields.description)&&t.fields.description;var n={query:c(t),from:0,size:t.size,_source:t.fields.description?l.profile.concat("description"):l.profile},i=s.raw.profile.search;return e.all([i(n),o.wot.member.uids(),o.wot.member.pending().then((function(e){return e.memberships&&e.memberships.length?e.memberships:[]}))]).then((function(a){var o=a[1],r=a[2];if(!(a=a[0]).hits||!a.hits.total)return[];r=r.reduce((function(e,t){if("IN"==t.membership&&!o[t.pubkey]){var n={uid:t.uid,pubkey:t.pubkey,block:t.blockNumber,blockHash:t.blockHash,pending:!0},i=e[t.pubkey];if(i&&n.block>i.block)return e;e[n.pubkey]=n}return e}),{});var s=[d(t,o,r,a)];n.from+=n.size;for(var l=function(e){return e.hits&&e.hits.hits.length?d(t,o,r,e):[]};n.from<a.hits.total;){var c=i(angular.copy(n)).then(l);s.push(c),n.from+=n.size}return e.all(s).then((function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}))}))}}}]),angular.module("cesium.map.registry.services",["cesium.services"]).factory("mapRegistry",["$q","csHttp","esHttp","esSettings","csWot","BMA","esGeo",function(e,t,n,i,a,o,r){var s=this,l={record:["title","geoPoint","avatar._content_type","address","city","type","pubkey","issuer","category"]};function c(e){var t={bool:{}};return(e=e||{}).searchAddress?t.bool.should=[{exists:{field:"geoPoint"}},{exists:{field:"city"}}]:t.bool.must=[{exists:{field:"geoPoint"}}],e.bounds&&e.bounds.northEast&&e.bounds.southWest&&(t.bool.should=t.bool.should||{},t.bool.should.geo_bounding_box={geoPoint:{top_left:{lat:Math.max(Math.min(e.bounds.northEast.lat,90),-90),lon:Math.max(Math.min(e.bounds.southWest.lng,180),-180)},bottom_right:{lat:Math.max(Math.min(e.bounds.southWest.lat,90),-90),lon:Math.max(Math.min(e.bounds.northEast.lng,180),-180)}}}),t}function d(t,i){var a=new RegExp("[,]"),o=[],s=i.hits.hits.reduce((function(e,i){var r=i._source.issuer,s={};if(s.issuer=r,s.pubkey=i._source.pubkey||s.issuer,s.id=i._id,s.index=i._index,s.type=i._source.type,s.category=i._source.category,s.category&&delete s.category.parent,s.city=i._source.city,s.address=i._source.address,s.geoPoint=i._source.geoPoint,s.geoPoint&&s.geoPoint.lat&&s.geoPoint.lon)s.geoPoint.lat&&"string"==typeof s.geoPoint.lat&&(s.geoPoint.lat=parseFloat(s.geoPoint.lat.replace(a,"."))),s.geoPoint.lon&&"string"==typeof s.geoPoint.lon&&(s.geoPoint.lon=parseFloat(s.geoPoint.lon.replace(a,".")));else{if(!t.searchAddress||!s.city)return e;s.searchAddress=s.city&&(i._source.address?i._source.address+", ":"")+s.city,o.push(s)}return s.avatar=n.image.fromHit(i,"avatar"),s.name=i._source.title,s.name&&s.name.length>30&&(s.name=s.name.substr(0,27)+"..."),s.description=i._source.description&&n.util.parseAsHtml(i._source.description),s.geoPoint?e.concat(s):e}),[]);if(o.length){var l=Date.now();console.debug("[map] [registry] Search positions of {0} addresses...".format(o.length));var c=0;return e.all(o.reduce((function(e,t){return t.city?e.concat(r.google.searchByAddress(t.searchAddress).then((function(e){e&&e.length&&(t.geoPoint=e[0],t.city==t.searchAddress&&(t.geoPoint.lon+=Math.random()/1e3,t.geoPoint.lat+=Math.random()/1e3),delete t.searchAddress,s.push(t),c++)})).catch((function(){}))):e}),[])).then((function(){return console.debug("[map] [registry] Resolved {0}/{1} addresses in {2}ms".format(c,o.length,Date.now()-l)),s}))}return e.when(s)}return s.raw={profile:{search:n.post("/page/record/_search"),mixedSearch:n.post("/user,page,group/profile,record/_search")}},{load:function(t){(t=t||{}).from=t.from||0,t.size=t.size||1e3,t.searchAddress=r.google.isEnable()&&(!angular.isDefined(t.searchAddress)||t.searchAddress),t.fields=t.fields||{},t.fields.description=!angular.isDefined(t.fields.description)||t.fields.description;var n={query:c(t),from:0,size:t.size,_source:t.fields.description?l.record.concat("description"):l.record},i=s.raw.profile.search,a=function(n){return n.hits&&n.hits.hits.length?d(t,n):e.when([])};return i(n).then((function(o){if(!o.hits||!o.hits.total)return[];var r=[d(t,o)];for(n.from+=n.size;n.from<o.hits.total;)r.push(i(angular.copy(n)).then(a)),n.from+=n.size;return e.all(r).then((function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}))}))}}}]),angular.module("cesium.map.utils.services",["cesium.services","ui-leaflet"]).factory("MapUtils",["$timeout","$q","$translate","$window","leafletData","csConfig","csSettings","esGeo","UIUtils","leafletHelpers",function(e,t,n,i,a,o,r,s,l,c){var d=o.plugins&&o.plugins.es&&o.plugins.es.googleApiKey,u={locations:{FRANCE:{lat:46.5588603,lng:4.229736328124999,zoom:6}},LOCALIZE_ZOOM:15},p={cache:{}};function m(e,t){return c.isSameCenterOnMap(e,t)}function E(e,t){if(!e||!t)throw"Illegal arguments";if(e._container)e._container.id=t;else{var n=e.onAdd;e.onAdd=function(e){var i=n.call(this,e);return i.id=t,i}}}return u.DEFAULT_CENTER=r.data&&r.data.plugins&&r.data.plugins.map&&r.data.plugins.map.center||u.locations.FRANCE,{map:function(e){var t;return(e=angular.merge({center:angular.copy(u.DEFAULT_CENTER),cache:!1,defaults:{scrollWheelZoom:!0,tileLayerOptions:{attribution:'© <a target="_blank" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}},layers:{baselayers:{osm:{name:"OpenStreetMap",type:"xyz",url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",layerOptions:{subdomains:["a","b","c"],attribution:'&copy; <a target="_blank" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',continuousWorld:!0}},google:{name:"Google map",type:"xyz",url:"https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key="+d,layerOptions:{subdomains:["mt0","mt1","mt2","mt3"],attribution:'&copy; <a target="_blank" href="https://www.google.com/intl/fr_fr/help/terms_maps.html">Google</a>',continuousWorld:!0}}}},controls:{custom:[]}},e||{})).cache&&p.cache[e.cache]&&(console.debug("[map] Restoring map from cache :",p.cache[e.cache]),e=angular.merge(e,p.cache[e.cache])),e.layers.overlays&&(t=_.keys(e.layers.overlays).reduce((function(t,n){return t.concat(e.layers.overlays[n].name)}),[]),n(t).then((function(t){_.keys(e.layers.overlays||{}).forEach((function(n){e.layers.overlays[n].name=t[e.layers.overlays[n].name]}))}))),e},updateCenter:function(n,i){return m(i,n)?t.when():e((function(){n.invalidateSize(),n._resetView(i,i.zoom,!0)}),300)},center:{get:function(e){var t;if(e&&(e.lat&&((t={}).lat=parseFloat(e.lat)),(e.lng||e.lon)&&((t=t||{}).lng=parseFloat(e.lng||e.lon)),e.zoom&&((t=t||{}).zoom=parseFloat(e.zoom)),t))return c.isValidCenter(t)||(t=angular.merge({},u.DEFAULT_CENTER,t)),t},isSame:m,isDefault:function(e){var t=u.DEFAULT_CENTER;return!(!e.lat||!e.lng||t.lat.toFixed(4)!==e.lat.toFixed(4)||t.lng.toFixed(4)!==e.lng.toFixed(4)||t.zoom!==e.zoom)}},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:u.LOCALIZE_ZOOM,e.markerLocation=!angular.isDefined(e.markerLocation)||e.markerLocation;var t=n(["MAP.COMMON.SEARCH_DOTS","COMMON.SEARCH_NO_RESULT"]);return{addTo:function(n){t.then((function(t){var i=L.control.search(angular.merge(e,{textPlaceholder:t["MAP.COMMON.SEARCH_DOTS"],textErr:t["COMMON.SEARCH_NO_RESULT"]}));e.id&&E(i,e.id),i.addTo(n)}))}}},localizeMe:function(e){return e=e||{},L.easyButton({position:"topleft",type:"replace",leafletClasses:!0,states:[{stateName:"locate-me",onClick:function(e,t){s.point.current().then((function(e){t.setView({lat:e.lat,lng:e.lon},u.LOCALIZE_ZOOM)})).catch((function(e){console.error(e),l.alert.error("MAP.ERROR.LOCALIZE_ME_FAILED")}))},title:e.title,icon:"icon ion-android-locate"}]})},setId:E},cache:{bind:function(e,t,n){if(n=n||{},!t||!n.layers||!e)throw"Illegal arguments";if(n.cache){if(n.layers.overlays){var o=_.keys(n.layers.overlays);p.cache[n.cache]||(p.cache[n.cache]={center:n.center,bounds:n.bounds,layers:angular.copy(n.layers)}),a.getMap(t).then((function(){_(i.document.querySelectorAll("#{0} .leaflet-control-layers-overlays input[type=checkbox]".format(t))).forEach((function(e,t){var i=o[t],a=n.layers.overlays[i].visible;e.addEventListener("change",(function(e){a=!a,p.cache[n.cache].layers.overlays[i].visible=a}))}))}))}e.$on("$ionicView.leave",(function(){p.cache[n.cache].center=n.center,p.cache[n.cache].bounds=n.bounds}))}}},constants:u}}]),ot.$inject=["$scope","$timeout","$q","MapUtils","$translate"],angular.module("cesium.map.common.controllers",["cesium.services","cesium.map.services"]).controller("MapEditPositionAbstractCtrl",ot),rt.$inject=["$scope","$filter","$templateCache","$interpolate","$timeout","$location","$translate","$q","$controller","ionicReady","leafletData","UIUtils","csSettings","csWallet","MapUtils","mapWot"],angular.module("cesium.map.wot.controllers",["cesium.services","cesium.map.services","cesium.map.help.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){n.plugins&&n.plugins.es&&(t.extendState("app.wot_lookup.tab_search",{points:{"nav-buttons":{template:'<button class="button button-icon button-clear" ui-sref="app.view_wot_map"><i class="icon ion-ios-location"></i></button>'}}}).extendState("app.wot_lookup_lg",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/wot/lookup_lg_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_wot_map",{url:"/wot/map?c&center",views:{menuContent:{templateUrl:"plugins/map/templates/wot/view_map.html",controller:"MapWotViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapWotViewCtrl",rt),st.$inject=["$scope","$filter","$templateCache","$interpolate","$timeout","$location","$translate","$q","ionicReady","leafletData","UIUtils","csSettings","csWallet","MapUtils","mapRegistry"],lt.$inject=["$scope","$controller"],angular.module("cesium.map.registry.controllers",["cesium.services","cesium.map.services","cesium.map.help.controllers","cesium.map.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){n.plugins&&n.plugins.es&&(t.extendState("app.wot_lookup.tab_registry",{points:{"nav-buttons":{template:'<button class="button button-icon button-clear" ui-sref="app.view_registry_map"><i class="icon ion-ios-location"></i></button>'}}}).extendState("app.registry_lookup_lg",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/registry/lookup_lg_extend.html"}}}).extendState("app.registry_edit_record",{points:{"after-position":{templateUrl:"plugins/map/templates/common/edit_position_extend.html",controller:"MapPageEditCtrl"}}}),e.state("app.view_registry_map",{url:"/wot/pagemap?c&center",views:{menuContent:{templateUrl:"plugins/map/templates/registry/view_map.html",controller:"MapRegistryViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapRegistryViewCtrl",st).controller("MapPageEditCtrl",lt),angular.module("cesium.map.network.controllers",["cesium.services","cesium.map.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){n.plugins&&n.plugins.es&&(t.extendState("app.network",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/network/lookup_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_network_map",{url:"/network/map?c",views:{menuContent:{templateUrl:"plugins/map/templates/network/view_map.html",controller:"MapNetworkViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapNetworkViewCtrl",["$scope","$controller","$q","$interpolate","$translate","$filter","$templateCache","$timeout","$location","esGeo","UIUtils","csNetwork","MapUtils","leafletData",function(e,t,n,i,a,o,r,s,l,c,d,u,p,m){angular.extend(this,t("NetworkLookupCtrl",{$scope:e}));var E,b,g=o("formatPubkey"),f={member:{type:"awesomeMarker",icon:"person",markerColor:"green",iconColor:"white"},mirror:{type:"awesomeMarker",icon:"radio-waves",markerColor:"green",iconColor:"white"},offline:{type:"awesomeMarker",icon:"ion-close-circled",markerColor:"red",iconColor:"white"}},h={},T=0;E='<div class="item item-peer item-icon-left no-border" ng-click="selectPeer(peer)">',E+=r.get("templates/network/item_content_peer.html"),E=(E+="</div>").replace(/[:]rebind[:]|[:][:]/g,""),e.loading=!0,e.mapId="map-network-"+e.$id,e.helptipPrefix="helptip-"+e.mapId,e.map=p.map({cache:"map-network",layers:{overlays:{member:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.MEMBER",visible:!0},mirror:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.MIRROR",visible:!0},offline:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.OFFLINE",visible:!1}}},bounds:{},loading:!0,markers:{}});var v=e.enter;e.enter=function(t,n){if(!e.loading)return e.updateLocationHref(),v(t,n);if(n.stateParams&&n.stateParams.c){var i=n.stateParams.c.split(":");e.map.center.lat=parseFloat(i[0]),e.map.center.lng=parseFloat(i[1]),e.map.center.zoom=parseInt(i[2])}e.$watch("map.center",(function(){if(!e.map.loading)return s((function(){e.updateLocationHref()}),300)}),!0),e.loadMap().then((function(e){return e.fire("dataloading"),v(t,n)}))},e.$on("$ionicView.enter",e.enter);var I=e.computeOptions;e.computeOptions=function(){var e=I();return e.filter.online="all",e},e.loadMap=function(){return m.getMap(e.mapId).then((function(t){if(!e.map.loading)return t;L.Control.loading({position:"topright",separate:!0}).addTo(t),b=L.layerGroup({visible:!1});var n=i(r.get("plugins/map/templates/network/item_search_tooltip.html"));p.control.search({layer:b,propertyName:"title",buildTip:function(e,t){return n(t.layer.options)},moveToLocation:function(e,t,n){this.options.zoom?this._map.setView(e,this.options.zoom):this._map.panTo(e);var i=e.layer&&e.layer.options&&e.layer.options.popupMarkerId;i&&s((function(){var e=_.find(n._layers,(function(e){return e.options&&e.options.id===i}));e&&e.openPopup()}),400)},firstTipSubmit:!0,tooltipLimit:50}).addTo(t);var a=function(e){return e.options&&e.options.icon.options.markerColor},o=L.markerClusterGroup({disableClusteringAtZoom:p.constants.LOCALIZE_ZOOM,maxClusterRadius:65,showCoverageOnHover:!1,iconCreateFunction:function(e){var t=_.countBy(e.getAllChildMarkers(),a),n=t.green?"green":t.lightgreen?"lightgreen":t.lightgray?"lightgray":"red",i=e.getChildCount(),o="marker-cluster "+n+" marker-cluster-";return o+=i<10?"small":i<100?"medium":"large",L.divIcon({html:"<div><span>"+i+"</span></div>",className:o,iconSize:new L.Point(40,40)})}});return t.eachLayer((function(e){e.addLayer&&angular.extend(e,L.featureGroup.subGroup(o))})),c.point.ip.license&&(o.getAttribution=function(){return'<a target="_blank" href="{0}">{1}</a>'.format(c.point.ip.license.url,c.point.ip.license.name)}),o.addTo(t),e.map.loading=!1,t}))},e.updateView=function(t){console.debug("[map] [peers] Updating UI"),e.search.loading=!e.networkStarted||u.isBusy();var n=angular.copy(h);_.forEach(t.peers||[],(function(t){if(!t.isTor()){var i=h[t.id];if(i&&e.map.markers[i])return e.updateMarker(e.map.markers[i],t),void delete n[t.id];var a=t.bma,o=t.hasValid4(a)?a.ipv4:a.dns||a.ipv6;c.point.ip.search(o).then((function(n){i=""+T++;var o=e.updateMarker({position:n,getMessageScope:function(){var n=e.$new();return n.peer=t,n},draggable:!1,focus:!1,message:E,id:i},t);e.map.markers[i]=o,h[t.id]=i;var r,s=(t.dns||t.server)+(t.uid?" | "+(t.name||t.uid):"")+" | "+g(t.pubkey);a.ipv4&&!(t.dns||t.server).startsWith(a.ipv4)&&(r=a.ipv4,s+=" | "+a.ipv4),b.addLayer(new L.Marker({lat:n.lat,lng:n.lng},{opacity:0,icon:L.divIcon({className:"ng-hide",iconSize:L.point(0,0)}),title:s,peer:angular.extend({ipv4:r},t),popupMarkerId:i}))})).catch((function(e){console.debug("No position found for address ["+o+"]",e)}))}})),_.forEach(_.keys(n),(function(e){delete h[e]})),_.forEach(_.values(n),(function(t){delete e.map.markers[t]})),e.search.loading||m.getMap(e.mapId).then((function(t){e.loading=!1,t.fire("dataload")}))},e.updateMarker=function(e,t){return e.layer=t.online?t.uid?"member":"mirror":"offline",e.icon=angular.copy(f[e.layer]),e.opacity=(t.online,1),e.title=t.dns||t.server,t.online&&!t.hasMainConsensusBlock&&(e.icon.markerColor=t.hasConsensusBlock?"lightgreen":"lightgray",e.opacity=t.hasConsensusBlock?.9:.8),e.lng||(e.lng=e.position.lng+Math.random()/1e3,e.lat=e.position.lat+Math.random()/1e3),e},e.updateLocationHref=function(t){(l.search()||{}).c&&p.center.isDefault(e.map.center)||(t=t||"{0}:{1}:{2}".format(e.map.center.lat.toFixed(4),e.map.center.lng.toFixed(4),e.map.center.zoom),l.search({c:t}).replace())},e.$on("centerUrlHash",(function(t,n){if(!e.loading)return s((function(){e.updateLocationHref(n)}),300)})),e.showHelpTip=function(){}}]),ct.$inject=["$scope","$controller"],angular.module("cesium.map.user.controllers",["cesium.services","cesium.map.services","cesium.map.common.controllers"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.extendState("app.edit_profile",{points:{"after-position":{templateUrl:"plugins/map/templates/common/edit_position_extend.html",controller:"MapProfileEditCtrl"}}}).extendState("app.edit_profile_by_id",{points:{"after-position":{templateUrl:"plugins/map/templates/common/edit_position_extend.html",controller:"MapProfileEditCtrl"}}})}]).controller("MapProfileEditCtrl",ct),angular.module("cesium.map.settings.controllers",["cesium.services"]).config(["PluginServiceProvider","csConfig",function(e,t){t.plugins&&t.plugins.es&&e.extendState("app.es_settings",{points:{common:{templateUrl:"plugins/map/templates/settings/es_settings_extend.html"}}})}]),dt.$inject=["$scope","$controller"],angular.module("cesium.map.help.controllers",["cesium.services"]).controller("MapHelpTipCtrl",dt),angular.module("cesium",["ionic","ionic-material","ngMessages","ngSanitize","pascalprecht.translate","ngApi","angular-cache","angular.screenmatch","angular.bind.notifier","ImageCropper","ion-digit-keyboard","angular-fullscreen-toggle","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","$urlRouter","ionicReady","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet",function(e,t,n,i,a,o,r,s,l,c,d,u){d.disableChangeState();var p=!1;e.$on("$stateChangeStart",(function(t,i,a,o){if(!t.defaultPrevented&&i.data&&!e.tour&&!t.currentScope.tour){if(!p){var r;if(i.data.large&&!s.screen.isSmall())return t.preventDefault(),void n.go(i.data.large,a);var l=a.wallet&&"default"!=a.wallet?u.children.get(a.wallet):u;return a.wallet&&!l&&console.warn("[app] Unable to find the children wallet: "+a.wallet),i.data.auth&&!l.isAuth()?(t.preventDefault(),r=i.data.minData?{minData:!0}:void 0,p=!0,u.auth(r).then((function(){return p=!1,n.go(i.name,a)})).catch((function(e){if(p=!1,"CANCELLED"===e&&!n.current.name)return n.go("app.home")}))):i.data.login&&!u.isLogin()?(t.preventDefault(),r=i.data.minData?{minData:!0}:void 0,p=!0,u.login(r).then((function(){return p=!1,n.go(i.name,a)})).catch((function(e){if(p=!1,"CANCELLED"===e&&!n.current.name)return n.go("app.home")}))):!i.data.login&&!i.data.auth||(r=i.data.minData?{minData:!0}:void 0,l.isDataLoaded(r))?void 0:(t.preventDefault(),r&&r.minData||s.loading.show(),l.loadData(r).then((function(){return p=!1,n.go(i.name,a)})))}t.preventDefault()}})),u.api.data.on.unauth(e,(function(){n.current&&n.current.data&&n.current.data.auth&&n.go("app.home")})),e.$on("$locationChangeSuccess",(function(e,t,i){n.current.data&&!0===n.current.data.silentLocationChange&&i&&i.split("?")[0]===t.split("?")[0]&&e.preventDefault()})),a.listen(),c.start(),o().then((function(){ionic.Platform.isIOS()&&window.StatusBar&&StatusBar.styleLightContent()}))}]),window.ionic.Platform.ready((function(){angular.bootstrap(document,["cesium"])})),angular.module("cesium.components",[]).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>'}),angular.module("cesium.directives",[]).directive("compareTo",(function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.compareTo&&(i.$validators.compareTo=function(t){return t==e.$eval(n.compareTo)},e.$watch(n.compareTo,(function(){i.$validate()})))}}})).directive("differentTo",(function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.differentTo&&(i.$validators.differentTo=function(t){return t!=e.$eval(n.differentTo)},e.$watch(n.differentTo,(function(){i.$validate()})))}}})).directive("numberFloat",(function(){var e=new RegExp("^[0-9]+([.,][0-9]+)?$");return{require:"?ngModel",link:function(t,n,i,a){a&&(a.$validators.numberFloat=function(t){return a.$isEmpty(t)||e.test(t)})}}})).directive("numberInt",(function(){var e=new RegExp("^[0-9]+$");return{require:"ngModel",link:function(t,n,i,a){a&&(a.$validators.numberInt=function(t){return a.$isEmpty(t)||e.test(t)})}}})).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(t,n,i,a){a&&(a.$validators.email=function(t){return a.$isEmpty(t)||e.test(t)})}}})).directive("requiredIf",(function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.requiredIf&&(i.$validators.required=function(t){return!e.$eval(n.requiredIf)||!i.$isEmpty(t)},e.$watch(n.requiredIf,(function(){i.$validate()})))}}})).directive("geoPoint",(function(){return{require:"?ngModel",link:function(e,t,n,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","Device","UIUtils",function(e,t,n){return{restrict:"A",link:function(e,i,a){var o=function(i){var o=a.copyOnClick;if(o&&t.clipboard.enable)t.clipboard.copy(o).then((function(){n.toast.show("INFO.COPY_TO_CLIPBOARD_DONE")})).catch(n.onError("ERROR.COPY_CLIPBOARD"));else if(o){var r=o&&o.indexOf("\n")>=0?o.split("\n").length:1;n.popover.show(i,{scope:e,templateUrl:"templates/common/popover_copy.html",bindings:{value:a.copyOnClick,rows:r},autoselect:".popover-copy "+(r<=1?"input":"textarea")})}};i.bind("click",o),i.bind("hold",o)}}}]).directive("selectOnClick",["$window",function(e){return{restrict:"A",link:function(t,n,i){n.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(t,n,i,a){var o,r=i.activeLink;i.activeLinkPathPrefix?(o=i.activeLinkPathPrefix.substring(1),t.location=e,t.$watch("location.path()",(function(e){e&&0===e.indexOf(o)?n.addClass(r):n.removeClass(r)}))):i.href&&(o=i.href.substring(1),t.location=e,t.$watch("location.path()",(function(e){e&&e==o?n.addClass(r):n.removeClass(r)})))}}}]).directive("input",["$timeout",function(e){return{restrict:"E",scope:{returnClose:"=",onReturn:"&",onFocus:"&",onBlur:"&"},link:function(t,n,i){n.bind("focus",(function(n){t.onFocus&&e((function(){t.onFocus()}))})),n.bind("blur",(function(n){t.onBlur&&e((function(){t.onBlur()}))})),n.bind("keydown",(function(i){13==i.which&&(t.returnClose&&n[0].blur(),t.onReturn&&e((function(){t.onReturn()})))}))}}}]).directive("trustAsHtml",["$sce","$compile","$parse",function(e,t,n){return{restrict:"A",compile:function(i,a){var o=n(a.trustAsHtml),r=n(a.trustAsHtml,(function(e){return(e||"").toString()}));return t.$$addBindingClass(i),function(n,i,a){t.$$addBindingInfo(i,a.trustAsHtml),n.$watch(r,(function(){i.html(e.getTrustedHtml(e.trustAsHtml(o(n)))||""),t(i.contents())(n)}))}}}}]).directive("modalClose",["$ionicHistory","$timeout",function(e,t){return{restrict:"AC",link:function(n,i){i.bind("click",(function(){n.closeModal&&(e.nextViewOptions({historyRoot:!0,disableAnimate:!0,expire:300}),t((function(){e.nextViewOptions({historyRoot:!1,disableAnimate:!1})}),300),n.closeModal())}))}}}]).directive("csExtensionPoint",["$state","$compile","$controller","$templateCache","PluginService",function(e,t,n,i,a){return{restrict:"E",compile:function(e,t){if(angular.isDefined(t.name)){var n=a.extensions.points.getActivesByName(t.name);n.length>0&&(e.html(""),_.forEach(n,(function(t){e.append(function(e){var t=e.templateUrl?i.get(e.templateUrl):e.template;return t?(e.controller&&(t='<ng-controller ng-controller="'+e.controller+'">'+t+"</div>"),t):(console.error("[plugin] Could not found template for extension :"+(e.templateUrl?e.templateUrl:e.template)),"")}(t))})))}return{pre:function(e,t,n){a.extensions.points.current.set(n.name)},post:function(){a.extensions.points.current.set()}}},scope:{content:"="}}}]).directive("onReadFile",["$parse",function(e){return{restrict:"A",scope:!1,link:function(t,n,i){var a=e(i.onReadFile);n.on("change",(function(e){var n=new FileReader,i={name:this.files[0].name,size:this.files[0].size,type:this.files[0].type};n.onload=function(e){t.$applyAsync((function(){a(t,{file:{fileContent:e.target.result,fileData:i}})}))},n.readAsText((e.srcElement||e.target).files[0])}))}}}]).directive("dropZone",["$parse",function(e){return{restrict:"A",scope:!1,link:function(t,n,i){var a=e(i.dropZone);n.bind("dragover",(function(e){e.stopPropagation(),e.preventDefault()})),n.bind("dragenter",(function(e){e.stopPropagation(),e.preventDefault()})),n.bind("dragleave",(function(e){e.stopPropagation(),e.preventDefault()})),n.bind("drop",(function(e){e.stopPropagation(),e.preventDefault();var n=e.dataTransfer.files[0],i={name:n.name,size:n.size,type:n.type},o=new FileReader;o.onload=function(e){t.$apply((function(){a(t,{file:{file:n,fileContent:e.target.result,fileData:i}})}))},o.readAsText(e.dataTransfer.files[0])}))}}}]).directive("fileSelect",["$parse",function(e){"use strict";return{restrict:"A",scope:!1,template:'<input type="file" style="display: none;" /><ng-transclude></ng-transclude>',transclude:!0,link:function(t,n,i){var a=e(i.fileSelect),o=n.children("input[file]");i.accept&&(o[0].accept=i.accept),o.on("change",(function(e){var n=new FileReader,i=this.files[0],o={name:i.name,size:i.size,type:i.type};n.onload=function(e){t.$applyAsync((function(){a(t,{file:{file:i,fileContent:e.target.result,fileData:o}})}))},n.readAsText((e.srcElement||e.target).files[0])})),n.on("click",(function(){o[0].click()}))}}}]).directive("windowExitUnauth",["$window","csSettings","csWallet",function(e,t,n){return{restrict:"AE",link:function(i,a){(e.attachEvent||e.addEventListener)(e.attachEvent?"onunload":"unload",(function(e){if(t.data&&t.data.keepAuthIdle!=t.constants.KEEP_AUTH_IDLE_SESSION)return n.unauth()}))}}}]),angular.module("cesium.filters",["cesium.config","cesium.platform","pascalprecht.translate","cesium.translations"]).factory("filterTranslations",["$rootScope","$q","csPlatform","csSettings","csCurrency","$translate","$timeout",function(e,t,n,i,a,o,r){var s,l=!1,c=this;function d(){return console.debug("[filter] Loading translations for locale [{0}]".format(o.use())),o(["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.UD","COMMON.DAYS"]).then((function(e){c.DATE_PATTERN=e["COMMON.DATE_PATTERN"],"COMMON.DATE_PATTERN"===c.DATE_PATTERN&&(c.DATE_PATTERN="YYYY-MM-DD HH:mm"),c.DATE_SHORT_PATTERN=e["COMMON.DATE_SHORT_PATTERN"],"COMMON.DATE_SHORT_PATTERN"===c.DATE_SHORT_PATTERN&&(c.DATE_SHORT_PATTERN="YYYY-MM-DD"),c.DATE_MONTH_YEAR_PATTERN=e["COMMON.DATE_MONTH_YEAR_PATTERN"],"COMMON.DATE_MONTH_YEAR_PATTERN"===c.DATE_MONTH_YEAR_PATTERN&&(c.DATE_MONTH_YEAR_PATTERN="MMM YY"),c.DAYS=e["COMMON.DAYS"],"COMMON.DAYS"===c.DAYS&&(c.DAYS="days"),c.UD=e["COMMON.UD"],"COMMON.UD"===c.UD&&(c.UD="UD")}))}function u(){console.debug("[filter] Computing constants from currency parameters"),c.MEDIAN_TIME_OFFSET=a.data.medianTimeOffset||c.MEDIAN_TIME_OFFSET}return c.MEDIAN_TIME_OFFSET=3600,c.ready=function(){return l?t.when():s||c.start()},c.start=function(){return s=n.ready().then(d).then((function(){u(),l=!0,i.api.locale.on.changed(e,d,this),a.api.data.on.ready(e,u,this)}))},r((function(){c.start()})),c}]).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,t,n,i){var a="0,0.0"+Array(e.decimalCount||4).join("0"),o=i("currencySymbol"),r=a+"0",s=1/Math.pow(10,(e.decimalCount||4)+1);return function(e,i){if(void 0!==e)return(i&&angular.isDefined(i.useRelative)?i.useRelative:t.data.useRelative)?function(e,t){var i=t&&t.currentUD?t.currentUD:n.data.currentUD;if(i){var a=e/i;return a=Math.abs(e)<s&&0!==e?"~ 0":numeral(a).format(r),t&&t.currency?a+" "+o(t.currency,!0):a}console.warn("formatAmount: currentUD not defined")}(e,i):function(e,t){var n=numeral(e/100).format(e<-1e9||e>1e9?"0,0.000 a":a);return t&&t.currency?n+" "+o(t.currency,!1):n}(e,i)}}]).filter("formatAmountNoHtml",["csConfig","csSettings","csCurrency","$filter",function(e,t,n,i){var a=1/Math.pow(10,e.decimalCount||4),o="0,0.0"+Array(e.decimalCount||4).join("0"),r=i("currencySymbolNoHtml");return function(e,i){if(void 0!==e)return(i&&angular.isDefined(i.useRelative)?i.useRelative:t.data.useRelative)?function(e,t){var i=t&&t.currentUD?t.currentUD:n.data.currentUD;if(i){var s=e/i;return s=Math.abs(s)<a&&0!==e?"~ 0":numeral(s).format(o),t&&t.currency?s+" "+r(t.currency,!0):s}console.warn("formatAmount: currentUD not defined")}(e,i):function(e,t){var n=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return t&&t.currency?n+" "+r(t.currency,!1):n}(e,i)}}]).filter("currencySymbol",["filterTranslations","$filter","csSettings",function(e,t,n){return function(i,a){return i?(angular.isDefined(a)?a:n.data.useRelative)?e.UD+"<sub>"+t("abbreviate")(i)+"</sub>":t("abbreviate")(i):""}}]).filter("currencySymbolNoHtml",["filterTranslations","$filter","csSettings",function(e,t,n){return function(i,a){return i?(angular.isDefined(a)?a:n.data.useRelative)?e.UD+" "+t("abbreviate")(i):t("abbreviate")(i):""}}]).filter("formatDecimal",["csConfig","csCurrency",function(e,t){var n=1/Math.pow(10,e.decimalCount||4),i="0,0.0"+Array(e.decimalCount||4).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 ?) = "+t.data.currentUD),"error"):Math.abs(e)<n?"~ 0":numeral(e).format(i)}}]).filter("formatNumeral",(function(){return function(e,t){return void 0===e?"0":Math.abs(e)<1e-4?"~ 0":numeral(e).format(t)}})).filter("formatDate",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("formatDateShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatDateMonth",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_MONTH_YEAR_PATTERN||"MMM YY"):""}}]).filter("formatDateForFile",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).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("formatFromNowAndDate",["filterTranslations",function(e){return function(t,n){var i=t&&moment.unix(parseInt(t));return i&&i.fromNow()+(n&&n.separator||" | ")+i.local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm")||""}}]).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("formatDurationTime",["filterTranslations",function(e){return function(t){if(!t)return"";var n=t&&t<0?"-":"+";t=Math.abs(t);var i=Math.trunc(t/3600/24),a=Math.trunc(t/3600-24*i),o=Math.trunc(t/60-24*i*60-60*a);return i>0?n+i+" "+e.DAYS+" "+a+"h "+o+"m":a>0?n+a+"h "+o+"m":n+o+"m"}}]).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)+offset).fromNow(!0):""}})).filter("medianDate",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("medianDateShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("medianTime",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format("HH:mm"):""}}]).filter("medianFromNow",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).fromNow():""}}]).filter("medianFromNowShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).fromNow(!0):""}}]).filter("medianFromNowAndDate",["filterTranslations",function(e){return function(t,n){var i=t&&moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET);return i&&i.fromNow()+(n&&n.separator||" | ")+i.local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm")||""}}]).filter("capitalize",(function(){return function(e){return e?(e=e.toLowerCase()).length>1?e.substring(0,1).toUpperCase()+e.substring(1):e:""}})).filter("abbreviate",(function(){var e={};return function(t){var n=t||"";if(e[n])return e[n];if(n.length>3){for(var i="",a=["-","_"," "],o=0;o<n.length;o++){var r=n[o];0===o?i="g"===r||"G"===r?"Ğ":r:o>0&&-1!=a.indexOf(n[o-1])&&(i+=r)}n=i.toUpperCase()}else"G"===(n=n.toUpperCase()).charAt(0)&&(n="Ğ"+(n.length>1?n.substr(1):""));return e[t]=n,n}})).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,t){return t=t||500,!e||e.length<=t?e:e.substr(0,t)+"..."}})).filter("truncUrl",(function(){return function(e,t){t=t||25;var n=e.startsWith("http://")?7:e.startsWith("https://")?8:0;return n=e.startsWith("www.",n)?n+4:n,!e||e.length-n<=t?e.substr(n):e.substr(n,t)+"..."}})).filter("trustAsHtml",["$sce",function(e){return function(t){return e.trustAsHtml(t)}}]),angular.module("cesium.platform",["ngIdle","cesium.config","cesium.services"]).config(["$translateProvider","csConfig",function(e,t){e.uniformLanguageTag("bcp47").determinePreferredLanguage().useSanitizeValueStrategy(null).fallbackLanguage([t.fallbackLanguage?t.fallbackLanguage:"en"]).useLoaderCache(!0)}]).config(["$httpProvider","csConfig",function(e,t){e.defaults.timeout=t.timeout?t.timeout:3e5,e.defaults.useXDomain=!0,delete e.defaults.headers.common["X-Requested-With"]}]).config(["$compileProvider","csConfig",function(e,t){e.debugInfoEnabled(!0===t.debug),e.imgSrcSanitizationWhitelist(/^\s*(filesystem:resource|resource|moz-extension|chrome-extension|file|data):/)}]).config(["$animateProvider",function(e){e.classNameFilter(/\banimate-/)}]).config(["CacheFactoryProvider","csConfig",function(e,t){angular.extend(e.defaults,{recycleFreq:6e4,storagePrefix:"caches.",capacity:100,maxAge:t.cacheTimeMs||6e4,storageMode:"memory"})}]).config(["screenmatchConfigProvider",function(e){e.config.rules="bootstrap"}]).config(["$ionicConfigProvider",function(e){var t=ionic.Platform.isIOS();e.scrolling.jsScrolling(t),e.views.maxCache(5)}]).config(["IdleProvider","csConfig",function(e,t){e.idle(t.logoutIdle||600),e.timeout(t.logoutTimeout||15)}]).factory("$exceptionHandler",["$log",function(e){return function(t,n){n?e.error(t,n):e.error(t)}}]).factory("csPlatform",["ionicReady","$rootScope","$q","$state","$translate","$timeout","UIUtils","BMA","Device","csHttp","csConfig","csCache","csSettings","csCurrency","csWallet",function(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E){var b,g,f,h,T=0,v=!1;function I(){if(!h){var e=t.$on("$stateChangeStart",(function(e,t,n,a){e.defaultPrevented||"app.home"===t.name||"app.settings"===t.name||(e.preventDefault(),g?g.then((function(){i.go(t.name,n)})):r.loading.hide())}));h=e}}function O(){h&&h(),h=null}function N(e){if(e)return!0;b=b||p.data.node;var t=p.data.fallbackNodes&&T<p.data.fallbackNodes.length&&p.data.fallbackNodes[T++];if(!t)throw"ERROR.CHECK_NETWORK_CONNECTION";var n=t.host+(t.port||80==t.port||443==t.port?"":":"+t.port);return s.node.same(t)?(console.debug("[platform] Skipping fallback node [{0}]: same as actual node".format(n)),N()):c.get(t.host,t.port,"/node/summary",443==t.port||s.node.forceUseSsl)().catch((function(e){console.error("[platform] Could not reach fallback node [{0}]: skipping".format(n))})).then((function(e){if(!e)return N();var i={old:s.server,new:n};return i.old===i.new&&(s.port!=t.port?i.new+=":"+t.port:0!=s.useSsl||!t.useSsl&&443!=t.port||(i.new+=" (SSL)")),a("CONFIRM.USE_FALLBACK_NODE",i).then((function(e){return r.alert.confirm(e)})).then((function(e){if(e)return p.data.node=t,p.data.node.temporary=!0,c.cache.clear(),s.copy(t).then(N)}))}))}function R(){return console.debug("[platform] restarting csPlatform"),S().then((function(){return o(A,200)}))}function A(){return I(),g=e().then(n.all([l.ready(),p.ready()])).then((function(){return s.ready().then(N)})).then(m.ready).then(E.ready).then((function(){O(),function(){f=[s.api.node.on.restart(t,R,this)]}(),g=null,v=!0})).catch((function(e){throw g=null,v=!1,i.current.name!==t.errorState&&i.go(t.errorState,{error:"peer"}),e}))}function S(){return v?(_.forEach(f,(function(e){e()})),f=[],E.stop(),m.stop(),s.stop(),o((function(){O(),v=!1,g=null}),500)):n.when()}return d.demo=!0===d.demo||"true"===d.demo||!1,d.readonly=!0===d.readonly||"true"===d.readonly||!1,{disableChangeState:I,isStarted:function(){return v},ready:function(){return v?n.when():g||A()},restart:R,start:A,stop:S,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,u.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(d.version,e.name)<0}})).catch((function(e){console.error("[platform] Failed to get Cesium latest version",e)})):n.when()}}}}]).run(["$rootScope","$state","$window","$urlRouter","ionicReady","$ionicPlatform","$ionicHistory","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet","csSettings","csConfig","csCurrency",function(e,t,n,i,a,o,r,s,l,c,d,u,p,m,E,b){e.config=E,e.settings=m.data,e.currency=b.data,e.device=s,e.errorState="app.home",e.smallscreen=l.screen.isSmall();var g=n.location.href.indexOf("#");e.rootPath=-1!==g?n.location.href.substr(0,g):n.location.href,console.debug("[app] Root path is ["+e.rootPath+"]"),!0!==E.httpsMode&&"true"!=E.httpsMode&&"force"!==E.httpsMode||"https:"===n.location.protocol||e.$on("$stateChangeStart",(function(i,a,o,r){var s="https"+e.rootPath.substr(4)+t.href(a,o);E.httpsModeDebug?console.debug("[app] [httpsMode] --- Should redirect to: "+s):n.location.href=s})),a().then((function(){return s.keyboard.enable&&(s.keyboard.hideKeyboardAccessoryBar(!0),ionic.Platform.isIOS()&&s.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"),u.version.latest().then((function(t){t&&t.isNewer?(console.info("[app] New release detected [{0}]".format(t.version)),e.newRelease=t):console.info("[app] Current version [{0}] is the latest release".format(E.version))})),o.registerBackButtonAction((function(e){return r.backView()?r.goBack():(e.preventDefault(),l.alert.confirm("CONFIRM.EXIT_APP").then((function(e){e&&ionic.Platform.exitApp()})))}),100),u.ready()}))}]),"function"!=typeof String.prototype.startsWith&&(console.debug("Adding String.prototype.startsWith() -> was missing on this platform"),String.prototype.startsWith=function(e,t){return 0===this.indexOf(e,t)}),"function"!=typeof String.prototype.trim){console.debug("Adding String.prototype.trim() -> was missing on this platform");var ut=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;String.prototype.trim=function(){return this.replace(ut,"")}}Math&&"function"!=typeof Math.trunc&&(console.debug("Adding Math.trunc() -> was missing on this platform"),Math.trunc=function(e){return parseInt((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(t,n){return void 0!==e[n]?e[n]:t}))});
//# sourceMappingURL=../maps/dist_js/cesium.js.map