@txnlab/use-wallet 0.1.21 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/cjs/clients/algosigner.d.ts +1 -1
  2. package/dist/cjs/clients/base.d.ts +4 -4
  3. package/dist/cjs/clients/defly.d.ts +1 -1
  4. package/dist/cjs/clients/exodus.d.ts +1 -1
  5. package/dist/cjs/clients/kmd.d.ts +1 -1
  6. package/dist/cjs/clients/myalgowallet.d.ts +1 -1
  7. package/dist/cjs/clients/perawallet.d.ts +1 -1
  8. package/dist/cjs/clients/walletconnect.d.ts +1 -1
  9. package/dist/cjs/hooks/useWallet.d.ts +2 -2
  10. package/dist/cjs/index.d.ts +2 -0
  11. package/dist/cjs/index.js +1967 -327
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/providers/index.d.ts +7 -7
  14. package/dist/cjs/store/state/walletStore.d.ts +17 -1
  15. package/dist/esm/clients/algosigner.d.ts +1 -1
  16. package/dist/esm/clients/base.d.ts +4 -4
  17. package/dist/esm/clients/defly.d.ts +1 -1
  18. package/dist/esm/clients/exodus.d.ts +1 -1
  19. package/dist/esm/clients/kmd.d.ts +1 -1
  20. package/dist/esm/clients/myalgowallet.d.ts +1 -1
  21. package/dist/esm/clients/perawallet.d.ts +1 -1
  22. package/dist/esm/clients/walletconnect.d.ts +1 -1
  23. package/dist/esm/hooks/useWallet.d.ts +2 -2
  24. package/dist/esm/index.d.ts +2 -0
  25. package/dist/esm/index.js +1943 -300
  26. package/dist/esm/providers/index.d.ts +7 -7
  27. package/dist/esm/store/state/walletStore.d.ts +17 -1
  28. package/dist/index.d.ts +65 -3
  29. package/package.json +10 -10
  30. package/dist/cjs/base-9794b627.js +0 -174
  31. package/dist/cjs/base-9794b627.js.map +0 -1
  32. package/dist/cjs/clients/algosigner.js +0 -144
  33. package/dist/cjs/clients/algosigner.js.map +0 -1
  34. package/dist/cjs/clients/defly.js +0 -159
  35. package/dist/cjs/clients/defly.js.map +0 -1
  36. package/dist/cjs/clients/exodus.js +0 -118
  37. package/dist/cjs/clients/exodus.js.map +0 -1
  38. package/dist/cjs/clients/kmd.js +0 -140
  39. package/dist/cjs/clients/kmd.js.map +0 -1
  40. package/dist/cjs/clients/myalgowallet.js +0 -128
  41. package/dist/cjs/clients/myalgowallet.js.map +0 -1
  42. package/dist/cjs/clients/perawallet.js +0 -169
  43. package/dist/cjs/clients/perawallet.js.map +0 -1
  44. package/dist/cjs/clients/walletconnect.js +0 -199
  45. package/dist/cjs/clients/walletconnect.js.map +0 -1
  46. package/dist/cjs/constants-e76d1f05.js +0 -63
  47. package/dist/cjs/constants-e76d1f05.js.map +0 -1
  48. package/dist/cjs/constants.js +0 -22
  49. package/dist/cjs/constants.js.map +0 -1
  50. package/dist/cjs/providers.js +0 -81
  51. package/dist/cjs/providers.js.map +0 -1
  52. package/dist/cjs/store/middelware/immer.d.ts +0 -10
  53. package/dist/cjs/utils.js +0 -74
  54. package/dist/cjs/utils.js.map +0 -1
  55. package/dist/esm/base-71089716.js +0 -152
  56. package/dist/esm/base-71089716.js.map +0 -1
  57. package/dist/esm/clients/algosigner.js +0 -142
  58. package/dist/esm/clients/algosigner.js.map +0 -1
  59. package/dist/esm/clients/defly.js +0 -139
  60. package/dist/esm/clients/defly.js.map +0 -1
  61. package/dist/esm/clients/exodus.js +0 -116
  62. package/dist/esm/clients/exodus.js.map +0 -1
  63. package/dist/esm/clients/kmd.js +0 -138
  64. package/dist/esm/clients/kmd.js.map +0 -1
  65. package/dist/esm/clients/myalgowallet.js +0 -108
  66. package/dist/esm/clients/myalgowallet.js.map +0 -1
  67. package/dist/esm/clients/perawallet.js +0 -149
  68. package/dist/esm/clients/perawallet.js.map +0 -1
  69. package/dist/esm/clients/walletconnect.js +0 -179
  70. package/dist/esm/clients/walletconnect.js.map +0 -1
  71. package/dist/esm/constants-49b44514.js +0 -53
  72. package/dist/esm/constants-49b44514.js.map +0 -1
  73. package/dist/esm/constants.js +0 -2
  74. package/dist/esm/constants.js.map +0 -1
  75. package/dist/esm/index.js.map +0 -1
  76. package/dist/esm/providers.js +0 -77
  77. package/dist/esm/providers.js.map +0 -1
  78. package/dist/esm/store/middelware/immer.d.ts +0 -10
  79. package/dist/esm/utils.js +0 -70
  80. package/dist/esm/utils.js.map +0 -1
package/dist/esm/index.js CHANGED
@@ -1,67 +1,101 @@
1
- import { P as PROVIDER_ID } from './constants-49b44514.js';
2
- export { K as KMD_HOST, g as KMD_PASSWORD, e as KMD_PORT, d as KMD_TOKEN, f as KMD_WALLET, c as NODE_NETWORK, b as NODE_PORT, N as NODE_SERVER, a as NODE_TOKEN, P as PROVIDER_ID } from './constants-49b44514.js';
3
- import { useReducer, useRef, useDebugValue, useEffect, useLayoutEffect, useMemo } from 'react';
4
- import { g as getAlgosdk } from './base-71089716.js';
5
- import { getWalletClient } from './utils.js';
6
- import { providers } from './providers.js';
7
- import './clients/perawallet.js';
8
- import './clients/myalgowallet.js';
9
- import './clients/algosigner.js';
10
- import './clients/defly.js';
11
- import './clients/exodus.js';
12
- import './clients/kmd.js';
13
- import './clients/walletconnect.js';
14
- import '@json-rpc-tools/utils';
1
+ import require$$0, { useDebugValue, useMemo } from 'react';
2
+ import { formatJsonRpcRequest } from '@json-rpc-tools/utils';
3
+
4
+ var PROVIDER_ID;
5
+ (function (PROVIDER_ID) {
6
+ PROVIDER_ID["KMD_WALLET"] = "KMD Wallet";
7
+ PROVIDER_ID["PERA_WALLET"] = "Pera Wallet";
8
+ PROVIDER_ID["MYALGO_WALLET"] = "MyAlgo Wallet";
9
+ PROVIDER_ID["ALGO_SIGNER"] = "Algo Signer";
10
+ PROVIDER_ID["DEFLY"] = "Defly";
11
+ PROVIDER_ID["EXODUS"] = "Exodus";
12
+ PROVIDER_ID["WALLET_CONNECT"] = "Wallet Connect";
13
+ })(PROVIDER_ID || (PROVIDER_ID = {}));
14
+ const NODE_SERVER = process.env.NODE_SERVER ||
15
+ process.env.REACT_APP_NODE_SERVER ||
16
+ process.env.NEXT_PUBLIC_NODE_SERVER ||
17
+ /** @todo deprecate this env var */
18
+ process.env.NEXT_PUBLIC_NODE_URL ||
19
+ "https://mainnet-api.algonode.cloud";
20
+ const NODE_TOKEN = process.env.NODE_TOKEN ||
21
+ process.env.REACT_APP_NODE_TOKEN ||
22
+ process.env.NEXT_PUBLIC_NODE_TOKEN ||
23
+ "";
24
+ const NODE_PORT = process.env.NODE_PORT ||
25
+ process.env.REACT_APP_NODE_PORT ||
26
+ process.env.NEXT_PUBLIC_NODE_PORT ||
27
+ "";
28
+ const NODE_NETWORK = process.env.NODE_NETWORK ||
29
+ process.env.REACT_APP_NODE_NETWORK ||
30
+ process.env.NEXT_PUBLIC_NODE_NETWORK ||
31
+ /** @todo deprecate this env var */
32
+ process.env.NEXT_PUBLIC_VERCEL_ENV ||
33
+ "mainnet";
34
+ const KMD_HOST = process.env.KMD_HOST ||
35
+ process.env.REACT_APP_KMD_HOST ||
36
+ process.env.NEXT_PUBLIC_KMD_HOST ||
37
+ "http://localhost";
38
+ const KMD_TOKEN = process.env.KMD_TOKEN ||
39
+ process.env.REACT_APP_KMD_TOKEN ||
40
+ process.env.NEXT_PUBLIC_KMD_TOKEN ||
41
+ "a".repeat(64);
42
+ const KMD_PORT = process.env.KMD_PORT ||
43
+ process.env.REACT_APP_KMD_PORT ||
44
+ process.env.NEXT_PUBLIC_KMD_PORT ||
45
+ "4002";
46
+ const KMD_WALLET$1 = process.env.KMD_WALLET ||
47
+ process.env.REACT_APP_KMD_WALLET ||
48
+ process.env.NEXT_PUBLIC_KMD_WALLET ||
49
+ "unencrypted-default-wallet";
50
+ const KMD_PASSWORD = process.env.KMD_PASSWORD ||
51
+ process.env.REACT_APP_KMD_PASSWORD ||
52
+ process.env.NEXT_PUBLIC_KMD_PASSWORD ||
53
+ "";
54
+
55
+ const getAlgosdk = async () => {
56
+ return (await import('algosdk')).default;
57
+ };
58
+ const getAlgodClient = async (algosdk) => {
59
+ return new algosdk.Algodv2(NODE_TOKEN, NODE_SERVER, NODE_PORT);
60
+ };
61
+ class Algod {
62
+ algosdk;
63
+ algodClient;
64
+ constructor(algosdk, algodClient) {
65
+ this.algosdk = algosdk;
66
+ this.algodClient = algodClient;
67
+ }
68
+ static async init() {
69
+ const algosdk = await getAlgosdk();
70
+ const algodClient = await getAlgodClient(algosdk);
71
+ return new Algod(algosdk, algodClient);
72
+ }
73
+ }
15
74
 
16
75
  function n(n){for(var r=arguments.length,t=Array(r>1?r-1:0),e=1;e<r;e++)t[e-1]=arguments[e];if("production"!==process.env.NODE_ENV){var i=Y[n],o=i?"function"==typeof i?i.apply(null,t):i:"unknown error nr: "+n;throw Error("[Immer] "+o)}throw Error("[Immer] minified error nr: "+n+(t.length?" "+t.map((function(n){return "'"+n+"'"})).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function r(n){return !!n&&!!n[Q]}function t(n){return !!n&&(function(n){if(!n||"object"!=typeof n)return !1;var r=Object.getPrototypeOf(n);if(null===r)return !0;var t=Object.hasOwnProperty.call(r,"constructor")&&r.constructor;return t===Object||"function"==typeof t&&Function.toString.call(t)===Z}(n)||Array.isArray(n)||!!n[L]||!!n.constructor[L]||s(n)||v(n))}function i(n,r,t){void 0===t&&(t=!1),0===o(n)?(t?Object.keys:nn)(n).forEach((function(e){t&&"symbol"==typeof e||r(e,n[e],n);})):n.forEach((function(t,e){return r(e,t,n)}));}function o(n){var r=n[Q];return r?r.i>3?r.i-4:r.i:Array.isArray(n)?1:s(n)?2:v(n)?3:0}function u(n,r){return 2===o(n)?n.has(r):Object.prototype.hasOwnProperty.call(n,r)}function a(n,r){return 2===o(n)?n.get(r):n[r]}function f(n,r,t){var e=o(n);2===e?n.set(r,t):3===e?(n.delete(r),n.add(t)):n[r]=t;}function c(n,r){return n===r?0!==n||1/n==1/r:n!=n&&r!=r}function s(n){return X&&n instanceof Map}function v(n){return q&&n instanceof Set}function p(n){return n.o||n.t}function l(n){if(Array.isArray(n))return Array.prototype.slice.call(n);var r=rn(n);delete r[Q];for(var t=nn(r),e=0;e<t.length;e++){var i=t[e],o=r[i];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(r[i]={configurable:!0,writable:!0,enumerable:o.enumerable,value:n[i]});}return Object.create(Object.getPrototypeOf(n),r)}function d(n,e){return void 0===e&&(e=!1),y(n)||r(n)||!t(n)?n:(o(n)>1&&(n.set=n.add=n.clear=n.delete=h),Object.freeze(n),e&&i(n,(function(n,r){return d(r,!0)}),!0),n)}function h(){n(2);}function y(n){return null==n||"object"!=typeof n||Object.isFrozen(n)}function b(r){var t=tn[r];return t||n(18,r),t}function _(){return "production"===process.env.NODE_ENV||U||n(0),U}function j(n,r){r&&(b("Patches"),n.u=[],n.s=[],n.v=r);}function O(n){g(n),n.p.forEach(S),n.p=null;}function g(n){n===U&&(U=n.l);}function w(n){return U={p:[],l:U,h:n,m:!0,_:0}}function S(n){var r=n[Q];0===r.i||1===r.i?r.j():r.O=!0;}function P(r,e){e._=e.p.length;var i=e.p[0],o=void 0!==r&&r!==i;return e.h.g||b("ES5").S(e,r,o),o?(i[Q].P&&(O(e),n(4)),t(r)&&(r=M(e,r),e.l||x(e,r)),e.u&&b("Patches").M(i[Q].t,r,e.u,e.s)):r=M(e,i,[]),O(e),e.u&&e.v(e.u,e.s),r!==H?r:void 0}function M(n,r,t){if(y(r))return r;var e=r[Q];if(!e)return i(r,(function(i,o){return A(n,e,r,i,o,t)}),!0),r;if(e.A!==n)return r;if(!e.P)return x(n,e.t,!0),e.t;if(!e.I){e.I=!0,e.A._--;var o=4===e.i||5===e.i?e.o=l(e.k):e.o;i(3===e.i?new Set(o):o,(function(r,i){return A(n,e,o,r,i,t)})),x(n,o,!1),t&&n.u&&b("Patches").R(e,t,n.u,n.s);}return e.o}function A(e,i,o,a,c,s){if("production"!==process.env.NODE_ENV&&c===o&&n(5),r(c)){var v=M(e,c,s&&i&&3!==i.i&&!u(i.D,a)?s.concat(a):void 0);if(f(o,a,v),!r(v))return;e.m=!1;}if(t(c)&&!y(c)){if(!e.h.F&&e._<1)return;M(e,c),i&&i.A.l||x(e,c);}}function x(n,r,t){void 0===t&&(t=!1),n.h.F&&n.m&&d(r,t);}function z(n,r){var t=n[Q];return (t?p(t):n)[r]}function I(n,r){if(r in n)for(var t=Object.getPrototypeOf(n);t;){var e=Object.getOwnPropertyDescriptor(t,r);if(e)return e;t=Object.getPrototypeOf(t);}}function k(n){n.P||(n.P=!0,n.l&&k(n.l));}function E(n){n.o||(n.o=l(n.t));}function R(n,r,t){var e=s(r)?b("MapSet").N(r,t):v(r)?b("MapSet").T(r,t):n.g?function(n,r){var t=Array.isArray(n),e={i:t?1:0,A:r?r.A:_(),P:!1,I:!1,D:{},l:r,t:n,k:null,o:null,j:null,C:!1},i=e,o=en;t&&(i=[e],o=on);var u=Proxy.revocable(i,o),a=u.revoke,f=u.proxy;return e.k=f,e.j=a,f}(r,t):b("ES5").J(r,t);return (t?t.A:_()).p.push(e),e}function D(e){return r(e)||n(22,e),function n(r){if(!t(r))return r;var e,u=r[Q],c=o(r);if(u){if(!u.P&&(u.i<4||!b("ES5").K(u)))return u.t;u.I=!0,e=F(r,c),u.I=!1;}else e=F(r,c);return i(e,(function(r,t){u&&a(u.t,r)===t||f(e,r,n(t));})),3===c?new Set(e):e}(e)}function F(n,r){switch(r){case 2:return new Map(n);case 3:return Array.from(n)}return l(n)}var G,U,W="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),X="undefined"!=typeof Map,q="undefined"!=typeof Set,B="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,H=W?Symbol.for("immer-nothing"):((G={})["immer-nothing"]=!0,G),L=W?Symbol.for("immer-draftable"):"__$immer_draftable",Q=W?Symbol.for("immer-state"):"__$immer_state",Y={0:"Illegal state",1:"Immer drafts cannot have computed properties",2:"This object has been frozen and should not be mutated",3:function(n){return "Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+n},4:"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.",5:"Immer forbids circular references",6:"The first or second argument to `produce` must be a function",7:"The third argument to `produce` must be a function or undefined",8:"First argument to `createDraft` must be a plain object, an array, or an immerable object",9:"First argument to `finishDraft` must be a draft returned by `createDraft`",10:"The given draft is already finalized",11:"Object.defineProperty() cannot be used on an Immer draft",12:"Object.setPrototypeOf() cannot be used on an Immer draft",13:"Immer only supports deleting array indices",14:"Immer only supports setting array indices and the 'length' property",15:function(n){return "Cannot apply patch, path doesn't resolve: "+n},16:'Sets cannot have "replace" patches.',17:function(n){return "Unsupported patch operation: "+n},18:function(n){return "The plugin for '"+n+"' has not been loaded into Immer. To enable the plugin, import and call `enable"+n+"()` when initializing your application."},20:"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available",21:function(n){return "produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '"+n+"'"},22:function(n){return "'current' expects a draft, got: "+n},23:function(n){return "'original' expects a draft, got: "+n},24:"Patching reserved attributes like __proto__, prototype and constructor is not allowed"},Z=""+Object.prototype.constructor,nn="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(n){return Object.getOwnPropertyNames(n).concat(Object.getOwnPropertySymbols(n))}:Object.getOwnPropertyNames,rn=Object.getOwnPropertyDescriptors||function(n){var r={};return nn(n).forEach((function(t){r[t]=Object.getOwnPropertyDescriptor(n,t);})),r},tn={},en={get:function(n,r){if(r===Q)return n;var e=p(n);if(!u(e,r))return function(n,r,t){var e,i=I(r,t);return i?"value"in i?i.value:null===(e=i.get)||void 0===e?void 0:e.call(n.k):void 0}(n,e,r);var i=e[r];return n.I||!t(i)?i:i===z(n.t,r)?(E(n),n.o[r]=R(n.A.h,i,n)):i},has:function(n,r){return r in p(n)},ownKeys:function(n){return Reflect.ownKeys(p(n))},set:function(n,r,t){var e=I(p(n),r);if(null==e?void 0:e.set)return e.set.call(n.k,t),!0;if(!n.P){var i=z(p(n),r),o=null==i?void 0:i[Q];if(o&&o.t===t)return n.o[r]=t,n.D[r]=!1,!0;if(c(t,i)&&(void 0!==t||u(n.t,r)))return !0;E(n),k(n);}return n.o[r]===t&&"number"!=typeof t&&(void 0!==t||r in n.o)||(n.o[r]=t,n.D[r]=!0,!0)},deleteProperty:function(n,r){return void 0!==z(n.t,r)||r in n.t?(n.D[r]=!1,E(n),k(n)):delete n.D[r],n.o&&delete n.o[r],!0},getOwnPropertyDescriptor:function(n,r){var t=p(n),e=Reflect.getOwnPropertyDescriptor(t,r);return e?{writable:!0,configurable:1!==n.i||"length"!==r,enumerable:e.enumerable,value:t[r]}:e},defineProperty:function(){n(11);},getPrototypeOf:function(n){return Object.getPrototypeOf(n.t)},setPrototypeOf:function(){n(12);}},on={};i(en,(function(n,r){on[n]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)};})),on.deleteProperty=function(r,t){return "production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&n(13),on.set.call(this,r,t,void 0)},on.set=function(r,t,e){return "production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&n(14),en.set.call(this,r[0],t,e,r[0])};var un=function(){function e(r){var e=this;this.g=B,this.F=!0,this.produce=function(r,i,o){if("function"==typeof r&&"function"!=typeof i){var u=i;i=r;var a=e;return function(n){var r=this;void 0===n&&(n=u);for(var t=arguments.length,e=Array(t>1?t-1:0),o=1;o<t;o++)e[o-1]=arguments[o];return a.produce(n,(function(n){var t;return (t=i).call.apply(t,[r,n].concat(e))}))}}var f;if("function"!=typeof i&&n(6),void 0!==o&&"function"!=typeof o&&n(7),t(r)){var c=w(e),s=R(e,r,void 0),v=!0;try{f=i(s),v=!1;}finally{v?O(c):g(c);}return "undefined"!=typeof Promise&&f instanceof Promise?f.then((function(n){return j(c,o),P(n,c)}),(function(n){throw O(c),n})):(j(c,o),P(f,c))}if(!r||"object"!=typeof r){if(void 0===(f=i(r))&&(f=r),f===H&&(f=void 0),e.F&&d(f,!0),o){var p=[],l=[];b("Patches").M(r,f,p,l),o(p,l);}return f}n(21,r);},this.produceWithPatches=function(n,r){if("function"==typeof n)return function(r){for(var t=arguments.length,i=Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return e.produceWithPatches(r,(function(r){return n.apply(void 0,[r].concat(i))}))};var t,i,o=e.produce(n,r,(function(n,r){t=n,i=r;}));return "undefined"!=typeof Promise&&o instanceof Promise?o.then((function(n){return [n,t,i]})):[o,t,i]},"boolean"==typeof(null==r?void 0:r.useProxies)&&this.setUseProxies(r.useProxies),"boolean"==typeof(null==r?void 0:r.autoFreeze)&&this.setAutoFreeze(r.autoFreeze);}var i=e.prototype;return i.createDraft=function(e){t(e)||n(8),r(e)&&(e=D(e));var i=w(this),o=R(this,e,void 0);return o[Q].C=!0,g(i),o},i.finishDraft=function(r,t){var e=r&&r[Q];"production"!==process.env.NODE_ENV&&(e&&e.C||n(9),e.I&&n(10));var i=e.A;return j(i,t),P(void 0,i)},i.setAutoFreeze=function(n){this.F=n;},i.setUseProxies=function(r){r&&!B&&n(20),this.g=r;},i.applyPatches=function(n,t){var e;for(e=t.length-1;e>=0;e--){var i=t[e];if(0===i.path.length&&"replace"===i.op){n=i.value;break}}e>-1&&(t=t.slice(e+1));var o=b("Patches").$;return r(n)?o(n,t):this.produce(n,(function(n){return o(n,t)}))},e}(),an=new un,fn=an.produce;an.produceWithPatches.bind(an);an.setAutoFreeze.bind(an);an.setUseProxies.bind(an);an.applyPatches.bind(an);an.createDraft.bind(an);an.finishDraft.bind(an);
17
76
 
18
- /**
19
- * The immer middleware turns the `set` method into a proxy for the immer `produce` method.
20
- * https://immerjs.github.io/immer/
21
- *
22
- * The TypeScript magic is taken from here:
23
- * https://github.com/pmndrs/zustand/blob/main/tests/middlewareTypes.test.tsx
24
- */
25
- const immer = (config) => (set, get, api) => {
26
- // see https://github.com/pmndrs/zustand/issues/449#issuecomment-873777576
27
- api.setState = (fn$1) => set(fn(fn$1));
28
- return config((partial, replace) => {
29
- const nextState = typeof partial === "function"
30
- ? fn(partial)
31
- : partial;
32
- return set(nextState, replace);
33
- }, get, api);
77
+ const immerImpl = (initializer) => (set, get, store) => {
78
+ store.setState = (updater, replace, ...a) => {
79
+ const nextState = typeof updater === "function" ? fn(updater) : updater;
80
+ return set(nextState, replace, ...a);
81
+ };
82
+ return initializer(store.setState, get, store);
34
83
  };
84
+ const immer = immerImpl;
35
85
 
36
- function createStore(createState) {
86
+ const createStoreImpl = (createState) => {
37
87
  let state;
38
88
  const listeners = /* @__PURE__ */ new Set();
39
89
  const setState = (partial, replace) => {
40
90
  const nextState = typeof partial === "function" ? partial(state) : partial;
41
- if (nextState !== state) {
91
+ if (!Object.is(nextState, state)) {
42
92
  const previousState = state;
43
- state = replace ? nextState : Object.assign({}, state, nextState);
93
+ state = (replace != null ? replace : typeof nextState !== "object") ? nextState : Object.assign({}, state, nextState);
44
94
  listeners.forEach((listener) => listener(state, previousState));
45
95
  }
46
96
  };
47
97
  const getState = () => state;
48
- const subscribeWithSelector = (listener, selector = getState, equalityFn = Object.is) => {
49
- console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");
50
- let currentSlice = selector(state);
51
- function listenerToAdd() {
52
- const nextSlice = selector(state);
53
- if (!equalityFn(currentSlice, nextSlice)) {
54
- const previousSlice = currentSlice;
55
- listener(currentSlice = nextSlice, previousSlice);
56
- }
57
- }
58
- listeners.add(listenerToAdd);
59
- return () => listeners.delete(listenerToAdd);
60
- };
61
- const subscribe = (listener, selector, equalityFn) => {
62
- if (selector || equalityFn) {
63
- return subscribeWithSelector(listener, selector, equalityFn);
64
- }
98
+ const subscribe = (listener) => {
65
99
  listeners.add(listener);
66
100
  return () => listeners.delete(listener);
67
101
  };
@@ -69,170 +103,588 @@ function createStore(createState) {
69
103
  const api = { setState, getState, subscribe, destroy };
70
104
  state = createState(setState, getState, api);
71
105
  return api;
106
+ };
107
+ const createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
108
+
109
+ function getDefaultExportFromCjs (x) {
110
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
111
+ }
112
+
113
+ var withSelector = {exports: {}};
114
+
115
+ var withSelector_production_min = {};
116
+
117
+ var shim = {exports: {}};
118
+
119
+ var useSyncExternalStoreShim_production_min = {};
120
+
121
+ /**
122
+ * @license React
123
+ * use-sync-external-store-shim.production.min.js
124
+ *
125
+ * Copyright (c) Facebook, Inc. and its affiliates.
126
+ *
127
+ * This source code is licensed under the MIT license found in the
128
+ * LICENSE file in the root directory of this source tree.
129
+ */
130
+
131
+ var hasRequiredUseSyncExternalStoreShim_production_min;
132
+
133
+ function requireUseSyncExternalStoreShim_production_min () {
134
+ if (hasRequiredUseSyncExternalStoreShim_production_min) return useSyncExternalStoreShim_production_min;
135
+ hasRequiredUseSyncExternalStoreShim_production_min = 1;
136
+ var e=require$$0;function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k="function"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c});},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c});})},[a]);p(d);return d}
137
+ function r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return !k(a,d)}catch(f){return !0}}function t(a,b){return b()}var u="undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement?t:q;useSyncExternalStoreShim_production_min.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;
138
+ return useSyncExternalStoreShim_production_min;
72
139
  }
73
140
 
74
- const isSSR = typeof window === "undefined" || !window.navigator || /ServerSideRendering|^Deno\//.test(window.navigator.userAgent);
75
- const useIsomorphicLayoutEffect = isSSR ? useEffect : useLayoutEffect;
76
- function create(createState) {
141
+ var useSyncExternalStoreShim_development = {};
142
+
143
+ /**
144
+ * @license React
145
+ * use-sync-external-store-shim.development.js
146
+ *
147
+ * Copyright (c) Facebook, Inc. and its affiliates.
148
+ *
149
+ * This source code is licensed under the MIT license found in the
150
+ * LICENSE file in the root directory of this source tree.
151
+ */
152
+
153
+ var hasRequiredUseSyncExternalStoreShim_development;
154
+
155
+ function requireUseSyncExternalStoreShim_development () {
156
+ if (hasRequiredUseSyncExternalStoreShim_development) return useSyncExternalStoreShim_development;
157
+ hasRequiredUseSyncExternalStoreShim_development = 1;
158
+
159
+ if (process.env.NODE_ENV !== "production") {
160
+ (function() {
161
+
162
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
163
+ if (
164
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
165
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
166
+ 'function'
167
+ ) {
168
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
169
+ }
170
+ var React = require$$0;
171
+
172
+ var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
173
+
174
+ function error(format) {
175
+ {
176
+ {
177
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
178
+ args[_key2 - 1] = arguments[_key2];
179
+ }
180
+
181
+ printWarning('error', format, args);
182
+ }
183
+ }
184
+ }
185
+
186
+ function printWarning(level, format, args) {
187
+ // When changing this logic, you might want to also
188
+ // update consoleWithStackDev.www.js as well.
189
+ {
190
+ var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
191
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
192
+
193
+ if (stack !== '') {
194
+ format += '%s';
195
+ args = args.concat([stack]);
196
+ } // eslint-disable-next-line react-internal/safe-string-coercion
197
+
198
+
199
+ var argsWithFormat = args.map(function (item) {
200
+ return String(item);
201
+ }); // Careful: RN currently depends on this prefix
202
+
203
+ argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
204
+ // breaks IE9: https://github.com/facebook/react/issues/13610
205
+ // eslint-disable-next-line react-internal/no-production-logging
206
+
207
+ Function.prototype.apply.call(console[level], console, argsWithFormat);
208
+ }
209
+ }
210
+
211
+ /**
212
+ * inlined Object.is polyfill to avoid requiring consumers ship their own
213
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
214
+ */
215
+ function is(x, y) {
216
+ return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
217
+ ;
218
+ }
219
+
220
+ var objectIs = typeof Object.is === 'function' ? Object.is : is;
221
+
222
+ // dispatch for CommonJS interop named imports.
223
+
224
+ var useState = React.useState,
225
+ useEffect = React.useEffect,
226
+ useLayoutEffect = React.useLayoutEffect,
227
+ useDebugValue = React.useDebugValue;
228
+ var didWarnOld18Alpha = false;
229
+ var didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works
230
+ // because of a very particular set of implementation details and assumptions
231
+ // -- change any one of them and it will break. The most important assumption
232
+ // is that updates are always synchronous, because concurrent rendering is
233
+ // only available in versions of React that also have a built-in
234
+ // useSyncExternalStore API. And we only use this shim when the built-in API
235
+ // does not exist.
236
+ //
237
+ // Do not assume that the clever hacks used by this hook also work in general.
238
+ // The point of this shim is to replace the need for hacks by other libraries.
239
+
240
+ function useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of
241
+ // React do not expose a way to check if we're hydrating. So users of the shim
242
+ // will need to track that themselves and return the correct value
243
+ // from `getSnapshot`.
244
+ getServerSnapshot) {
245
+ {
246
+ if (!didWarnOld18Alpha) {
247
+ if (React.startTransition !== undefined) {
248
+ didWarnOld18Alpha = true;
249
+
250
+ error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.');
251
+ }
252
+ }
253
+ } // Read the current snapshot from the store on every render. Again, this
254
+ // breaks the rules of React, and only works here because of specific
255
+ // implementation details, most importantly that updates are
256
+ // always synchronous.
257
+
258
+
259
+ var value = getSnapshot();
260
+
261
+ {
262
+ if (!didWarnUncachedGetSnapshot) {
263
+ var cachedValue = getSnapshot();
264
+
265
+ if (!objectIs(value, cachedValue)) {
266
+ error('The result of getSnapshot should be cached to avoid an infinite loop');
267
+
268
+ didWarnUncachedGetSnapshot = true;
269
+ }
270
+ }
271
+ } // Because updates are synchronous, we don't queue them. Instead we force a
272
+ // re-render whenever the subscribed state changes by updating an some
273
+ // arbitrary useState hook. Then, during render, we call getSnapshot to read
274
+ // the current value.
275
+ //
276
+ // Because we don't actually use the state returned by the useState hook, we
277
+ // can save a bit of memory by storing other stuff in that slot.
278
+ //
279
+ // To implement the early bailout, we need to track some things on a mutable
280
+ // object. Usually, we would put that in a useRef hook, but we can stash it in
281
+ // our useState hook instead.
282
+ //
283
+ // To force a re-render, we call forceUpdate({inst}). That works because the
284
+ // new object always fails an equality check.
285
+
286
+
287
+ var _useState = useState({
288
+ inst: {
289
+ value: value,
290
+ getSnapshot: getSnapshot
291
+ }
292
+ }),
293
+ inst = _useState[0].inst,
294
+ forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated
295
+ // in the layout phase so we can access it during the tearing check that
296
+ // happens on subscribe.
297
+
298
+
299
+ useLayoutEffect(function () {
300
+ inst.value = value;
301
+ inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the
302
+ // commit phase if there was an interleaved mutation. In concurrent mode
303
+ // this can happen all the time, but even in synchronous mode, an earlier
304
+ // effect may have mutated the store.
305
+
306
+ if (checkIfSnapshotChanged(inst)) {
307
+ // Force a re-render.
308
+ forceUpdate({
309
+ inst: inst
310
+ });
311
+ }
312
+ }, [subscribe, value, getSnapshot]);
313
+ useEffect(function () {
314
+ // Check for changes right before subscribing. Subsequent changes will be
315
+ // detected in the subscription handler.
316
+ if (checkIfSnapshotChanged(inst)) {
317
+ // Force a re-render.
318
+ forceUpdate({
319
+ inst: inst
320
+ });
321
+ }
322
+
323
+ var handleStoreChange = function () {
324
+ // TODO: Because there is no cross-renderer API for batching updates, it's
325
+ // up to the consumer of this library to wrap their subscription event
326
+ // with unstable_batchedUpdates. Should we try to detect when this isn't
327
+ // the case and print a warning in development?
328
+ // The store changed. Check if the snapshot changed since the last time we
329
+ // read from the store.
330
+ if (checkIfSnapshotChanged(inst)) {
331
+ // Force a re-render.
332
+ forceUpdate({
333
+ inst: inst
334
+ });
335
+ }
336
+ }; // Subscribe to the store and return a clean-up function.
337
+
338
+
339
+ return subscribe(handleStoreChange);
340
+ }, [subscribe]);
341
+ useDebugValue(value);
342
+ return value;
343
+ }
344
+
345
+ function checkIfSnapshotChanged(inst) {
346
+ var latestGetSnapshot = inst.getSnapshot;
347
+ var prevValue = inst.value;
348
+
349
+ try {
350
+ var nextValue = latestGetSnapshot();
351
+ return !objectIs(prevValue, nextValue);
352
+ } catch (error) {
353
+ return true;
354
+ }
355
+ }
356
+
357
+ function useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {
358
+ // Note: The shim does not use getServerSnapshot, because pre-18 versions of
359
+ // React do not expose a way to check if we're hydrating. So users of the shim
360
+ // will need to track that themselves and return the correct value
361
+ // from `getSnapshot`.
362
+ return getSnapshot();
363
+ }
364
+
365
+ var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
366
+
367
+ var isServerEnvironment = !canUseDOM;
368
+
369
+ var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;
370
+ var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;
371
+
372
+ useSyncExternalStoreShim_development.useSyncExternalStore = useSyncExternalStore$2;
373
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
374
+ if (
375
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
376
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
377
+ 'function'
378
+ ) {
379
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
380
+ }
381
+
382
+ })();
383
+ }
384
+ return useSyncExternalStoreShim_development;
385
+ }
386
+
387
+ var hasRequiredShim;
388
+
389
+ function requireShim () {
390
+ if (hasRequiredShim) return shim.exports;
391
+ hasRequiredShim = 1;
392
+ (function (module) {
393
+
394
+ if (process.env.NODE_ENV === 'production') {
395
+ module.exports = requireUseSyncExternalStoreShim_production_min();
396
+ } else {
397
+ module.exports = requireUseSyncExternalStoreShim_development();
398
+ }
399
+ } (shim));
400
+ return shim.exports;
401
+ }
402
+
403
+ /**
404
+ * @license React
405
+ * use-sync-external-store-shim/with-selector.production.min.js
406
+ *
407
+ * Copyright (c) Facebook, Inc. and its affiliates.
408
+ *
409
+ * This source code is licensed under the MIT license found in the
410
+ * LICENSE file in the root directory of this source tree.
411
+ */
412
+
413
+ var hasRequiredWithSelector_production_min;
414
+
415
+ function requireWithSelector_production_min () {
416
+ if (hasRequiredWithSelector_production_min) return withSelector_production_min;
417
+ hasRequiredWithSelector_production_min = 1;
418
+ var h=require$$0,n=requireShim();function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q="function"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;
419
+ withSelector_production_min.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f;}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return [function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);
420
+ u(function(){f.hasValue=!0;f.value=d;},[d]);w(d);return d};
421
+ return withSelector_production_min;
422
+ }
423
+
424
+ var withSelector_development = {};
425
+
426
+ /**
427
+ * @license React
428
+ * use-sync-external-store-shim/with-selector.development.js
429
+ *
430
+ * Copyright (c) Facebook, Inc. and its affiliates.
431
+ *
432
+ * This source code is licensed under the MIT license found in the
433
+ * LICENSE file in the root directory of this source tree.
434
+ */
435
+
436
+ var hasRequiredWithSelector_development;
437
+
438
+ function requireWithSelector_development () {
439
+ if (hasRequiredWithSelector_development) return withSelector_development;
440
+ hasRequiredWithSelector_development = 1;
441
+
442
+ if (process.env.NODE_ENV !== "production") {
443
+ (function() {
444
+
445
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
446
+ if (
447
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
448
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
449
+ 'function'
450
+ ) {
451
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
452
+ }
453
+ var React = require$$0;
454
+ var shim = requireShim();
455
+
456
+ /**
457
+ * inlined Object.is polyfill to avoid requiring consumers ship their own
458
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
459
+ */
460
+ function is(x, y) {
461
+ return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
462
+ ;
463
+ }
464
+
465
+ var objectIs = typeof Object.is === 'function' ? Object.is : is;
466
+
467
+ var useSyncExternalStore = shim.useSyncExternalStore;
468
+
469
+ // for CommonJS interop.
470
+
471
+ var useRef = React.useRef,
472
+ useEffect = React.useEffect,
473
+ useMemo = React.useMemo,
474
+ useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.
475
+
476
+ function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
477
+ // Use this to track the rendered snapshot.
478
+ var instRef = useRef(null);
479
+ var inst;
480
+
481
+ if (instRef.current === null) {
482
+ inst = {
483
+ hasValue: false,
484
+ value: null
485
+ };
486
+ instRef.current = inst;
487
+ } else {
488
+ inst = instRef.current;
489
+ }
490
+
491
+ var _useMemo = useMemo(function () {
492
+ // Track the memoized state using closure variables that are local to this
493
+ // memoized instance of a getSnapshot function. Intentionally not using a
494
+ // useRef hook, because that state would be shared across all concurrent
495
+ // copies of the hook/component.
496
+ var hasMemo = false;
497
+ var memoizedSnapshot;
498
+ var memoizedSelection;
499
+
500
+ var memoizedSelector = function (nextSnapshot) {
501
+ if (!hasMemo) {
502
+ // The first time the hook is called, there is no memoized result.
503
+ hasMemo = true;
504
+ memoizedSnapshot = nextSnapshot;
505
+
506
+ var _nextSelection = selector(nextSnapshot);
507
+
508
+ if (isEqual !== undefined) {
509
+ // Even if the selector has changed, the currently rendered selection
510
+ // may be equal to the new selection. We should attempt to reuse the
511
+ // current value if possible, to preserve downstream memoizations.
512
+ if (inst.hasValue) {
513
+ var currentSelection = inst.value;
514
+
515
+ if (isEqual(currentSelection, _nextSelection)) {
516
+ memoizedSelection = currentSelection;
517
+ return currentSelection;
518
+ }
519
+ }
520
+ }
521
+
522
+ memoizedSelection = _nextSelection;
523
+ return _nextSelection;
524
+ } // We may be able to reuse the previous invocation's result.
525
+
526
+
527
+ // We may be able to reuse the previous invocation's result.
528
+ var prevSnapshot = memoizedSnapshot;
529
+ var prevSelection = memoizedSelection;
530
+
531
+ if (objectIs(prevSnapshot, nextSnapshot)) {
532
+ // The snapshot is the same as last time. Reuse the previous selection.
533
+ return prevSelection;
534
+ } // The snapshot has changed, so we need to compute a new selection.
535
+
536
+
537
+ // The snapshot has changed, so we need to compute a new selection.
538
+ var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data
539
+ // has changed. If it hasn't, return the previous selection. That signals
540
+ // to React that the selections are conceptually equal, and we can bail
541
+ // out of rendering.
542
+
543
+ // If a custom isEqual function is provided, use that to check if the data
544
+ // has changed. If it hasn't, return the previous selection. That signals
545
+ // to React that the selections are conceptually equal, and we can bail
546
+ // out of rendering.
547
+ if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {
548
+ return prevSelection;
549
+ }
550
+
551
+ memoizedSnapshot = nextSnapshot;
552
+ memoizedSelection = nextSelection;
553
+ return nextSelection;
554
+ }; // Assigning this to a constant so that Flow knows it can't change.
555
+
556
+
557
+ // Assigning this to a constant so that Flow knows it can't change.
558
+ var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;
559
+
560
+ var getSnapshotWithSelector = function () {
561
+ return memoizedSelector(getSnapshot());
562
+ };
563
+
564
+ var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {
565
+ return memoizedSelector(maybeGetServerSnapshot());
566
+ };
567
+ return [getSnapshotWithSelector, getServerSnapshotWithSelector];
568
+ }, [getSnapshot, getServerSnapshot, selector, isEqual]),
569
+ getSelection = _useMemo[0],
570
+ getServerSelection = _useMemo[1];
571
+
572
+ var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);
573
+ useEffect(function () {
574
+ inst.hasValue = true;
575
+ inst.value = value;
576
+ }, [value]);
577
+ useDebugValue(value);
578
+ return value;
579
+ }
580
+
581
+ withSelector_development.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;
582
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
583
+ if (
584
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
585
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
586
+ 'function'
587
+ ) {
588
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
589
+ }
590
+
591
+ })();
592
+ }
593
+ return withSelector_development;
594
+ }
595
+
596
+ (function (module) {
597
+
598
+ if (process.env.NODE_ENV === 'production') {
599
+ module.exports = requireWithSelector_production_min();
600
+ } else {
601
+ module.exports = requireWithSelector_development();
602
+ }
603
+ } (withSelector));
604
+
605
+ var useSyncExternalStoreExports = /*@__PURE__*/getDefaultExportFromCjs(withSelector.exports);
606
+
607
+ const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
608
+ function useStore(api, selector = api.getState, equalityFn) {
609
+ const slice = useSyncExternalStoreWithSelector(
610
+ api.subscribe,
611
+ api.getState,
612
+ api.getServerState || api.getState,
613
+ selector,
614
+ equalityFn
615
+ );
616
+ useDebugValue(slice);
617
+ return slice;
618
+ }
619
+ const createImpl = (createState) => {
77
620
  const api = typeof createState === "function" ? createStore(createState) : createState;
78
- const useStore = (selector = api.getState, equalityFn = Object.is) => {
79
- const [, forceUpdate] = useReducer((c) => c + 1, 0);
80
- const state = api.getState();
81
- const stateRef = useRef(state);
82
- const selectorRef = useRef(selector);
83
- const equalityFnRef = useRef(equalityFn);
84
- const erroredRef = useRef(false);
85
- const currentSliceRef = useRef();
86
- if (currentSliceRef.current === void 0) {
87
- currentSliceRef.current = selector(state);
88
- }
89
- let newStateSlice;
90
- let hasNewStateSlice = false;
91
- if (stateRef.current !== state || selectorRef.current !== selector || equalityFnRef.current !== equalityFn || erroredRef.current) {
92
- newStateSlice = selector(state);
93
- hasNewStateSlice = !equalityFn(currentSliceRef.current, newStateSlice);
621
+ const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);
622
+ Object.assign(useBoundStore, api);
623
+ return useBoundStore;
624
+ };
625
+ const create = (createState) => createState ? createImpl(createState) : createImpl;
626
+
627
+ const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {
628
+ const { enabled, anonymousActionType, ...options } = devtoolsOptions;
629
+ let extensionConnector;
630
+ try {
631
+ extensionConnector = (enabled != null ? enabled : (import.meta.env && import.meta.env.MODE) !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__;
632
+ } catch {
633
+ }
634
+ if (!extensionConnector) {
635
+ if ((import.meta.env && import.meta.env.MODE) !== "production" && enabled) {
636
+ console.warn(
637
+ "[zustand devtools middleware] Please install/enable Redux devtools extension"
638
+ );
94
639
  }
95
- useIsomorphicLayoutEffect(() => {
96
- if (hasNewStateSlice) {
97
- currentSliceRef.current = newStateSlice;
98
- }
99
- stateRef.current = state;
100
- selectorRef.current = selector;
101
- equalityFnRef.current = equalityFn;
102
- erroredRef.current = false;
103
- });
104
- const stateBeforeSubscriptionRef = useRef(state);
105
- useIsomorphicLayoutEffect(() => {
106
- const listener = () => {
107
- try {
108
- const nextState = api.getState();
109
- const nextStateSlice = selectorRef.current(nextState);
110
- if (!equalityFnRef.current(currentSliceRef.current, nextStateSlice)) {
111
- stateRef.current = nextState;
112
- currentSliceRef.current = nextStateSlice;
113
- forceUpdate();
114
- }
115
- } catch (error) {
116
- erroredRef.current = true;
117
- forceUpdate();
118
- }
119
- };
120
- const unsubscribe = api.subscribe(listener);
121
- if (api.getState() !== stateBeforeSubscriptionRef.current) {
122
- listener();
123
- }
124
- return unsubscribe;
125
- }, []);
126
- const sliceToReturn = hasNewStateSlice ? newStateSlice : currentSliceRef.current;
127
- useDebugValue(sliceToReturn);
128
- return sliceToReturn;
640
+ return fn(set, get, api);
641
+ }
642
+ const extension = extensionConnector.connect(options);
643
+ let isRecording = true;
644
+ api.setState = (state, replace, nameOrAction) => {
645
+ const r = set(state, replace);
646
+ if (!isRecording)
647
+ return r;
648
+ extension.send(
649
+ nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction,
650
+ get()
651
+ );
652
+ return r;
129
653
  };
130
- Object.assign(useStore, api);
131
- useStore[Symbol.iterator] = function() {
132
- console.warn("[useStore, api] = create() is deprecated and will be removed in v4");
133
- const items = [useStore, api];
134
- return {
135
- next() {
136
- const done = items.length <= 0;
137
- return { value: items.shift(), done };
138
- }
139
- };
654
+ const setStateFromDevtools = (...a) => {
655
+ const originalIsRecording = isRecording;
656
+ isRecording = false;
657
+ set(...a);
658
+ isRecording = originalIsRecording;
140
659
  };
141
- return useStore;
142
- }
143
-
144
- function devtools(fn, options) {
145
- return (set, get, api) => {
146
- var _a;
147
- let didWarnAboutNameDeprecation = false;
148
- if (typeof options === "string" && !didWarnAboutNameDeprecation) {
149
- console.warn("[zustand devtools middleware]: passing `name` as directly will be not allowed in next majorpass the `name` in an object `{ name: ... }` instead");
150
- didWarnAboutNameDeprecation = true;
151
- }
152
- const devtoolsOptions = options === void 0 ? { name: void 0, anonymousActionType: void 0 } : typeof options === "string" ? { name: options } : options;
153
- if (typeof ((_a = devtoolsOptions == null ? void 0 : devtoolsOptions.serialize) == null ? void 0 : _a.options) !== "undefined") {
154
- console.warn("[zustand devtools middleware]: `serialize.options` is deprecated, just use `serialize`");
155
- }
156
- let extensionConnector;
157
- try {
158
- extensionConnector = window.__REDUX_DEVTOOLS_EXTENSION__ || window.top.__REDUX_DEVTOOLS_EXTENSION__;
159
- } catch {
160
- }
161
- if (!extensionConnector) {
162
- if ((import.meta.env && import.meta.env.MODE) !== "production" && typeof window !== "undefined") {
163
- console.warn("[zustand devtools middleware] Please install/enable Redux devtools extension");
164
- }
165
- return fn(set, get, api);
166
- }
167
- let extension = Object.create(extensionConnector.connect(devtoolsOptions));
168
- let didWarnAboutDevtools = false;
169
- Object.defineProperty(api, "devtools", {
170
- get: () => {
171
- if (!didWarnAboutDevtools) {
172
- console.warn("[zustand devtools middleware] `devtools` property on the store is deprecated it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
173
- didWarnAboutDevtools = true;
174
- }
175
- return extension;
176
- },
177
- set: (value) => {
178
- if (!didWarnAboutDevtools) {
179
- console.warn("[zustand devtools middleware] `api.devtools` is deprecated, it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
180
- didWarnAboutDevtools = true;
181
- }
182
- extension = value;
183
- }
184
- });
185
- let didWarnAboutPrefix = false;
186
- Object.defineProperty(extension, "prefix", {
187
- get: () => {
188
- if (!didWarnAboutPrefix) {
189
- console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
190
- didWarnAboutPrefix = true;
191
- }
192
- return "";
193
- },
194
- set: () => {
195
- if (!didWarnAboutPrefix) {
196
- console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
197
- didWarnAboutPrefix = true;
198
- }
660
+ const initialState = fn(api.setState, get, api);
661
+ extension.init(initialState);
662
+ if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
663
+ let didWarnAboutReservedActionType = false;
664
+ const originalDispatch = api.dispatch;
665
+ api.dispatch = (...a) => {
666
+ if ((import.meta.env && import.meta.env.MODE) !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) {
667
+ console.warn(
668
+ '[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.'
669
+ );
670
+ didWarnAboutReservedActionType = true;
199
671
  }
200
- });
201
- let isRecording = true;
202
- api.setState = (state, replace, nameOrAction) => {
203
- set(state, replace);
204
- if (!isRecording)
205
- return;
206
- extension.send(nameOrAction === void 0 ? { type: devtoolsOptions.anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction, get());
207
- };
208
- const setStateFromDevtools = (...a) => {
209
- const originalIsRecording = isRecording;
210
- isRecording = false;
211
- set(...a);
212
- isRecording = originalIsRecording;
672
+ originalDispatch(...a);
213
673
  };
214
- const initialState = fn(api.setState, get, api);
215
- extension.init(initialState);
216
- if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
217
- let didWarnAboutReservedActionType = false;
218
- const originalDispatch = api.dispatch;
219
- api.dispatch = (...a) => {
220
- if (a[0].type === "__setState" && !didWarnAboutReservedActionType) {
221
- console.warn('[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.');
222
- didWarnAboutReservedActionType = true;
674
+ }
675
+ extension.subscribe((message) => {
676
+ var _a;
677
+ switch (message.type) {
678
+ case "ACTION":
679
+ if (typeof message.payload !== "string") {
680
+ console.error(
681
+ "[zustand devtools middleware] Unsupported action format"
682
+ );
683
+ return;
223
684
  }
224
- originalDispatch(...a);
225
- };
226
- }
227
- extension.subscribe((message) => {
228
- var _a2;
229
- switch (message.type) {
230
- case "ACTION":
231
- if (typeof message.payload !== "string") {
232
- console.error("[zustand devtools middleware] Unsupported action format");
233
- return;
234
- }
235
- return parseJsonThen(message.payload, (action) => {
685
+ return parseJsonThen(
686
+ message.payload,
687
+ (action) => {
236
688
  if (action.type === "__setState") {
237
689
  setStateFromDevtools(action.state);
238
690
  return;
@@ -242,69 +694,60 @@ function devtools(fn, options) {
242
694
  if (typeof api.dispatch !== "function")
243
695
  return;
244
696
  api.dispatch(action);
245
- });
246
- case "DISPATCH":
247
- switch (message.payload.type) {
248
- case "RESET":
249
- setStateFromDevtools(initialState);
250
- return extension.init(api.getState());
251
- case "COMMIT":
252
- return extension.init(api.getState());
253
- case "ROLLBACK":
254
- return parseJsonThen(message.state, (state) => {
255
- setStateFromDevtools(state);
256
- extension.init(api.getState());
257
- });
258
- case "JUMP_TO_STATE":
259
- case "JUMP_TO_ACTION":
260
- return parseJsonThen(message.state, (state) => {
261
- setStateFromDevtools(state);
262
- });
263
- case "IMPORT_STATE": {
264
- const { nextLiftedState } = message.payload;
265
- const lastComputedState = (_a2 = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a2.state;
266
- if (!lastComputedState)
267
- return;
268
- setStateFromDevtools(lastComputedState);
269
- extension.send(null, nextLiftedState);
697
+ }
698
+ );
699
+ case "DISPATCH":
700
+ switch (message.payload.type) {
701
+ case "RESET":
702
+ setStateFromDevtools(initialState);
703
+ return extension.init(api.getState());
704
+ case "COMMIT":
705
+ return extension.init(api.getState());
706
+ case "ROLLBACK":
707
+ return parseJsonThen(message.state, (state) => {
708
+ setStateFromDevtools(state);
709
+ extension.init(api.getState());
710
+ });
711
+ case "JUMP_TO_STATE":
712
+ case "JUMP_TO_ACTION":
713
+ return parseJsonThen(message.state, (state) => {
714
+ setStateFromDevtools(state);
715
+ });
716
+ case "IMPORT_STATE": {
717
+ const { nextLiftedState } = message.payload;
718
+ const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;
719
+ if (!lastComputedState)
270
720
  return;
271
- }
272
- case "PAUSE_RECORDING":
273
- return isRecording = !isRecording;
721
+ setStateFromDevtools(lastComputedState);
722
+ extension.send(
723
+ null,
724
+ nextLiftedState
725
+ );
726
+ return;
274
727
  }
275
- return;
276
- }
277
- });
278
- return initialState;
279
- };
280
- }
728
+ case "PAUSE_RECORDING":
729
+ return isRecording = !isRecording;
730
+ }
731
+ return;
732
+ }
733
+ });
734
+ return initialState;
735
+ };
736
+ const devtools = devtoolsImpl;
281
737
  const parseJsonThen = (stringified, f) => {
282
738
  let parsed;
283
739
  try {
284
740
  parsed = JSON.parse(stringified);
285
741
  } catch (e) {
286
- console.error("[zustand devtools middleware] Could not parse the received json", e);
742
+ console.error(
743
+ "[zustand devtools middleware] Could not parse the received json",
744
+ e
745
+ );
287
746
  }
288
747
  if (parsed !== void 0)
289
748
  f(parsed);
290
749
  };
291
750
 
292
- var __defProp = Object.defineProperty;
293
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
294
- var __hasOwnProp = Object.prototype.hasOwnProperty;
295
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
296
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
297
- var __spreadValues = (a, b) => {
298
- for (var prop in b || (b = {}))
299
- if (__hasOwnProp.call(b, prop))
300
- __defNormalProp(a, prop, b[prop]);
301
- if (__getOwnPropSymbols)
302
- for (var prop of __getOwnPropSymbols(b)) {
303
- if (__propIsEnum.call(b, prop))
304
- __defNormalProp(a, prop, b[prop]);
305
- }
306
- return a;
307
- };
308
751
  const toThenable = (fn) => (input) => {
309
752
  try {
310
753
  const result = fn(input);
@@ -330,18 +773,19 @@ const toThenable = (fn) => (input) => {
330
773
  };
331
774
  }
332
775
  };
333
- const persist = (config, baseOptions) => (set, get, api) => {
334
- let options = __spreadValues({
776
+ const persistImpl = (config, baseOptions) => (set, get, api) => {
777
+ let options = {
335
778
  getStorage: () => localStorage,
336
779
  serialize: JSON.stringify,
337
780
  deserialize: JSON.parse,
338
781
  partialize: (state) => state,
339
782
  version: 0,
340
- merge: (persistedState, currentState) => __spreadValues(__spreadValues({}, currentState), persistedState)
341
- }, baseOptions);
342
- if (options.blacklist || options.whitelist) {
343
- console.warn(`The ${options.blacklist ? "blacklist" : "whitelist"} option is deprecated and will be removed in the next version. Please use the 'partialize' option instead.`);
344
- }
783
+ merge: (persistedState, currentState) => ({
784
+ ...currentState,
785
+ ...persistedState
786
+ }),
787
+ ...baseOptions
788
+ };
345
789
  let hasHydrated = false;
346
790
  const hydrationListeners = /* @__PURE__ */ new Set();
347
791
  const finishHydrationListeners = /* @__PURE__ */ new Set();
@@ -351,27 +795,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
351
795
  } catch (e) {
352
796
  }
353
797
  if (!storage) {
354
- return config((...args) => {
355
- console.warn(`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`);
356
- set(...args);
357
- }, get, api);
358
- } else if (!storage.removeItem) {
359
- console.warn(`[zustand persist middleware] The given storage for item '${options.name}' does not contain a 'removeItem' method, which will be required in v4.`);
798
+ return config(
799
+ (...args) => {
800
+ console.warn(
801
+ `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
802
+ );
803
+ set(...args);
804
+ },
805
+ get,
806
+ api
807
+ );
360
808
  }
361
809
  const thenableSerialize = toThenable(options.serialize);
362
810
  const setItem = () => {
363
- const state = options.partialize(__spreadValues({}, get()));
364
- if (options.whitelist) {
365
- Object.keys(state).forEach((key) => {
366
- var _a;
367
- !((_a = options.whitelist) == null ? void 0 : _a.includes(key)) && delete state[key];
368
- });
369
- }
370
- if (options.blacklist) {
371
- options.blacklist.forEach((key) => delete state[key]);
372
- }
811
+ const state = options.partialize({ ...get() });
373
812
  let errorInSync;
374
- const thenable = thenableSerialize({ state, version: options.version }).then((serializedValue) => storage.setItem(options.name, serializedValue)).catch((e) => {
813
+ const thenable = thenableSerialize({ state, version: options.version }).then(
814
+ (serializedValue) => storage.setItem(options.name, serializedValue)
815
+ ).catch((e) => {
375
816
  errorInSync = e;
376
817
  });
377
818
  if (errorInSync) {
@@ -384,10 +825,14 @@ const persist = (config, baseOptions) => (set, get, api) => {
384
825
  savedSetState(state, replace);
385
826
  void setItem();
386
827
  };
387
- const configResult = config((...args) => {
388
- set(...args);
389
- void setItem();
390
- }, get, api);
828
+ const configResult = config(
829
+ (...args) => {
830
+ set(...args);
831
+ void setItem();
832
+ },
833
+ get,
834
+ api
835
+ );
391
836
  let stateFromStorage;
392
837
  const hydrate = () => {
393
838
  var _a;
@@ -404,16 +849,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
404
849
  if (deserializedStorageValue) {
405
850
  if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
406
851
  if (options.migrate) {
407
- return options.migrate(deserializedStorageValue.state, deserializedStorageValue.version);
852
+ return options.migrate(
853
+ deserializedStorageValue.state,
854
+ deserializedStorageValue.version
855
+ );
408
856
  }
409
- console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`);
857
+ console.error(
858
+ `State loaded from storage couldn't be migrated since no migrate function was provided`
859
+ );
410
860
  } else {
411
861
  return deserializedStorageValue.state;
412
862
  }
413
863
  }
414
864
  }).then((migratedState) => {
415
865
  var _a2;
416
- stateFromStorage = options.merge(migratedState, (_a2 = get()) != null ? _a2 : configResult);
866
+ stateFromStorage = options.merge(
867
+ migratedState,
868
+ (_a2 = get()) != null ? _a2 : configResult
869
+ );
417
870
  set(stateFromStorage, true);
418
871
  return setItem();
419
872
  }).then(() => {
@@ -426,15 +879,18 @@ const persist = (config, baseOptions) => (set, get, api) => {
426
879
  };
427
880
  api.persist = {
428
881
  setOptions: (newOptions) => {
429
- options = __spreadValues(__spreadValues({}, options), newOptions);
882
+ options = {
883
+ ...options,
884
+ ...newOptions
885
+ };
430
886
  if (newOptions.getStorage) {
431
887
  storage = newOptions.getStorage();
432
888
  }
433
889
  },
434
890
  clearStorage: () => {
435
- var _a;
436
- (_a = storage == null ? void 0 : storage.removeItem) == null ? void 0 : _a.call(storage, options.name);
891
+ storage == null ? void 0 : storage.removeItem(options.name);
437
892
  },
893
+ getOptions: () => options,
438
894
  rehydrate: () => hydrate(),
439
895
  hasHydrated: () => hasHydrated,
440
896
  onHydrate: (cb) => {
@@ -453,6 +909,7 @@ const persist = (config, baseOptions) => (set, get, api) => {
453
909
  hydrate();
454
910
  return stateFromStorage || configResult;
455
911
  };
912
+ const persist = persistImpl;
456
913
 
457
914
  const walletStoreSelector = (state) => ({
458
915
  accounts: state.accounts,
@@ -462,7 +919,7 @@ const walletStoreSelector = (state) => ({
462
919
  addAccounts: state.addAccounts,
463
920
  removeAccounts: state.removeAccounts,
464
921
  });
465
- const useWalletStore = create(devtools(persist(immer((set, _get) => ({
922
+ const useWalletStore = create()(immer(persist(devtools((set, _get) => ({
466
923
  accounts: [],
467
924
  activeAccount: null,
468
925
  setActiveAccount: (account) => {
@@ -496,8 +953,1195 @@ const useWalletStore = create(devtools(persist(immer((set, _get) => ({
496
953
  })), {
497
954
  name: "txnlab-use-wallet",
498
955
  version: 0, // increment to deprecate stored data
499
- }), { name: "local-storage" } // prefix in Redux DevTools
500
- ));
956
+ })));
957
+
958
+ const icon$6 = "data:image/svg+xml;base64," +
959
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=";
960
+ const PERA_WALLET = {
961
+ id: PROVIDER_ID.PERA_WALLET,
962
+ name: "Pera Wallet",
963
+ icon: icon$6,
964
+ isWalletConnect: true,
965
+ };
966
+
967
+ const icon$5 = "data:image/svg+xml;base64," +
968
+ "PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHBhdGggZmlsbD0iIzI0NUVDNiIgZD0iTTE2LDMyYy0zLjIsMC02LjItMC45LTguOS0yLjdjLTIuNi0xLjgtNC43LTQuMy01LjktNy4yQzAsMTkuMi0wLjMsMTYsMC4zLDEyLjlDMC45LDkuOCwyLjQsNyw0LjcsNC43IEM2LjIsMy4yLDcuOSwyLDkuOSwxLjJDMTEuOCwwLjQsMTMuOSwwLDE2LDBzNC4yLDAuNCw2LjEsMS4yYzEuOSwwLjgsMy43LDIsNS4yLDMuNXMyLjcsMy4zLDMuNSw1LjJjMC44LDEuOSwxLjIsNCwxLjIsNi4xIHMtMC40LDQuMi0xLjIsNi4xYy0wLjgsMS45LTIsMy43LTMuNSw1LjJjLTEuNSwxLjUtMy4yLDIuNy01LjIsMy41QzIwLjIsMzEuNiwxOC4xLDMyLDE2LDMyTDE2LDMyeiBNMjAuMiwxMS4ybDAuMSwwLjVsMi42LDkuNWgyLjEgTDIxLjUsOC45bC0wLjEtMC4zaC0xLjlsMCwwLjFsLTEuNywzLjFMMTYsMTQuOWwwLDAuMWwwLTAuMWwtMC4yLTAuOGwtMC42LTIuNGwtMC4xLTAuMmwtMC43LTIuNmwtMC4xLTAuM2gtMS45bDAsMC4xbC0xLjcsMy4xIGwtMS44LDMuMkw3LjEsMThsLTEuOCwzLjJoMi4xTDkuMiwxOGwxLjgtMy4ybDEuOC0zLjJsMC4zLTAuNWwwLjEsMC41bDAuNSwyLjFsMC43LDIuNmwwLjIsMC45TDE0LjIsMThsLTEuOCwzLjJoMi4xbDAuOC0xLjMgbDEuMy0yLjNsMS41LTIuN2wxLjgtMy4yTDIwLjIsMTEuMkwyMC4yLDExLjJ6Ii8+Cjwvc3ZnPgo=";
969
+ const MYALGO_WALLET = {
970
+ id: PROVIDER_ID.MYALGO_WALLET,
971
+ name: "MyAlgo Wallet",
972
+ icon: icon$5,
973
+ isWalletConnect: false,
974
+ };
975
+
976
+ const icon$4 = "data:image/svg+xml;base64," +
977
+ "PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
978
+ const ALGO_SIGNER = {
979
+ id: PROVIDER_ID.ALGO_SIGNER,
980
+ name: "AlgoSigner",
981
+ icon: icon$4,
982
+ isWalletConnect: false,
983
+ };
984
+
985
+ const icon$3 = "data:image/svg+xml;base64," +
986
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
987
+ const DEFLY = {
988
+ id: PROVIDER_ID.DEFLY,
989
+ name: "Defly Wallet",
990
+ icon: icon$3,
991
+ isWalletConnect: true,
992
+ };
993
+
994
+ const icon$2 = "data:image/svg+xml;base64," +
995
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
996
+ const EXODUS = {
997
+ id: PROVIDER_ID.EXODUS,
998
+ name: "Exodus",
999
+ icon: icon$2,
1000
+ isWalletConnect: false,
1001
+ };
1002
+
1003
+ const icon$1 = "data:image/svg+xml;base64," +
1004
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+";
1005
+ const KMD_WALLET = {
1006
+ id: PROVIDER_ID.KMD_WALLET,
1007
+ name: "KMD",
1008
+ icon: icon$1,
1009
+ isWalletConnect: false,
1010
+ };
1011
+
1012
+ const icon = "data:image/svg+xml;base64," +
1013
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==";
1014
+ const WALLET_CONNECT = {
1015
+ id: PROVIDER_ID.WALLET_CONNECT,
1016
+ name: "Wallet Connect",
1017
+ icon,
1018
+ isWalletConnect: true,
1019
+ };
1020
+
1021
+ const providers = {
1022
+ [PROVIDER_ID.PERA_WALLET]: PERA_WALLET,
1023
+ [PROVIDER_ID.MYALGO_WALLET]: MYALGO_WALLET,
1024
+ [PROVIDER_ID.DEFLY]: DEFLY,
1025
+ [PROVIDER_ID.ALGO_SIGNER]: ALGO_SIGNER,
1026
+ [PROVIDER_ID.EXODUS]: EXODUS,
1027
+ [PROVIDER_ID.KMD_WALLET]: KMD_WALLET,
1028
+ [PROVIDER_ID.WALLET_CONNECT]: WALLET_CONNECT,
1029
+ };
1030
+
1031
+ const audio = "data:audio/mp3;base64,SUQzBAAAAAIYBlRJVDIAAAAWAAAAMTAgU2Vjb25kcyBvZiBTaWxlbmNlVFBFMQAAABIAAABBbmFyIFNvZnR3YXJlIExMQ1RBTEIAAAAMAAAAQmxhbmsgQXVkaW9BUElDAAIPAgAAAGltYWdlL2pwZWcAAwCJUE5HDQoaCgAAAA1JSERSAAAEOAAABDgIBgAAAOwQbI8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACD0AAAg9AQWVVbYAAAAHdElNRQffCgsFHDEDbwR2AAAgAElEQVR42uzde5RVZd0H8N8wDDcBAS8o6oCJVyxTsDSxojJvgVYq3jVNUQgzaZWmpqh56+ItNa+kr4Cay9Q0DQ1DWb2WeSm8pGRy0RAEgRFhuIzz/tFbC5yZc86eOWfmPDOfz1rvemvvZz9779+zz3DOt2fvXRER9QEAAACQsE5KAAAAAKROwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8BBq9pss81i4sSJMXToUMUAAACgaCoiol4ZaA177rln3HzzzdG/f/+oqamJww8/PGbNmqUwAAAAtJgZHLSKk046Ke67777o379/RET07t07pk6dGtXV1YoDAABAi5nBQcmde+65MW7cuEbXvfjii3HIIYfE2rVrFQoAAIBmq4yIC5WBUqioqIgf/ehHceqppzbZZosttohevXrFk08+qWAAAAA0/zdomMFBCVRWVsZPfvKTGD16dEHtjzrqqJgxY4bCAQAA0CwCDoquU6dOccMNN8SoUaMK3mbOnDkxYsSIWL16tQICAACQmVtUKLoLL7wwjj766Ezb9OnTJz788MP44x//qIAAAABkZgYHRXXyySfHxRdf3Kxt16xZEyNGjIg333xTIQEAAMjEa2Ipmv333z8mTpzY7O27dOnSou0BAADouMzgoCh23333uO+++6J79+4t7utLX/pSvPLKK4oKAABAwczgoMW22mqruOOOO4oSbkREjBs3TlEBAADIxAwOWqRTp05x3333xV577VW0Puvq6uIzn/lMzJ8/X4EBAAAo7PepEtASp59+elHDjYiIysrKOO200xQXAACAgpnBQbPtuuuu8cgjj0RVVVXR+66trY0999wzlixZotAAAADkZQYHzdKtW7e4/vrrSxJu/Kf/r3/96woNAABAQQQcNMv5558f22+/fUn3MWrUKIUGAACgIAIOMvvCF74Q3/jGN0q+nz322COqq6sVHAAAgLwEHGRSVVUVl156adH7Xbp0aaPLzeIAAACgEAIOMjn22GOLPqvimWeeic997nOxaNGiBusOOeQQRQcAACAvAQcF69GjR5x55plF7fOhhx6KI488MhYvXhxTp05tsH7IkCGx3XbbKT4AAAA5CTgo2De/+c3YbLPNitbfM888E+PGjYs1a9ZERMTkyZOjvr7hW4vN4gAAACAfAQcF6dOnT4wdO7Zo/S1dujTGjh0bdXV1/1321ltvxaxZsxq0HTFihAEAAAAgJwEHBfnWt74VvXv3Llp/Z555ZrzzzjsNlj/++OMNln3iE5+Irl27GgQAAACaJOAgr/79+8dJJ51UtP5uu+22RoOMiIhp06Y1WFZVVRWf+MQnDAQAAABNEnCQ19ixY6Nbt25F6evdd9+Nyy+/vMn1s2bNanRmx5577mkgAAAAaJKAg9wXSKdOMWrUqKL199Of/jQ++OCDnG0am90h4AAAACDn71clIJe99tor+vfvX5S+3njjjZgyZUredo0FHMOGDTMYAAAANEnAQU4jR44sWl8/+tGPYt26dXnbPf3007Fq1aoNlm2yySax7bbbGhAAAAAaJeCgSZWVlXHwwQcXpa9nn302HnvssYLarl69Ol588cUGyz/1qU8ZFAAAABol4KBJe++9d2y66aZF6euiiy7K1P6VV15psGyPPfYwKAAAADRKwEGTDjnkkKL088gjj8Rzzz2XaZuXX365wbKBAwcaFAAAABol4KBRnTt3joMOOqjF/axbty4uvfTSzNs1NoNjq622MjAAAAA0SsBBo/bZZ5/o27dvi/v5n//5n3jzzTczb/faa69FfX39BssGDBhgYAAAAGiUgINGFeOBnitWrIirrrqqWduuXr063n///Q2Wde/evSihCwAAAO2PgING7brrri3u46abborFixc3e/ulS5c2WOY2FQAAABoj4KBRQ4YMadH2a9eujV/+8pct6mPZsmUNlrlNBQAAgMYIOGigT58+LQ4SHnrooViyZEmL+mgs4DCDAwAAgMYIOGhg8ODBLe6jpbM3IiI++OCDBssEHAAAADRGwEED/fr1a9H2s2bNiueee67Fx9HYA0UFHAAAADRGwEEDLX1TyaRJk4pyHJtvvnmDZZ7BAQAAQGMEHDTQkhkcy5YtiwceeKAox7HZZps1WNazZ08DBAAAQAMCDhro06dPs7e9++67o7a2tsXH0KVLl+jdu3eD5Z07dzZAAAAANCDgoIHKyspmbVdfXx933nlnUY5hu+22K+qxAQAA0L4JOGhg5cqVzdpu+vTpMWfOnKIcw/7779/ocgEHAAAAjRFw0EBzA45ivBr2Pw488MBGl7tFBQAAgMYIOGjggw8+yLzN3Llz48knnyzK/rfaaqv4+Mc/3ug6AQcAAACNEXDQQHNmcEyePDk+/PDDouz/oIMOanKdW1QAAABojICDBpoTcDz22GNF2XePHj1i7NixTa4XcAAAANAYAQcNZL1FZc6cOfGPf/yjKPseP3589O/fv8n1Ag4AAAAaI+CggawzOKZNm1aU/W699dZx2mmn5WzjGRwAAAA0RsBBA1lncDz++ONF2e95550XXbt2zdmmWM/5AAAAoH0RcNBAlhkcNTU18ac//anF+9xzzz1j1KhRedstWrTIAAEAANCAgIMG3nnnnaivry+o7fTp02PdunUt2l9FRUVMnDixoLb/+te/DBAAAAANCDhoYPXq1bFw4cKC2hbj+RuHHXZYfPKTnyyo7YIFCwwQAAAADQg4aNScOXPytlm3bl1Mnz69Rfvp0aNH/OAHPyi4vYADAACAxgg4aNTcuXPztvnzn/8cNTU1LdrPuHHjcr4W9qMEHAAAADRGwEGjCgk4Xn/99RbtY6uttorTTz890zaewQEAAEBjBBw0qpBbVJYvX96ifVx55ZXRrVu3TNuYwQEAAEBjBBw0at68eXnbtCTgOO6442LEiBGZtxNwAAAA0JjOSkBjCpnBsWzZsmb1PXDgwLjgggsyb7dmzZp47733DA4AANCqKioqmr0sa9tCt1+3bl18+OGHBmc9Ao717LTTTrHjjju2yoVbqu1b+mFaf3ltbW3OW0h233336Ny5c6Z9VVRUxJgxY6JHjx6Zx2fBggVx4oknluRcy2Vcy+EPain2laVdSuea0nWVyjXoXNvn562tx6pcz7UUY9Xevos4V99FfBfxXaRcPgPl6OSTT45HH33UD/n1xzQi6pXh3yZMmBATJkxQCAAAAMraKaecEo888ohCrMcMjiJZvHhxo7ds1Nc3nh9lWZ61j6Zk7bu6ujp69+7dZH8LFiyIxYsXF3yM3bp1ix122KHZSens2bPj/fffb9b5t8U4pDDG5VyTVMcy6z6LcZ4pjHG51NvnNYyxz6ux7EDfF4yxsWwP36E68vf7Aw44IMaNG9fk+k6dPFJTwFEi1113Xdxyyy3t6py+973vxZlnntnk+nvvvTeuuOKKgvqqqqqK3/72t80ON9asWRNf/vKXY/Xq1S42AACg3dtpp51yrk/9FptSEPnQpL/97W851/fp06fgvs4666wYMmRIs4/lL3/5i3ADAADoMPI9QNQMjkZqogQ0ZdasWTnX9+3bt6B+9thjj/jWt77VomP54x//aEAAAIAOQ8CRnYrQpLfffjvna1kLmcHRrVu3uPbaa6OysrJFxzJz5kwDAgAAdBj5ntch4GikJkpALrlmcVRXV+fd/rzzzouPfexjLTqGVatWxQsvvGAwAACADsMMjuxUhJxyPYejuro6unbt2uT64cOHxze+8Y0WH8PMmTNj7dq1BgMAAOgw8s3g8JDRhgQc5JQr4OjUqVOTszM22WSTuOaaa4ryobvzzjsNBAAA0KHkm8HR0scAtEcCDnLK96DR7bffvtEP2o033hhbbrlli/c/Z86cmD59uoEAAAA6FLeoZKci5DRv3rxYvnx5k+sbCzjOOeecGD58eFH2f8cdd+SdmgUAANDeeMhodipCXrlmcXw04Dj44INj7NixRdnvqlWrYurUqQYAAADocMzgyE5FyCvXczjWDzgGDx4cV111VdH2e//990dNTY0BAAAAOpx8AYeHjDbUWQnIJ1fAsd1220VlZWV07949br/99ujZs2fR9jtp0iTFBwAAOiQzOLJTEfLKFXB06dIlqqur46qrrorBgwcXbZ9/+tOf4pVXXlF8AACgQxJwZKci5DV37tyct4pcfvnlcfDBBxd1nzfeeKPCAwAAHZaHjGanIhT0wXrppZeaXL/vvvsWdX9PPfVUTJs2TeEBAIAO/Tss5495AUfDmigBhch1m0oxrVu3Ls4//3wFBwAAOjS3qGSnIhQk16tii+n222+P2bNnKzgAANChCTiyUxEK0hozOBYvXhw/+9nPFBsAAOjwBBzZqQgFefPNN2PFihUl3cell16a82GmAAAAHYWAIzsVoeAP18svv1yy/l988cW45557FBoAACA8ZLQ5VISCvfLKKyX74J533nl5P8AAAAAdRb4ZHBUVFYr0EQIOCjJkyJA47LDDStL3TTfdFM8//7wiAwAA/D+3qGSnIuQ1aNCgmDJlSvTq1avofb/44otx2WWXKTIAAMB6BBzZqQg59e/fP+65557YbLPNit73+++/H6effnqsXbtWoQEAANYj4MhORWjSxhtvHFOnTo1tttmmJP1/73vfi7lz5yo0AABA1h/zAo6GNVECGtO9e/e46667YqeddipJ/1OnTo0HH3xQoQEAABphBkd2KkIDVVVVceutt8bQoUNL0v/rr78e5513nkIDAAA0QcCRnYqwgYqKirjmmmtixIgRJel/9erVcdppp8WqVasUGwAAoAkCjuxUhA1ccsklceihh5as/3PPPTf+/ve/KzQAAEAOAo7sOisBEf+euXHppZfGCSecULJ93HjjjTFlyhTFBgAAyCNfwFFRUaFIHyHgIDp16hQ//elPY/To0SXbxyOPPBKXXHKJYgMAABSgvr4+7+84NiTg6OgXQOfOce2115b0tpTnn38+xo8fn/cDCgAAwL+5RaUZv2+VoOOqqqqKG2+8MQ466KCS7WPevHlx4oknRm1trYIDAABlpbHbPJq69aNYywtt27lz7p/rAo6GBBxFMmzYsFi9enWbfwgKXV5VVRWjR4+OHXbYoWQ1qa2tjYcffjgOP/zwZp9j1vMs5R+jch3LcqxJKc+znGpVLv9QpjrGqX5e29sY+7waS2NsjP0b4zthR/hO2B4JOAQcJTNy5MgYOXKkQqynW7duMXbsWIUAAAAoMgFHQwKOIlm8eHEsW7aswfLGnjvR1LMoWtq2Keu3raioiIEDB0aPHj1KWo958+bF0qVLS16HLLVpzbEo13Mrh/PNcm6pjaVza/3jNZbOrb2dm3/v2te5+Qym9z3FZ9C5ldP3lL59+8a9994r4BBwtL7rrrsubrnllrI+xt69e8eUKVNKHm5ERBx88MGxZMkSFwYAAEAzbLLJJjnXCzgaqYkSdAz9+vWL++67L/bYY49W2V9r7QcAAKA98haV7FSkA+jdu3fce++9seuuu7baPocPH67wAAAAzSTgyE5F2rlu3brFHXfcEbvsskur7lfAAQAA0Hz5ni3Skd4YUygBRzvWuXPnuOmmm+LTn/50q+97p512ik033dQgAAAANIMZHNmpSDtVUVERP/vZz2K//fZrs/2bxQEAANA8Ao7sVKSduvDCC+Owww4r6T5mzpwZNTU1Ta7fd999DQQAAEAzCDiyU5F2aPz48XHKKaeUdB/PPfdcnHjiifHXv/61yTYCDgAAgObJF3BUVlYq0kcIONqZL37xi3H22WeXdB+vvvpqHHvssbFy5cp4/vnnm2y39dZbx6BBgwwKAABARh4ymp2Aox0ZOHBg/PznPy/phT537tw4+uijY/ny5RER8cILL+Rs7zkcAAAA2blFJTsVaSe6desWt956a2y88cYl28eiRYviqKOOioULF/53Wb6Aw20qAAAA2Qk4slORduLyyy+PIUOGlKz/mpqaOOqoo2LOnDkbLH/33XfjrbfeanK7ffbZx9QpAACAjPLdoiLgaKQmSpC+448/Po444oiS9V9bWxvHH398vPrqq42uzzWLo1+/fiUNXgAAANqrXLM4BByN1EQJ0rbHHnvExRdfXLL+161bF6eeemr8+c9/brKN21QAAACKL1fAYaZ8QwKOhHXp0iWuvfbaqKqqKkn/9fX1ceaZZ8YTTzyRs12uN6lEeNAoAABAc3+TNflj3gyOhjVRgnSNHz8+Pvaxj5Ws/x/+8Idx//335203a9asWLduXZPr99prr5KFMAAAAO1VXV1d0z/mBRwNa6IEadp2221j/PjxJev/5z//edx2220FtV21alW89tprTa7v3r17DB061KABAABkkOsWlcrKSgX6CAFHoq644oro0qVLSfr+/e9/H5dffnmmbfLdpuI5HAAAANl4Bkc2nZUgPV/72tdK9lyLN998M8aNG5f3ncsf9fzzz8dxxx3X5Prhw4fHj3/844iI2GSTTWLPPfeMXXbZJfr16xd9+/bd4P/36dMnVq5cGUuWLInFixfH4sWL//uf586dGzNmzIhly5a5EAAAgHbNW1SyEXAkpnfv3nHhhReWpO8PPvggvvGNb0RNTU3mbV988cWc63fbbbf42c9+Fp/61KcKem5Iz549Y/PNN290XV1dXTz77LPx+OOPx7Rp0+KNN95wYQAAAO2Oh4xmI+BIzLnnnhubbrppST44Z5xxRrz++uvN2n727NmxYsWK6NmzZ6Pru3TpEkceeWRRjrWysjL22muv2GuvveL888+PN998Mx577LG4+eabY+HChS4SAACgXTCDIxsVScigQYPimGOOKUnf11xzTTz66KMt+uDlm8VRKttuu22cfvrpMXPmzBg/fnzJnk0CAADQmgQc2ahIQk455ZSSXMRPPPFE/OQnP2n29hUVFXHEEUfE4MGD27Q+G220UZxzzjkxY8aMOPDAA10wAABA0gQc2ahIIjbeeOMYPXp00ft9880341vf+lbmh4r+xy677BIPPvhgXH311bHFFluURa0GDhwYt912W9x7772x8847u3gAAIAkeYtKNgKORBx33HHRo0ePon9YzjjjjGY9VLRXr15x8cUXx+9+97sYNmxYWdZs+PDh8dhjj8URRxzhAgIAAJLjIaPZqEgCqqqq4uSTTy56vzfffHM899xzmbf76le/Gk8//XScfPLJUVlZWfa1u/rqq2PChAkuJAAAICluUclGRRJwyCGHRP/+/Yva5z//+c+48sorM21TWVkZl156aVx//fVNvsK1XE2YMCGuuuqqqKqqckEBAABJyBVwlPv/2NwWBBwJGDNmTNE/JN/5zneitra24G169+4dd911V5x44onJ1nH06NFx1113Ra9evVxUAABA2fMMjmwEHGVu+PDhMWTIkKL2efvtt8ezzz5bcPuBAwfGb37zm/jc5z6XfD333XffeOCBB4o+IwYAAKDY3KKSjYqUua9+9atF7W/OnDlx2WWXFdz+05/+dDzyyCOx/fbbt5ua7rzzzvHLX/4yunXr5gIDAADKloeMZtNZCcpbsWdNfPe7341Vq1YV1PaTn/xkTJ06tV0GAbvttltcddVVcfrpp7vIAICSa2oqeTGWZ52mXoy+2+J8inGe5XTcxTjPFI67PV2zbTGWuZ4hKOAQcJTMgQceGNtss01RPwQbb7xxDBgwoGjHOH/+/Bg1alSMGjUq77H07NkzDjjggHY9y+GQQw6JwYMHx9///vd2/Y9WOf3x949W+/likuoXLWNsjP0w8m9MW/2NACg2AUcjf5cjojspCGQAACAASURBVF4Z/m3ChAleJwoAAEDZW7hwYey+++4KsR4zOIrk1Vdfjblz5zZY3tg9U03dR/XR5cOGDSvawzDnz58fL7zwQt5jiPj3cze22GKLDjN2a9eujccffzyWLVtWlHErZdumlOIYWvt8s9SgXMfHuXXMczOWzs25Ff/flfb8GfT3xbm5Tp1blrZPPPFEbLfddo22N4NDwFEyd999d9xyyy1F66+qqipeeeWVov2AP/zww2PevHl5206cOLFDhRv/qfWuu+4aX/jCF2LlypUuZgAAoCzU1dU1uU7A0UhNlKA8DR06NDbaaKOi9HXXXXcVFG7svffeccopp3TIeldXV8cZZ5zhwgMAAMpGrtfEVlZWKtBHCDjK1Gc/+9mi9LNy5cq4+uqr818InTrFxIkTO3TNTzvttBg0aJCLDwAAKAteE5uNipSpYr0e9t5774133303b7vRo0fHrrvu2qFr3qVLlw4f8gAAAOUj1wwOb3JqSMBRpnbaaaei9DN58uS8bXr27Blnn322okfEfvvtF1/84hcVAgAAaHO5Ag4zOBqpiRKUn169ekX37t1b3M9f//rXePnll/O2+/a3vx2bbbaZwv+/iy66KKqqqhQCAABoUwKObFSkDG2++eZF6WfKlCl522y55ZYd9sGiTdl2223j1FNPVQgAAKBNCTiy8ZrYMtS/f/8W97Fy5cr49a9/nbfdqFGjokuXLm1ynq+++mrceuutUV1dHQMHDozq6uqorq6OTTfdtM3HYMyYMXHzzTfH2rVrXZAAAECbEHBkI+AoQ8W4XeShhx6KFStW5G138MEHF/346+rq4sknn4y+ffvG0KFDm2zXp0+fmDp1aoPlgwYNimOOOSZGjx7dZmHHpptuGgcccED85je/cUECAABtItdbVDxktCGRTxkqxgyOQn6Y9+/fP2cAkdW8efPiyiuvjD333DOOP/74eOyxx3K233LLLaNnz54Nls+ZMyd+9KMfxdChQ+PUU0+Np556KucHu1SOO+44FyMAANBmzODIRkXKUEufwbF27dp45pln8rY76KCDipL6zZo1K4488sjYe++94+qrr4533nknIiJef/31vNvusMMOOc/j4YcfjiOPPDI+85nPxOOPP96q47DPPvvEoEGDXJAAAECbEHBkoyJlqKUBx1/+8pdYtWpV3nYHHnhgi/ZTU1MT5557bhx00EGNzrJ47bXX8vax/fbbF7SvuXPnxoknnhgTJ05stediVFRUxLHHHuuCBAAA2kSugCNCyNGgHkpQflp6i8rTTz+dt02/fv1i7733bvY+fv/738dnP/vZmDRpUtTV1TXaZv78+bFy5cqc/eSawfFR9fX1cdNNN8UhhxwS8+bNa5WxGD16tFfGAgAAbULAkY1qlKGWzuAoJODYb7/9orKysln9X3vttXHCCSfEokWLcrarr6+P2bNn52yTJeD4jxdffDG+/OUvt8oDQDfZZJM44IADXJQAAECry/csQg8a3ZCAo515//3348UXX8zbbtttt83c99q1a2PMmDFx+eWX500S/yPfbSrNCTgi/n17zJgxY+Luu+8ueU332WcfFxYAANDqzODIRjXK0OLFi5u97d///vcmbxlZX9++fTP3feGFF2aeNZHvQaNbb7119OjRo9nne/bZZ8dzzz1X0vHYY489XJQAAECrE3BkoxplaMmSJc3e9o033iioXZ8+fTL1e++998akSZMyH0++GRwVFRUxePDgZp/vmjVr4pvf/GYsXLiwZOOx0047Rffu3V2YAABAqxJwZKMaZaglAcc//vGPgtplmcHxt7/9Lb7//e8363gKeZNKc29T+Y+FCxfGySefHGvWrCnJeHTu3Dl22203FyYAANCqBBzZqEYZasktKsUOOJYsWRInn3xyrF69ulnH8/bbb8cHH3yQs01LA46IiOeff77ZIUwh3KYCAAC0Ng8ZzUbAUYbK6RaVCRMmxNtvv92iD2S+53AUI+CIiLjnnnvi97//fUnGRMABAAC0tnwBR3PfjNleCTjKUHNncHz44Ycxd+7cgtr27t07b5t58+bF448/3uLzKdWbVBpz0003lWRMdt99dxcmAADQqtyiko1qlKH58+c3a7sVK1bEunXrCmq7dOnSvG2mTJmSNzEsRL6Ao7q6Orp27VqU2s2cOTNefvnloo9J1oeyAgAAtJSAIxvVKEMvv/xyQQHERy1btqzgtvPmzcu5ft26dXHPPfcU5XzyBRydOnWK7bbbrmj1K8Usji5durgwAQCAViXgyEY1yvQifvrppzNvt3z58oLb5psl8sQTTxTt1aut8SaV9T344IPxzjvvFHVMKisr3d8GAAC0Kg8ZzUbAUaZmzJiReZssAUe+Z3X89re/Ldq5LFiwIN5///2cbYoZcKxduzZuu+22oo+JWRwAAEBrMoMjG9UoU80JOIp5i8qCBQuKej6t9SaV/5g8eXJRnh+yPgEHAADQmgQc2ahGmfrXv/4Vs2fPzrRNXV1dwW3z3aJS7Fs85syZk3N9MZ/BEfHvsKclr7dtTLEehAoAAFAIAUc2qlHGss7i6NevX8FtZ8+enfONK4sWLSrqueS7JWabbbYpev0KefZHpg+LPx4AAEArEnBk/M2mBOXrySefzNQ+S8BRU1MTzzzzTKPrVq1alfeZGVnluyWmR48esckmmxR1n8UMONatWxeLFy92UQIAAK3GQ0azEXCUsaeeeirTbRZZAo6IiGnTprXahyTfDI6I4s/iyPfcjyzeeuutnDNeAAAAii3fDA5vetyQgKOM1dXVxR133FFw+6wzIJoKOLp16xabbbZZUc+lkICjurq6qPss5gyOfM8QAQAAKDa3qGTTWQnK25QpU+K73/1uQW/w6NKlS2y00UbxwQcfFNT3vHnz4tVXX42dd965wbptttkm3n333aKdx8KFC2PNmjU5z2Prrbcuau1mz54d9fX1RZmR8uabb7oYAYAWaew7SVPfU4q1vFR9l/K4i3GOKZ9Pa49lW12brtnC2vfp00fAIeBofQceeGCjt1gU4wMzb968GDx4cEHHcfXVVzf5rIjG+m7qtouzzz670VkLLTmf2tranAHHkUceGdtvv31RvySsXLkyNtpooxaP79ChQ+P6669P8o95Of2R78hfQFI+n478BcQY+5Lph1HH+jem1NcVQLH5O/SRekREvTL824QJE2LChAkKAQAAQNnbb7/94uWXX1aI/2cGR5G89NJL8cYbbzRY3thTb5t6Em6utiNGjCjoIaJLliyJ6dOnZzqGvfbaKwYOHLjB+qVLl/73GR3NOd7Glu+5556xww47NHnsNTU18dBDDxWtZhERhx12WPTs2bPF43vPPffEihUrilKH1mrblHI93izbZ6lBSufr3NI9t/b6Gcxybq5T5+bc0vn7Yiydm3Nr23PLsv1ll10WJ5xwQpPH4hYVAUdJ/OpXv4pbbrmlZP1/9atfbfIWifX17ds3Lrjggli2bFnBfe+4444xffr0DaY39e3bN3784x/Hv/71r6Kdw5gxY+KCCy5ocn3Xrl3j+9//fqY/LvmMHDmyxQHH66+/Ht/5zndc5AAAQKvykNFsVCMRDz74YLz66qv5B7RTp/jsZz+bqe/XXnstHnvssQbL999//6KeQ743qXTt2jU233zzou6zR48eLe5jxowZLkAAAKDV5fsffwUcH6mHEqThww8/jIsvvrigtiNGjMjc/9VXX91g2UknnVTU9yoX8qrYYr5JZcCAAdG9e/cW9yPgAAAA2kJdXV3uH/QCjg3roQTp+MMf/hBPPfVU3nb77bdf5h/2s2bNismTJ2+wbLvttotDDz20aMc/f/78vG2qq6uLtr/dd9+9xX2sWbMm/vd//9fFBwAAtDq3qGSjGom56KKL8l7k/fr1i+OPP75Zfb/99tsbLPv+979f0MNNC7FixYpYsmRJzjblFnD8+c9/jlWrVrnwAACAVifgyEY1EvPKK6/Efffdl7fd6aefHt26dcvU9/vvvx/f/e53N1i29dZbxxlnnFG04583b17O9dtss03R9lWMgOP+++930QEAAG3CMziyUY0EXXHFFVFbW5uzzeabbx7HHnts5r5nzJgRt99++wbLli5dWrRjzxdwFGsGR/fu3WO33XZrUR+LFy8WcAAAAG3GMziyUY0ELViwIK677rq87caNGxddu3bN3P8Pf/jDuOeee/773996662iHXu+B40W6yGjX/nKV1r8BpU77rgj1qxZ44IDAADaRL5bVCoqKhRpPQKORF133XXxt7/9LWeb/v37xzHHHNOsD9GECRNi0qRJsWbNmgbP5WiJfAHHVlttVZQU8sgjj2zR9mvWrIk777zThQYAALQZz+DIRjUStW7duvj2t7+dd4bB+PHjY+ONN27WB+ncc8+NIUOGxAsvvFC04853i0pVVVVsscUWLdrHoEGDYq+99mpRH7/+9a/j3XffdaEBAABtRsCRjWok7LXXXosrr7wyZ5v+/fvH1Vdf3ex9fPDBB7F69eqiHXO+GRwRLX8Ox+jRo1s0VWvt2rVxww03uMAAAIA2JeDIRjUS94tf/CL+8pe/5Gyz//77x6mnnloWx7tgwYJYu3ZtzjYteZNKr169mnVbzvp+/vOfx+zZs11cAABAmxJwZKMa7eCCP+OMM2LVqlU525177rlFeW1qS9XV1eV9pkdLZnBMmDAhNt1002ZvP3v27BbNeAEAACjm772cP+gFHBvWQwnSN2fOnDj//PNztqmqqopf/OIX0bt37zY/3nzP4Wjum1R23HHHOOmkk1r0x+Oss87KO8MEAACgNXhNbDaq0U5MmTIlJk+enLPNNttsUxazE/I9h2PAgAHN6vfiiy+Ozp07N/u4Jk2aFM8995yLCQAAKAv19fW5f9ALODashxK0Hz/4wQ/i+eefz9nmgAMOiEsuuaRNPwj5Ao7m3GIycuTIGD58eLOP6aWXXorLLrvMRQQAAJQNt6hkoxrtyNq1a+Ob3/xm3tebnnTSSXHjjTdGly5d2uQ4892istlmm2Xqb8cdd8z7Nplc5syZE8ccc0ysXLnSRQQAAJQNt6hkoxrtzDvvvBNjxoyJdevW5Ww3cuTImDp1aps8kyPfDI5+/foV/EHdaqutYurUqbHxxhs361gWLlwYRx55ZN5QCAAAoLXlm8FRUVGhSOsRcLRDzzzzTJxzzjl579fae++949e//nVsscUWrXp8+QKOTp06Rb9+/fL207dv35g6dWqzj7+mpiaOPvrovDNKAAAA2oJncGSjGu3U5MmT49xzz83bbuedd46HH344dthhh1Y7tpqamli+fHnONvluU+nevXvceeedMXjw4GYdw4oVK+KEE06IV1991cUCAACUJc/gyEY12rFf/vKXBYUcAwYMiN/85jcxZsyYqKqqapVja8mDRgcMGBBTpkyJoUOHNmvfc+bMia985Svxpz/9yUUCAACULc/gyEY12rlJkyYVFHL06tUrLrjggpgxY0bsv//+JT+ufAFHUzM4Dj300Jg+fXp8+tOfbtZ+Z8yYEQceeGC8/vrrLg4AAKCsmcGRjWp0AJMmTYrzzjuvoLaDBg2KSZMmxa9+9avYZZddSnZM8+fPz7n+ozM4evfuHTfccEPccMMNzX4w6k033RTHHnts3ttjAAAAyoGAIxvV6CBuv/32OP/88wtuv88++8S0adPiJz/5SebXthYiywyOz3/+8/Hkk0/GoYce2qx91dTUxPjx42PixIl5p3gBAACUCwFHNp2VoOO47bbboqKiIi666KKC2nfq1CmOPvro+PrXvx5PPfVU/O53v4snnngiFi1a1OJjyRdwDB48OE477bQ46qijYvvtt2/2fh544IG48MILi3LMAAAArUnAkY2Ao4O59dZb4/3334+LLrooevXqVdA2Xbt2jf322y/222+/qK+vj+effz6mTZsW06ZNi9dee61Zx/Huu+/mXL///vu36Fkg//znP+Pss8+OmTNnGnQAACBJAo5sBBwd0D333BNPPfVUXHHFFfGlL30p07YVFRUxdOjQGDp0aJxzzjkxZ86cePzxx+Oll16KOXPmxNy5c/POlqisrIyuXbuW5NxWr14d1157bVx//fWxZs0agw0AACRLwJGNgKODWrBgQRx//PHxta99Lb73ve9FdXV1s/oZNGhQnHLKKRssW7lyZSxYsCBWrVoVq1evjtra2qitrY2qqqqorq6Orbbaquivo62trY2pU6fGjTfeGG+99ZYBBgAAkpcv4KioqFCk9Qg4Orj7778/HnzwwRg5cmSMGzcuhgwZ0uI+e/ToEdttt12rHH9NTU1MmjQpbr311liyZIkBBQAA2g0zOLIRcBB1dXXxwAMPxAMPPBCf//zn49RTT43hw4dH587le3ksXLgwbrnllrjzzjtjxYoVBhEAAGh3BBzZCDjYwB/+8If4wx/+EP369YsDDzwwRo4cGZ/5zGfKIuxYsWJFTJ8+PR599NF49NFHPWMDAABo1+rq6nKuF3BsSMBBo957772YPHlyTJ48+b9hx7777hvDhg2LAQMGtNpxLFq0KH73u9/FY489FjNnzoy1a9caHAAAoEMwgyMbAQd5rR92RERsscUWMWzYsBg6dGgMGzYshgwZEt26dSv6fi+++OL4xS9+EfX19QYBAADocPL9FhJwbEjAQWbvvPNOPPzww/Hwww//d1m/fv1iyy23jAEDBsSWW2753//cs2fPqKura/T/dtxxxxg2bFiT+6mtrRVuAAAAJdPUW0iKsTzrG04aa58vwBBw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AAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAewHYlw7VcO6u1QAAAABJRU5ErkJgglRDTVAAAAACAAADMFRQRTIAAAASAAADQW5hciBTb2Z0d2FyZSBMTEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+MYxAAIa2IMCACNax9X////////yEJ/V0ACEIyMhCEZTkZ0+5O7LJ88LsHC9jof+v/t/////m9ZUXPM5zoxUO7kVVIcPMLk/+MYxBkIs2YkCACNasYgJMCyKdDVhy4f/6rr/dq/2/////9Nf6vVHdjFKKVSsZxLlOEspJ5spV3g3Rqm6h+3/Yn+jvv31Sis/+MYxDEJU14gCACNTbovf6f//TqsjrdFOxChUR5qsFMld3kDguZF5yJxwqof//7//v///b937f78l2bIZqq2dGS3Qx7mbWcY/+MYxEYKU2IcCACNTXb03HJB7boPk1lbWt7Ofl/+Z1////+1tzRbCMAU1YCPZLAI6B6QEbBsMRoXsb/sybvZelHZlVztof0+/+MYxFcIo2IkCABNZ9///6Nm6b2otZgYgczwEZ2p2LSzE8rNIgaREYoB/5/l+X31+v+X////L6BPh5zAzIvSIyK0RoqaaYWD/+MYxG8JO2IcCABNTWjJCNJ06gO8v//X///////+3/+Vm+u8a5NskpCto+I56a50cyF6hrgHrgfP/0Tv+jehmbfu6+qSqzMy/+MYxIUKm2IYAACNTf007df/p//9r9kUkWQDUmHDKRT0tjhYfEEUfKKLKgGp9NVfKm2tdNe//1r////9aMz3ViOoM8450Lhx/+MYxJUJE2okEABTTIfFk4wF5autKThAMqQflQBbv1mxs2Xb+synaSnLpek2JsN1aS5OzPCAUMaFjBAq+Cr/TrR9syzb+zOz/+MYxKsJe1ooEABNSWjlUZHQMhiqUOyVIoOyod7Rpy2e5ezG5d/7fLd/rdnK99U9hSnvYVOOpZKSky5AycYkjlERorFZpz6q/+MYxMALC2YYAACNMARJ5/l/1tbPN/l/////q+n6tvMg1GVzjrCqTdRaMComMIGR08aF3TPkwwCxKgHWCZm16gO/+cjZXL39/+MYxM4K224cEACTTBvP6Efy////hCMbYrxjGdooKYmWPlHkNMEKEVFZEJ+B05oeC6rI+NYKUQkUAAVJ//+lz8gzIB9Tljss/+MYxN0IS2pgGAGTokIlM/50vGPZv9K8TKVKUJKstKE6PDZsLMqLtSFLxAyJZISgAghBaFkexwBZ+/36z9ra9i7pReoA6ZZS/+MYxPYRI2IIAACTEWYFmMXs6W6/Uk8McGNWTEFNRTMuOTguMqqqqqqqqqqqqqqqqqqqqqr1R/23KVXmSmS3dwbdCmaHtMJr/+MYxOwMk2IoGABTSXdXapSMpZTuc5Aw6au+ddmtX8jXLN+23KnY15r4xkU0XjjCBcVSiPM2LPyIYLAcwhEaIRSSxFUD/9dx/+MYxPQNQ2IcEABTSfnX5c/n/f///+Hj9rbpjbvzVpVRhOsPMpObUYe+kbi64rIDCBR4dErKdJUH/ov18JSOWv0Us4ucJ/k//+MYxPoOA2IgGABTSf13S90jlDau7RIS5tTYuisOSfSIECkm5jgqQgcwhKhiAaRqHKA4WTH/2/dirvfsyNelnI0+ZXDOhJ2Y/+MYxP0Hw2JcGAAMv0mZSEScqeiUd6vZUd63dfp+nvtttmevPexF0OU+ObqNXtJF6GzGXzYpo2RJb45u+XQgZsx6K///usIH/+MYxP8SS2YIAACTEEToCx1n//yP///v9799VbUJeql4pw429VgnNkiNFJlslPoiYUHJtNHSXIX/97No7ITqzd1OY2ZGTeyg/+MYxPALo2IgEABTSNgiMRgSOyKQxUYxbIh2mmYiHOr9PnZf3/xjKdqOY9yduI7g1BiCOiqPcFRNrCA0QilQEDoVBeZQ1KsD/+MYxPwNs2YcEABTSEX+tZP4KKcrLVn8//////87Z/dlugZoWuhCj1IB5NvNBhxKZ2LXY1AXiSIIRGIXy/79JyXRUPZqkYyH/+MYxP8R624MAACZEMyg1hXOx6MMCqzs6/S7r2f1WmS5Vl3KvD3mJxUYky04oj5XFVDzQVktSKYRKhW5GSVSzxOjqv/L/v5n/+MYxPIMO2IoEABTSaORi0aUwmzP0RDU0uKYaAzPXc0ROf////b//xeT3yFasgVF/VqCZxLB2BASWwhYVYeisiTFPfln+H/m/+MYxPwSg2IIAACTEcr6P5e9f//3p4/13SqHrSA4p4LNgAjRYTBIIhWundYhZIWiWsSRZWoTUNnV9lkZUe575EZ1RTUkTMiM/+MYxO0Lq2IgEABNSc6ShpSK6Kf5nVJe3v/pG0pelJM3OKOVypAihMwyTI0tOJxKntMISAjRrrcHBYnKJFxIQbUbj//9/LO4/+MYxPkQo2oMCACTLLuulzbiIs+X/n/wj8h2PWX3xb9Yo9ldUSygeQNFowRSZQiKSA2yYUR4PRt6m/vX8JlFxCmyKdGB+Zsn/+MYxPEN82YQAABNEFZLLvTxuF1V+pbW7T20iQ8koqgFCZ5KSZGOUuycUONtmUqTYWcm+kzvX2/9mRGlL0VkOpsxCHIdy2dG/+MYxPQL02IkGABNSTERVmXYIQmRX2KVlZHV1s03TWjtXjDXZ7jvlTRRJpG//WWyYgjJWDYoqPFBMtjgsIUIICQ0hCUHvH/7/+MYxP8Rm2oMCACTLP7935FXnl////+X89/GL22sZapNljUSFE5X20iHGNlUC2XS4s6B5vFqF/r2WSunLOU7rY72leh2GfRV/+MYxPMMM14kEABTSTvVjXQjqxiHroermO1n0tf//c8hDbYZ3xfFBMy3OcFXnWWkcjD2Vl1kbZG4PJ6EB1DE2aGWrhcMv8vz/+MYxP0OA2ocEABTSIucBhaZMpyNak47////X035kZMsXM0WpgfZPPHxBhM5Ml43jEGEmILMQdamN//eZF/M7zJzOCM3lkog/+MYxP8Sc2IIAACTEXMiYC8mFmKIzYRmNDmyJ2XT5ePz7t35S8FYlsSjXmTQniBcjV8EFtUgbPkM0BYPqkZhSdVyV/2CU/qI/+MYxPALG2IgEABTSGIyAa4fPpOqP///zL/9ozHRbDah+3IoJFmIZqIAZadplRNoZGMeJMC6BynF9fr1/e/9Uvr9FK87KHrl/+MYxP4R82oMCACTENvbZ1+rq5dyesLxgq2KKTaixiizRYieOIROo7HxJFmVzhxNeKGc6YpuVsRf6TwGZtBfqBkhmZjGifFb/+MYxPEMQ2YcEABNSEKT+Xz779da9mcwqH7HDQfLQHaWTK0AgvCx9nJYekVVGjAcWArJiDUbasRbf7NW8c0plV6o61NpSxGb/+MYxPsQi2oQCABTEHu7JZm3ak70avcshLJee3jdia0koI15kKaysTMSVZssoRJj5IhOmyC0RtmlBj/95dY7yOzs1ymZHVti/+MYxPMMQ2I0GABNSWCABWx70I1AuSpO5rkvRWUrjJ+bs6drbzqY1NWyVm1SJVNNEOIZCRhjZokDPUQuPqipN8V+/2b2+6T9/+MYxP0N22IkGACTSSykYc9FzqRV0S/dt//eX+Mjcf4zflHwtNu02tFixT5rQTIqowqx4cdBWgD/t1TvYtKyMiIKKzkVFNPW/+MYxP8OG1osGABNSfMKcwqRGIZXY9XWd0SYTMzlPRzTU7///N8OnXxlimpJwtFkWJvfPUhTElMFllElgDdEqhIUBNEfb7n8/+MYxP8Ps2IYEACTSV/9JZ2juWM8u8CUn6+/79+38M2/XLb/ZuIlRp5HgBkrK5pgIheqKxPbSmuy+9pbkFHWKR8gDuBGxiPO/+MYxPsQs2oQEABTEN50rF/67/M+R31q6LUgfJVEC1piYKQQLtAUNTGEWNMHBlitCDExBTYCf/UpcUmecR0FFR/mAYpGMExA/+MYxPMMe14gCACNS5JujnEgB6Mj5HzmXL89wjCUcYvcxEXwiM3s5ylRLptIRhFQUxOFWGAiRkBIPhpATFy55Lb6/3/100VH/+MYxPwR+14IAACTEZzTNvMWh2scTLK5VKhGQ1TaO1zURSEPJ3/a7Ub96jDH6EZh4qdhUccMOS4UixnG6ZOKVBADgZk3NuoW/+MYxO8LG1IoEABNST8s/PnFbpkQ7LelB8kfW5b/y/e7M3NxJ83eUdjYPpd9WJKaybmbb940m9FrLbr/9PalKzKlNzndT2JZ/+MYxP0Nc2YgEABNSJaEepB3rKy3Sr1MWpURUfkZGlrT01b/b96v9miGSZ26k3WhEoHDQSwaHNkmYsgaFpipAaEODcSrB0XV/+MYxP8Rs2oQEABTELppPumv/r6//Wz5m3rMztHhcFUXBukcLICQKkkSyRSKdVNo4StCEypvv5T+9dwEBKsBOeW6chNHun85/+MYxPMQE2IMAAFTFX/L/KrdlPJr+DEIoEDMSRzjrMCz/GRpp0CIqwHrMOQRKv1MQU1Fqqr//Pnn/6c6peTlOO8rJY5Wv7W9/+MYxO0Lo2IcEABNSUVyzPHrcLItWPJzjmUNHKf+eX+t//zzv5bMmV5a1bFK501X6vyImXIyPRcpKyILli6YBuD5tFUbPf3z/+MYxPkQc2IMAACNEbqR0Xlu7pF5nfns3P+j2tnj3/WVuF0fsGwoDJ21qJKOjTnPb6zfIgifEqr7nb086Z1Oj3V2yzEdleWW/+MYxPILE2YsGACNZFSVakYh7Hn1R8Ehr0RG0qvrzN3W/r3LLknlZHai6NKtuaFbbL9TnNlA8ekfQGDyaEIEJEsQ5LUXvCUy/+MYxP8NQ2okEABTSK9qSshSwCV0mTQymSoBniZzmKyM9f/l2/e33WnSy8i/J9PpKCkmMi2FkClQ2lQTQCXlEFSFqiuPcRmr/+MYxP8SS2YIAADTEDyTiOWRV7//xf/McTjtqg6oPOQl2NMBoEZaUQH9IKCmUZFu5YoUYNWqf3uecP8i/4+iAGHimDZggiCg/+MYxPALi2IgEABNSUsEucZiQz3JCUjhl35f88vnqqzIWvZ9Srimia1gqiJSUgRBU5NHIpMhUmv1mjq80RjFVWuLQeZVMhXp/+MYxPwRm2IIAACTEdDMzRMm4UY3g0MIiRYt/vv88/bLX1bQjHIaHtSQKEU4LBOgufRvVWTQqgcihNSqKUeX+P/dkANzmZ5H/+MYxPAOS2IUCABNLSMR2ZED+v//uKfKkstutsbVdylKosQkBa9Rj7K0lkcWle8kkI3ESQpYhRf9f2tmTtYhrOcrIUNZFrZC/+MYxPELU2IkEABRZSlkUjHMl0Qh3KZVZ2Kvq1kpM82u1m75ZtR+odzxXXUmzsEzltrI2VsYTnWubegOtidCnFU4D4viF/1L/+MYxP4RC2IcEADTSOXZoSoJvXVLyRTLy2u1HynL//n+d0qeml8SPTZ8Nd5PNKcxYzoEDEY/alKPJmheZyVDkf6z06L8++lN/+MYxPQNm2IgEABRSZ5EjQ2Q2+spLP+5cmGHKTlGa7C1TgGl4Cpgy2gK1KIpJ707DPaPbXcT6bRA6inEXvykvwkNgFYZm2Ts/+MYxPgNe2IkGABTSXQ+Z1M2Zl5fX/yl5pk52zDT3IuWGbL1HY1x9qwaYT7IH+om+Hnlp/HMb7cSWT/8Py/76///v/Uv61tk/+MYxP0SK2oMCACTELzduxpqqdiZiRog9zWdJolUTCVoToGtMQU1FMy45OC4yVVVVVVVVVU3/f5HzMYKrylIkRHyMZxcgo+R/+MYxO8Mu2IUCABNLZopGo2ABAM4F2ZGjy5/Plzdfr+ErKJ7M9B6zaOWKpa4mJTZuooMiQEtGD63EUeyTcRT84TnLfdRIpDM/+MYxPcN22IgGABTSWRI2OQzyrBzrRf+dd+170JisvW2X12TIM68ck646Cnp7cjB9IGA6eX/6d1ob1pIiGU+6paaRqGdyM5z/+MYxPoOO2YkGABZSFGMUq3O9w7TMNqrFS/2+hGlT8u/OVVtfLUR3dQgsqoktOHVstUyYNk5LZAiMlw2KwHBMsy3qlJHy/y3/+MYxPwJs2ZcGABNZvhkAYsTR1owmWTmv5Z///3+Y3/1k56O9VDp1IneQ63dvfDnkko1RiCT1XJJpDzNDt6XT0pmGwnSNR1M/+MYxP8Qe2oQCABTECkfR3LpOdP6TxO/l/TLzyyd5tS31kO1NXHtmGJN4sSmCMUkrHMIWXGVkaZtESCLrIg6dxVrbUV43WdF/+MYxPgM62osGABNSG4TDEcYYBPDjMAjaa/+f+/W08+iWkj16mmPHWOJMKMJCUXUqyVFBiIHosUccRSFScM9PnYUPqe47b0A/+MYxP8SG24IAACTEDRlP0N4Uj/PrO+qh2ikhiYfIqT1FjbEHFqHuIATi8amsXLJJRUBghy7Tlfn/nMsrTv2PZzKTeHPpTiP/+MYxPELi2Y0GABNSAG1qU2pX+///1925/tuvaikaU81iFyOfXMkHLSNNGHbkE0AYePASzJM2mhGqq+z/pWU7yUiKn9uZRN//+MYxP0RE2ooGADTSPyHqcmsIjMz6dMmqf/OJJZcPeSj8neVaUIuInKzZtAUaXJQ1RdW76jTJE53EoPLzdUaf/9eiS31lDko/+MYxPMNY2IgEABRSEakRJgfq5piOwGv8yN7fn/VVGNVOpRlGScpmDlSFZw4baiHx8lRNPUlJmb5HeRFdSoGH+qd8z9Ndmez/+MYxPgNQ2YkGABRSBrvQ6K9uixzJSj//1b7HKhK6ghjLik9CL0KjKeqSSZHzDRbxsTtEaL4gURHF4JZFzfRz1nrSRWd0sqI/+MYxP4Pi2IoGADTSTFlNkJJBGBnCHViM6lDNs75EZndq/p9NhcqvM+T1uOxQyUvGidw26AEw4UOEQj7ThOjI5GWCZQwDb46/+MYxPoPm2ogEADTSP96/GakZMpJHyLzzVBKCeNGwablOe1//dfP/O/uZUMn8+e12cvLeogoik1hFAhUULasbBw+m6o/5fTn/+MYxPYOm2IYEABTLEmaHoyJANBGewKRERhB/yJDU0bvOl38vv//+/drU2eOYZWKObUTkDO5g6ocUmB8HBiUJGANFNZ0/m/L/+MYxPYOO2YUEACTSEIno76M008xGbOTD7f63//v/vbjsa+blRqj8VNjDzZTmmetldekWE7kE0RAhgGtMJIWP/t+m/5m+r1p/+MYxPgRq2IICACTLUvP2ODUjGGqxBl3mslGZWR9r0ZtWp8j/9oc1pmynQQUdmHZiA90UOaaFqRlKS5b94BSYoHDFbUbedIy/+MYxOwNk2oUAABTLH+uc/rW2b/GrKPB/k+v9v+7Zi8uy290iDI2TzYiGMCFzklWTUSlpquJJC1fmmvLlWwuSMjzdEjITZkq/+MYxPAOK2IQAABNLTidDEI2N32odQfvntSnK72LqjacGUrYRnGS7ZGkKKlKXMKOcdXggNhfSddKJcVbC6TEsy7YL7I3DM0T/+MYxPINq2YUCABTLAVEIEYBMTELZOuWPnHcmnz70L5/eiuUsRohpHIqPdDRg+NNYutKcCahlUWPfAdiQcXqb3clkXityZEz/+MYxPYQG2oUEACNEBjubD7JyDQcKDCW43yDpZ/76vyyGJ1c0V5rlnXJbHoeJoPiwzTUhiSrLESZtNcfbnM77Zt/2Mn9dXNb/+MYxPALs2IgEABNSdRoyEWlIrBIeZJpZCzb+9bz/+/W+NPU+apnxWZO9W10ZBC1JLeZJJn6fZvCD0hqf7g9I3gNkBDYCAIB/+MYxPwO62YcEABTSIJFWgmGmhyOf//P/Md9a/TdF6/lizfkmkkwi9Zl3E9lm0EFrEJhy0zvKurZkNbm6SlulDoVnMzTCCMf/+MYxPsQE2ocGABZSHRGVtCkYzuedujM6U7+0I58yXncN1C3ukiz0sepZslSbxZqIkMbpJ+Ro13iR7YlRXVaCG0akjPldWKx/+MYxPUN+2IgEABTSUzszyOyUbY6HXJDOyMazl2pu/XZKzZRz79dBnJTUc1V3OAisNMWuYKrNIaT1Ri76bBLCdVNxd+uu21f/+MYxPgOe2IgEADNSVzG8azX79n1f//6/+G1y4dn37LHkC7mOOoo0iTgmG0pw4klYaKKFIGK+v7+VvYhDXaqspXgmMrSKqVY/+MYxPkNA2YgEABNSBDIiqhJUBIyslXYaiqxzqlt637//v26/+5GVfd9w15PZEvaJpTrKiMjET0KSMkBsSaYUQBRBlX/g90R/+MYxP8Q22oMAACTLCBlNDIj7Mp57NyBMakmYVFqp9f9f+3VRU+j2t1NIiM9HECJjijROmHhXImEIwKNUD5Vf/rVeZWdKWMR/+MYxPYPU14YEACTSTdM11vY/aMJplbZmnejN9X/p7vuuUyOZCswsNEju1BxQFRxzSRD2TkhWsyRGiMTQIGFGl+/vunrDKgP/+MYxPML214sGACRSe1SERTsjUMhGN1O5VpPvX0bfP3qG8Mxv+4eY3404zRFYASQXKTUxEUOPE8uUSyKWnLpPLyms+w4jkwr/+MYxP4SC2oIAACTEMnFGmYpGZbl6vkf+Qqc98Xm4K52UeUMOTexbQeIbRiAToV6koy1BDJCvFGZFB5KFW+/xT91hSI5meCE/+MYxPANU2YQAABRLIpmnaBeM62B+H+/++/6+atl3Ws+coXE0q2ZVCyJN0IemDiR5ks5UWTLO1UpxFJ6Xd/wjg5yIzkRFo41/+MYxPUOo2YQAAFTMOcxXyHu/9qvuZ5KPl/GbbU3TlEumeXfBt86VnjU0jshdEs3qJJRMQVvvWbnCuW//6nCK1W2g4ymUMs7/+MYxPUOO2oYEACNSImkc8rafnC9rnCz98vOpqXGa6k2bHUKr6ZtEuSqKQtE0wRqVIjR0SCsfDx9SYEECl9/xGfh6ucVzOXg/+MYxPcOm2owGABTSCxmiIzn5HHc5TR1fuq+18knS2r1FtjbNJJszeh4m0x2TsINPgrNEktOKNstxbb1Tv7N3JSUjIZ1EsHZ/+MYxPcNU2okEABTSBkSujqnWmtUX6aePu7teqtekUByzhRIqg5AOQCtLI9sRLRMOEo0SPw0pKYXVdqWyL6GMQjOhIMpyKC1/+MYxPwNc2IkGABTSXDqM52RHU8iy7Mtyzd+9G6aW9qeSipUIbk9aWQLNpMYiibPZJIWNymsxhYiBiDBsoYKCiAIR66AZlxP/+MYxP8Qm2YcEADTSASgAE0mAJYTY2ApRxs6DAC68Xv/+tVUp3/H+9ixP1DMqH8JS5xKCDEKEb5BzCKGGyUUQTfVEEa9CGIJ/+MYxPcNg2YgEABTSGYVW5n////6tOefuxb3RkMjwAS3gwFWM7opwPlXIaJiCmopmXHJwXLz+U1WnMEWV3Kx8NaVSFdcZzWh/+MYxPwOw2IkGACNSScW+0LLcOqH3SVLp1HpNNH/1z3ffFbT1LVKzciZo0cQlc8oPExUaQaIZQnYg0UB49weA4RQgBRJiIon/+MYxPwRQ1oMCACTLf9ekqlzWiNW+/6Ja7zPJETuim////P2/7602/qaaImmw87LCj6T0qcomFAQ0mHIrjX/675d/U+WU5+7/+MYxPIOi2YQAABTLBJL3c7IZDknRCOyuewxhzEtXV+e9Daf1/+f+d+7rrbeNxcg2XXyoxCq2sIiBS5OJOgg5CiJhWji/9P2/+MYxPIJK2ZUGABHZu2nRjPMvaZAnM9XMz2RZJZWOioZkpbm9L/av33sSjOpQkKyCgNxEPV4VihCA52rsHmMim2iE9JprwZ//+MYxP8TI2YIAABRBPv2vn/2rcvw+jB///H/bf3epo9v6fRJpLSJ+aywXXeRLLNFpWQAhEkYAinF/5e6kOFzIErNaLEG0znO/+MYxO0Ma2IYCABNLWMnz9LX8tv5kvdQU7WTtuBVjIwFSbJeR9Co2qsoGl6EFynajKGSYgopxs1te7VVG2ulAGw6e6NoyNMz/+MYxPYQe2oMAACTEN1drq2i2p5a6+7VRVUybl1FChYqITiUlCAyhF4Dw8g/XFKjBAXkRMxkNnMbnf6L90fZfR2TrUroSqs0/+MYxO8O+2IQAACTFeU5bkRqkSIKVd3dTmazsjkoplu78v26Muh5DVzqKmGsJiJTiUBmB5VDq2kCjc0KNgNB5oqIkIpRDFuW/+MYxO4LA2IcEABNSXze0ejzQhkP+8H0cGUiRLl/PlqNeSc76UG7S2mPKKa6IpCK0Cqhm3lcxWWkdrnkepCCWMIbvlo6/54h/+MYxP0Nq2YkGABTSA4lRgEyytxj5MhI0WRkVl5vfCM49dWVUxJt9cp4mEVGyzgwRHSjLSFlGXmiFlmdjyNdueorf//7TYSv/+MYxP8P62YgGACTSJdHaXR/+f/OX////M7XEl/UDiaIGbB1WwtSl0hllGbtQZO3QlLExBoXaV6sWrpyTMtmYorNOpFBndlR/+MYxPoRw2YMAAFTFaiNZpuU6p9UcnanfSf9lOXU+7mvUtlWC6KhpgsjVEsVR4mLipo4ex5kiQWmFGnDa5Zy9RNv8y+Vk3UY/+MYxO4Na2ogEABTSCEFvX0wA3////7fcxelwYsnBJG7OJpkkwMJPg8nZzpl8o76WLJiSWKk+ylFzcXt8dqmJZxlP5wGb5tR/+MYxPMOk2IcEABTSRHX//yrIXbPQUsgwpFNbCPkSR88qwISZDHhZE7sqyXc2iciIyUlPJSVF//b86NrOit0OVMwZJMsqo9X/+MYxPMLI2okEABNSKtIyUdRJAJ7IUqtd92VdKW6f/91WFy8IXO15KtRQbyqlpRRqFTJMgqRVsjLnERAouZNhYltGnDj7/y4/+MYxP8RW2YMCACTLaq6q5HCYZnOMEZ/ty7Rzxrs/93HTpe4xekkSwNFNiBMDVQSdeJjE0+iyJ4WQkAVG2XI++l6amZAe9J8/+MYxPQMg2YcEABNSIphIBjwBQ6dzHn6Lxl5ep0nOK0IKLuRnTRxG2uw0gKspiFdA2u3InVVQidldkmRtxUGc9/f9ojyU/LN/+MYxP0OU2ogGABTSIsilIgColRPMmIHXolrtTPGcaj6vfnUg1qJO0pLDuB+LLujYYOLtyUZHFSFlEgDAiuRZWtz/MH6NtBO/+MYxP4Rs2oMCACTEJnRUK5sgCmiIMpl+f//3/1df41yVpenFk7IBUDSkzJBBXazjP7OKMI25w07Ff/1Qt6p/kur2odnRFq7/+MYxPINE14cEABNSYIzXW101KV2V5qSMXpM72us1/a7I3/+zn1byGbtaYpFFGcqRRdqSqS7LmhjDYUUSZSFa44Kk3xVGk/y/+MYxPgPI2oYEABTSP/8Dt/vrHIxy+f9//+W0v/eOXDej16uUGAkmSpGTjs1DtIgmCIGAzFh2xul2RAD+qx0TBkc97lmEBEQ/+MYxPYPI14UEABTLcHi/91Io3UMn5+XWYjacKRm2k0Vo58TrmxxFjSSLHCgTFrRNigVEZ9PVW++TP1TQu/vz3dXS6Hf81hy/+MYxPQNE2okEABNSLSv09lr6aJzJPIRRA26CYQYTGgYFAMcOvaXbZiyRc7R9cXWdaYgpqoyST4U+Hkp0uZYNi3tME+lzrO5/+MYxPoRU2oMAACTENIrcttGh3caKS59m5eWnwuuZeoRnWQWmlSkPO43PGx1KhKFmiRHwlrBilVCjLa+NkQ04u3JG3z8/MuR/+MYxO8LQ1ogEABNSXbmHPA3Qpwuu+YFr/oP/Pf62mrg1J2uWswigs1JdGJ5JC04zRlZs1FhBBgPxF9Wa4tT99V603ZjM4ys/+MYxP0Ok2ocEABTSE7OTV6bFTdOl7f9PGG7H+OVU3SnHE71lggZlKnkI5FBJY8iPxKiUohIYLFWX3UpRev/8U5BaGhkJ7KP/+MYxP0NS2okEAFTTJEYLINly//r+tb+9I4x9JlL1EnR5jvKfIkRI5CIQfD7gVBMHJ0IZRUJbj+v/J1+rVf1lVFXcrD3QwRK/+MYxP8R+2YMCADTLZnunbRKytn//jOsWzf8753ayJJpdCoaPE6NkjhpYqQr2REliY4nAjpYmSI28QduYr0V6OXuamVpH3KZ/+MYxPINO2IcEABTSJONtUs3P+ApagtCoy3VZTpU+9nlkMRO1ElggRH0Y0trTCOCnZkdRKIFtbty6///qUrf+1ymjv6//3/x/+MYxPgOW2YgEACTSF895e7z75bS3INjKLHucMNG7DGn0uix6JJM3W0xBTUUzLjk4LjJVVX0/17FXBJZNEJQxXVyS3UIOx0I/+MYxPkNE2IkGABNSVOQ7HM+7DuUt3Q7mjpUFmcjr1unl8NuVbD7m6plQSJtQIuLMFbkdTOVo4XNGpkZmZshRj5KVGyRR6oW/+MYxP8P82okOACTLDX0hZ/NMwIyV2MZOyleP56///LM+7JePftrs1g+k+jJlnog5CvNvjmcS3cDTZkDKhtl8r35yOV+jgtR/+MYxPoOQ2YYEABTSKmIjcsiPb5ZfXf7UH8zFxqUaDwmSPCizYFGwQGwyZIIX0pOLKIpjETlo1U/56E0qoAczJRAWM5G8HJA/+MYxPwK8148GABNSUZyKUXZ6Ik9o/PNrPO4Xd3k45s5ZbFOhlkKfJ2SMjFyc9KZLMjQ60Ps1iyQiQycScX711gnjk89MiiI/+MYxP8TC2oIAACTEM0f+Z/SNfy///f9lc5XLIHLMz46Yck2h2K0dtqT0bECVySOS9qTEGr9rfbPd2TQq7VMzuRDg3vYJJEn/+MYxO0ME2YcEABNSJ2RxzMIKcrhC0U0F3kImjyb03for+r/zq1OmMvJ/7vbWJlSA5zVyGFyjBs22U4ODIPh4hDbrVUbv/ln/+MYxPcNW2YcEABNSGWrMglL8cicpXM60b///+8h4bKpxqdMwhMvkpTs/hZPkDJUtJu2TccDTSJKRRGOl+v/1//9Omu/2pdE/+MYxPwPu2oQCABTLHWi9r07yp99tVRSsxysZJwFXKcDYBwxzjoPraIHIgUpiCmopmXHJwp268/L++7oMjOERqsPR/WT59fe/+MYxPgMU1ooGABTSLv/8+5at2WSQuEzX00HAFGyipKM5p5VFojkAmjknWmIKaimZccnBdUObf4ovk//MMX///X/yt/uOXlx/+MYxP8SW2IIAACTEKktqFqTxCJSJF/JNmSImOhln2AosFn0lTEFNRTMuOTguMlVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPAMw2IgEABTSVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPgK215IGACNTFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8MW2I4GABNSFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8Ks1oUGABTZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8AAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEFHMTAgU2Vjb25kcyBvZiBTaWxlbmNlAAAAAAAAAAAAQW5hciBTb2Z0d2FyZSBMTEMAAAAAAAAAAAAAAAAAQmxhbmsgQXVkaW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8=";
1032
+
1033
+ const getIsIOS = () => {
1034
+ if (typeof window !== "undefined") {
1035
+ return (/iPad|iPhone|iPod/.test(navigator?.userAgent) &&
1036
+ !window?.MSStream);
1037
+ }
1038
+ else {
1039
+ return false;
1040
+ }
1041
+ };
1042
+ const isIOS = getIsIOS();
1043
+ class BaseWallet {
1044
+ algosdk;
1045
+ algodClient;
1046
+ keepWCAlive;
1047
+ constructor(algosdk, algodClient) {
1048
+ this.algosdk = algosdk;
1049
+ this.algodClient = algodClient;
1050
+ this.keepWCAlive = new Audio();
1051
+ }
1052
+ async healthCheck() {
1053
+ return await this.algodClient.healthCheck().do();
1054
+ }
1055
+ async getAccountInfo(address) {
1056
+ const accountInfo = await this.algodClient.accountInformation(address).do();
1057
+ if (!accountInfo) {
1058
+ throw new Error("Unable to get account information");
1059
+ }
1060
+ return accountInfo;
1061
+ }
1062
+ async getAssets(address) {
1063
+ const accountInfo = await this.algodClient.accountInformation(address).do();
1064
+ if (!accountInfo || accountInfo.assets === undefined) {
1065
+ throw new Error("Unable to get account assets");
1066
+ }
1067
+ return accountInfo.assets;
1068
+ }
1069
+ async waitForConfirmation(txId, timeout = 4) {
1070
+ const confirmation = (await this.algosdk.waitForConfirmation(this.algodClient, txId, timeout));
1071
+ return { txId, ...confirmation };
1072
+ }
1073
+ decodeTransaction = (txn, isSigned) => {
1074
+ return isSigned
1075
+ ? this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))).txn
1076
+ : this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
1077
+ };
1078
+ logEncodedTransaction(txn, isSigned) {
1079
+ const txnObj = this.decodeTransaction(txn, isSigned);
1080
+ console.log("TRANSACTION", {
1081
+ isSigned,
1082
+ from: txnObj.from && this.algosdk.encodeAddress(txnObj.from.publicKey),
1083
+ to: txnObj.to && this.algosdk.encodeAddress(txnObj.to.publicKey),
1084
+ type: txnObj.type,
1085
+ txn: txnObj,
1086
+ });
1087
+ }
1088
+ groupTransactionsBySender(transactions) {
1089
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1090
+ function groupBy(objectArray, property) {
1091
+ return objectArray.reduce(function (acc, obj) {
1092
+ const key = obj[property];
1093
+ if (!acc[key]) {
1094
+ acc[key] = [];
1095
+ }
1096
+ acc[key].push(obj);
1097
+ return acc;
1098
+ }, {});
1099
+ }
1100
+ const decodedGroup = transactions.reduce((acc, [type, txn], index) => {
1101
+ if (type === "u") {
1102
+ const decodedTxn = this.decodeTransaction(txn, false);
1103
+ const from = decodedTxn.from
1104
+ ? this.algosdk.encodeAddress(decodedTxn.from.publicKey)
1105
+ : "";
1106
+ const to = decodedTxn.to
1107
+ ? this.algosdk.encodeAddress(decodedTxn.to.publicKey)
1108
+ : "";
1109
+ const type = decodedTxn.type || "";
1110
+ const amount = Number(decodedTxn.amount) || 0; // convert from bigint to number
1111
+ const txnObj = {
1112
+ groupIndex: index,
1113
+ amount,
1114
+ from,
1115
+ to,
1116
+ type,
1117
+ txn,
1118
+ };
1119
+ acc.push(txnObj);
1120
+ }
1121
+ return acc;
1122
+ }, []);
1123
+ return groupBy(decodedGroup, "from");
1124
+ }
1125
+ async sendRawTransactions(transactions, waitRoundsToConfirm) {
1126
+ const sentTransaction = await this.algodClient
1127
+ .sendRawTransaction(transactions)
1128
+ .do();
1129
+ if (!sentTransaction) {
1130
+ throw new Error("Transaction failed.");
1131
+ }
1132
+ const decodedTxn = this.algosdk.decodeSignedTransaction(transactions[0]);
1133
+ const waitRounds = waitRoundsToConfirm ||
1134
+ decodedTxn.txn.lastRound - decodedTxn.txn.firstRound;
1135
+ const confirmedTransaction = await this.waitForConfirmation(sentTransaction.txId, waitRounds);
1136
+ return {
1137
+ id: sentTransaction.txId,
1138
+ ...confirmedTransaction,
1139
+ };
1140
+ }
1141
+ keepWCAliveStart() {
1142
+ // Playing an audio file prevents Wallet Connect's
1143
+ // web socket connection from being dropped when
1144
+ // iOS goes into background mode
1145
+ if (!isIOS) {
1146
+ return;
1147
+ }
1148
+ this.keepWCAlive.src = audio;
1149
+ this.keepWCAlive.autoplay = true;
1150
+ this.keepWCAlive.volume = 0;
1151
+ this.keepWCAlive.loop = true;
1152
+ this.keepWCAlive.play();
1153
+ }
1154
+ keepWCAliveStop() {
1155
+ if (!isIOS) {
1156
+ return;
1157
+ }
1158
+ this.keepWCAlive.pause();
1159
+ }
1160
+ }
1161
+
1162
+ /**
1163
+ * Helpful resources:
1164
+ * https://github.com/perawallet/connect
1165
+ */
1166
+ class PeraWalletClient extends BaseWallet {
1167
+ #client;
1168
+ id;
1169
+ provider;
1170
+ constructor({ client, id, provider, algosdk, algodClient }) {
1171
+ super(algosdk, algodClient);
1172
+ this.#client = client;
1173
+ this.id = id;
1174
+ this.provider = provider;
1175
+ }
1176
+ static async init() {
1177
+ const { algosdk, algodClient } = await Algod.init();
1178
+ const PeraWalletConnect = (await import('@perawallet/connect'))
1179
+ .PeraWalletConnect;
1180
+ const peraWallet = new PeraWalletConnect({ shouldShowSignTxnToast: false });
1181
+ return new PeraWalletClient({
1182
+ id: PROVIDER_ID.PERA_WALLET,
1183
+ client: peraWallet,
1184
+ provider: providers[PROVIDER_ID.PERA_WALLET],
1185
+ algosdk: algosdk,
1186
+ algodClient: algodClient,
1187
+ });
1188
+ }
1189
+ async connect(onDisconnect) {
1190
+ this.keepWCAliveStart();
1191
+ const accounts = await this.#client.connect();
1192
+ this.keepWCAliveStop();
1193
+ this.#client.connector?.on("disconnect", onDisconnect);
1194
+ if (accounts.length === 0) {
1195
+ throw new Error(`No accounts found for ${this.provider}`);
1196
+ }
1197
+ const mappedAccounts = accounts.map((address, index) => ({
1198
+ name: `Pera Wallet ${index + 1}`,
1199
+ address,
1200
+ providerId: this.provider.id,
1201
+ }));
1202
+ return {
1203
+ ...this.provider,
1204
+ accounts: mappedAccounts,
1205
+ };
1206
+ }
1207
+ async reconnect(onDisconnect) {
1208
+ const accounts = await this.#client.reconnectSession();
1209
+ this.#client.connector?.on("disconnect", onDisconnect);
1210
+ if (!accounts) {
1211
+ return null;
1212
+ }
1213
+ return {
1214
+ ...this.provider,
1215
+ accounts: accounts.map((address, index) => ({
1216
+ name: `Pera Wallet ${index + 1}`,
1217
+ address,
1218
+ providerId: this.provider.id,
1219
+ })),
1220
+ };
1221
+ }
1222
+ async disconnect() {
1223
+ await this.#client.disconnect();
1224
+ }
1225
+ formatTransactionsArray(transactions) {
1226
+ const formattedTransactions = [];
1227
+ for (const [type, txn] of transactions) {
1228
+ if (type === "s") {
1229
+ formattedTransactions.push({
1230
+ ...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1231
+ signers: [],
1232
+ });
1233
+ }
1234
+ else {
1235
+ formattedTransactions.push({
1236
+ txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1237
+ });
1238
+ }
1239
+ }
1240
+ return formattedTransactions;
1241
+ }
1242
+ async signTransactions(connectedAccounts, transactions) {
1243
+ // Decode the transactions to access their properties.
1244
+ const decodedTxns = transactions.map((txn) => {
1245
+ return this.algosdk.decodeObj(txn);
1246
+ });
1247
+ // Marshal the transactions,
1248
+ // and add the signers property if they shouldn't be signed.
1249
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1250
+ if (!("txn" in txn) &&
1251
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1252
+ acc.push({
1253
+ txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
1254
+ });
1255
+ }
1256
+ else {
1257
+ acc.push({
1258
+ txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
1259
+ signers: [],
1260
+ });
1261
+ }
1262
+ return acc;
1263
+ }, []);
1264
+ // Play an audio file to keep Wallet Connect's web socket open on iOS
1265
+ // when the user goes into background mode.
1266
+ this.keepWCAliveStart();
1267
+ // Sign them with the client.
1268
+ const result = await this.#client.signTransaction([txnsToSign]);
1269
+ this.keepWCAliveStop();
1270
+ // Join the newly signed transactions with the original group of transactions.
1271
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1272
+ if (!("txn" in txn)) {
1273
+ const signedByUser = result.shift();
1274
+ signedByUser && acc.push(signedByUser);
1275
+ }
1276
+ else {
1277
+ acc.push(transactions[i]);
1278
+ }
1279
+ return acc;
1280
+ }, []);
1281
+ return signedTxns;
1282
+ }
1283
+ async signEncodedTransactions(transactions) {
1284
+ const transactionsToSign = this.formatTransactionsArray(transactions);
1285
+ this.keepWCAliveStart();
1286
+ const result = (await this.#client.signTransaction([
1287
+ transactionsToSign,
1288
+ ]));
1289
+ this.keepWCAliveStop();
1290
+ const signedTransactions = [];
1291
+ let resultIndex = 0;
1292
+ for (const [type, txn] of transactions) {
1293
+ if (type === "u") {
1294
+ signedTransactions.push(result[resultIndex]);
1295
+ resultIndex++;
1296
+ }
1297
+ else {
1298
+ signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1299
+ }
1300
+ }
1301
+ return signedTransactions;
1302
+ }
1303
+ }
1304
+
1305
+ /**
1306
+ * Helpful resources:
1307
+ * https://github.com/randlabs/myalgo-connect
1308
+ */
1309
+ class MyAlgoWalletClient extends BaseWallet {
1310
+ #client;
1311
+ id;
1312
+ provider;
1313
+ constructor({ client, id, provider, algosdk, algodClient }) {
1314
+ super(algosdk, algodClient);
1315
+ this.#client = client;
1316
+ this.id = id;
1317
+ this.provider = provider;
1318
+ }
1319
+ static async init() {
1320
+ const { algosdk, algodClient } = await Algod.init();
1321
+ const MyAlgoConnect = (await import('@randlabs/myalgo-connect')).default;
1322
+ const myAlgo = new MyAlgoConnect({ disableLedgerNano: false });
1323
+ return new MyAlgoWalletClient({
1324
+ id: PROVIDER_ID.MYALGO_WALLET,
1325
+ client: myAlgo,
1326
+ provider: providers[PROVIDER_ID.MYALGO_WALLET],
1327
+ algosdk: algosdk,
1328
+ algodClient: algodClient,
1329
+ });
1330
+ }
1331
+ async connect() {
1332
+ const accounts = await this.#client.connect();
1333
+ if (accounts.length === 0) {
1334
+ throw new Error(`No accounts found for ${this.provider}`);
1335
+ }
1336
+ const mappedAccounts = accounts.map((account) => ({
1337
+ ...account,
1338
+ providerId: this.provider.id,
1339
+ }));
1340
+ return {
1341
+ ...this.provider,
1342
+ accounts: mappedAccounts,
1343
+ };
1344
+ }
1345
+ async reconnect() {
1346
+ return null;
1347
+ }
1348
+ async disconnect() {
1349
+ return;
1350
+ }
1351
+ async signTransactions(connectedAccounts, transactions) {
1352
+ // Decode the transactions to access their properties.
1353
+ const decodedTxns = transactions.map((txn) => {
1354
+ return this.algosdk.decodeObj(txn);
1355
+ });
1356
+ // Get the unsigned transactions.
1357
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1358
+ // If the transaction isn't already signed and is to be sent from a connected account,
1359
+ // add it to the arrays of transactions to be signed.
1360
+ if (!("txn" in txn) &&
1361
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1362
+ acc.push(transactions[i]);
1363
+ }
1364
+ return acc;
1365
+ }, []);
1366
+ // Sign them with the client.
1367
+ const result = await this.#client.signTransaction(txnsToSign);
1368
+ // Join the newly signed transactions with the original group of transactions.
1369
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1370
+ if (!("txn" in txn)) {
1371
+ const signedByUser = result.shift()?.blob;
1372
+ signedByUser && acc.push(signedByUser);
1373
+ }
1374
+ else {
1375
+ acc.push(transactions[i]);
1376
+ }
1377
+ return acc;
1378
+ }, []);
1379
+ return signedTxns;
1380
+ }
1381
+ async signEncodedTransactions(transactions) {
1382
+ const transactionsToSign = [];
1383
+ const signedRawTransactions = [];
1384
+ for (const [type, txn] of transactions) {
1385
+ if (type === "u") {
1386
+ transactionsToSign.push(txn);
1387
+ }
1388
+ }
1389
+ const result = await this.#client.signTransaction(transactionsToSign);
1390
+ if (!result) {
1391
+ throw new Error("Signing failed.");
1392
+ }
1393
+ let resultIndex = 0;
1394
+ for (const [type, txn] of transactions) {
1395
+ if (type === "u") {
1396
+ signedRawTransactions.push(result[resultIndex].blob);
1397
+ resultIndex++;
1398
+ }
1399
+ else {
1400
+ signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1401
+ }
1402
+ }
1403
+ return signedRawTransactions;
1404
+ }
1405
+ }
1406
+
1407
+ class AlgoSignerClient extends BaseWallet {
1408
+ #client;
1409
+ id;
1410
+ provider;
1411
+ constructor({ client, id, provider, algosdk, algodClient }) {
1412
+ super(algosdk, algodClient);
1413
+ this.#client = client;
1414
+ this.id = id;
1415
+ this.provider = provider;
1416
+ }
1417
+ static async init() {
1418
+ if (typeof window == "undefined" ||
1419
+ window.AlgoSigner === undefined) {
1420
+ throw new Error("AlgoSigner is not available.");
1421
+ }
1422
+ const { algosdk, algodClient } = await Algod.init();
1423
+ const algoSigner = window.AlgoSigner;
1424
+ return new AlgoSignerClient({
1425
+ id: PROVIDER_ID.ALGO_SIGNER,
1426
+ client: algoSigner,
1427
+ provider: providers[PROVIDER_ID.ALGO_SIGNER],
1428
+ algosdk: algosdk,
1429
+ algodClient: algodClient,
1430
+ });
1431
+ }
1432
+ async connect() {
1433
+ await this.#client.connect();
1434
+ let ledger = "MainNet";
1435
+ if (NODE_NETWORK === "mainnet") {
1436
+ ledger = "MainNet";
1437
+ }
1438
+ else if (NODE_NETWORK === "betanet") {
1439
+ ledger = "BetaNet";
1440
+ }
1441
+ else if (NODE_NETWORK === "testnet") {
1442
+ ledger = "TestNet";
1443
+ }
1444
+ else if (!!NODE_NETWORK) {
1445
+ ledger = NODE_NETWORK;
1446
+ }
1447
+ const accounts = await this.#client.accounts({
1448
+ ledger,
1449
+ });
1450
+ if (accounts.length === 0) {
1451
+ throw new Error(`No accounts found for ${this.provider}`);
1452
+ }
1453
+ const mappedAccounts = accounts.map(({ address }, index) => ({
1454
+ name: `AlgoSigner ${index + 1}`,
1455
+ address,
1456
+ providerId: this.provider.id,
1457
+ }));
1458
+ return {
1459
+ ...this.provider,
1460
+ accounts: mappedAccounts,
1461
+ };
1462
+ }
1463
+ async reconnect(onDisconnect) {
1464
+ if (window === undefined ||
1465
+ window.AlgoSigner === undefined) {
1466
+ onDisconnect();
1467
+ }
1468
+ return null;
1469
+ }
1470
+ async disconnect() {
1471
+ return;
1472
+ }
1473
+ formatTransactionsArray(transactions) {
1474
+ const formattedTransactions = transactions.map(([type, txn]) => {
1475
+ const formattedTxn = {
1476
+ txn: txn[1],
1477
+ };
1478
+ if (type === "s") {
1479
+ formattedTxn.signers = [];
1480
+ const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
1481
+ formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
1482
+ }
1483
+ else {
1484
+ const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
1485
+ formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
1486
+ }
1487
+ return formattedTxn;
1488
+ });
1489
+ return formattedTransactions;
1490
+ }
1491
+ async signTransactions(connectedAccounts, transactions) {
1492
+ // Decode the transactions to access their properties.
1493
+ const decodedTxns = transactions.map((txn) => {
1494
+ return this.algosdk.decodeObj(txn);
1495
+ });
1496
+ // Marshal the transactions,
1497
+ // and add the signers property if they shouldn't be signed.
1498
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1499
+ const txnObj = {
1500
+ txn: this.#client.encoding.msgpackToBase64(transactions[i]),
1501
+ };
1502
+ if ("txn" in txn ||
1503
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1504
+ txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
1505
+ txnObj.signers = [];
1506
+ }
1507
+ acc.push(txnObj);
1508
+ return acc;
1509
+ }, []);
1510
+ // Sign them with the client.
1511
+ const result = await this.#client.signTxn(txnsToSign);
1512
+ // Join the newly signed transactions with the original group of transactions.
1513
+ const signedTxns = result.reduce((acc, txn, i) => {
1514
+ if (txn) {
1515
+ acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
1516
+ }
1517
+ else {
1518
+ acc.push(transactions[i]);
1519
+ }
1520
+ return acc;
1521
+ }, []);
1522
+ return signedTxns;
1523
+ }
1524
+ async signEncodedTransactions(transactions) {
1525
+ const transactionsToSign = this.formatTransactionsArray(transactions);
1526
+ const result = await this.#client.signTxn(transactionsToSign);
1527
+ if (!result) {
1528
+ throw new Error("Signing failed.");
1529
+ }
1530
+ const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
1531
+ if (txn) {
1532
+ signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
1533
+ }
1534
+ if (txn === null) {
1535
+ signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
1536
+ }
1537
+ return signedTxns;
1538
+ }, []);
1539
+ return signedRawTransactions;
1540
+ }
1541
+ }
1542
+
1543
+ class DeflyWalletClient extends BaseWallet {
1544
+ #client;
1545
+ id;
1546
+ provider;
1547
+ constructor({ client, id, provider, algosdk, algodClient }) {
1548
+ super(algosdk, algodClient);
1549
+ this.#client = client;
1550
+ this.id = id;
1551
+ this.provider = provider;
1552
+ }
1553
+ static async init() {
1554
+ const { algosdk, algodClient } = await Algod.init();
1555
+ const DeflyWalletConnect = (await import('@blockshake/defly-connect'))
1556
+ .DeflyWalletConnect;
1557
+ const deflyWallet = new DeflyWalletConnect({
1558
+ shouldShowSignTxnToast: false,
1559
+ });
1560
+ return new DeflyWalletClient({
1561
+ id: PROVIDER_ID.DEFLY,
1562
+ client: deflyWallet,
1563
+ provider: providers[PROVIDER_ID.DEFLY],
1564
+ algosdk,
1565
+ algodClient,
1566
+ });
1567
+ }
1568
+ async connect(onDisconnect) {
1569
+ const accounts = await this.#client.connect();
1570
+ this.#client.connector?.on("disconnect", onDisconnect);
1571
+ if (accounts.length === 0) {
1572
+ throw new Error(`No accounts found for ${this.provider}`);
1573
+ }
1574
+ const mappedAccounts = accounts.map((address, index) => ({
1575
+ name: `Defly Wallet ${index + 1}`,
1576
+ address,
1577
+ providerId: this.provider.id,
1578
+ }));
1579
+ return {
1580
+ ...this.provider,
1581
+ accounts: mappedAccounts,
1582
+ };
1583
+ }
1584
+ async reconnect(onDisconnect) {
1585
+ const accounts = await this.#client.reconnectSession();
1586
+ this.#client.connector?.on("disconnect", onDisconnect);
1587
+ if (!accounts) {
1588
+ return null;
1589
+ }
1590
+ return {
1591
+ ...this.provider,
1592
+ accounts: accounts.map((address, index) => ({
1593
+ name: `Defly Wallet ${index + 1}`,
1594
+ address,
1595
+ providerId: this.provider.id,
1596
+ })),
1597
+ };
1598
+ }
1599
+ async disconnect() {
1600
+ await this.#client.disconnect();
1601
+ }
1602
+ formatTransactionsArray(transactions) {
1603
+ const formattedTransactions = [];
1604
+ for (const [type, txn] of transactions) {
1605
+ if (type === "s") {
1606
+ formattedTransactions.push({
1607
+ ...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1608
+ signers: [],
1609
+ });
1610
+ }
1611
+ else {
1612
+ formattedTransactions.push({
1613
+ txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1614
+ });
1615
+ }
1616
+ }
1617
+ return formattedTransactions;
1618
+ }
1619
+ async signTransactions(connectedAccounts, transactions) {
1620
+ // Decode the transactions to access their properties.
1621
+ const decodedTxns = transactions.map((txn) => {
1622
+ return this.algosdk.decodeObj(txn);
1623
+ });
1624
+ // Marshal the transactions,
1625
+ // and add the signers property if they shouldn't be signed.
1626
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1627
+ if (!("txn" in txn) &&
1628
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1629
+ acc.push({
1630
+ txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
1631
+ });
1632
+ }
1633
+ else {
1634
+ acc.push({
1635
+ txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
1636
+ signers: [],
1637
+ });
1638
+ }
1639
+ return acc;
1640
+ }, []);
1641
+ // Sign them with the client.
1642
+ const result = await this.#client.signTransaction([txnsToSign]);
1643
+ // Join the newly signed transactions with the original group of transactions.
1644
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1645
+ if (!("txn" in txn)) {
1646
+ const signedByUser = result.shift();
1647
+ signedByUser && acc.push(signedByUser);
1648
+ }
1649
+ else {
1650
+ acc.push(transactions[i]);
1651
+ }
1652
+ return acc;
1653
+ }, []);
1654
+ return signedTxns;
1655
+ }
1656
+ async signEncodedTransactions(transactions) {
1657
+ const transactionsToSign = this.formatTransactionsArray(transactions);
1658
+ const result = await this.#client.signTransaction([
1659
+ transactionsToSign,
1660
+ ]);
1661
+ const signedTransactions = [];
1662
+ let resultIndex = 0;
1663
+ for (const [type, txn] of transactions) {
1664
+ if (type === "u") {
1665
+ signedTransactions.push(result[resultIndex]);
1666
+ resultIndex++;
1667
+ }
1668
+ else {
1669
+ signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1670
+ }
1671
+ }
1672
+ return signedTransactions;
1673
+ }
1674
+ }
1675
+
1676
+ class ExodusClient extends BaseWallet {
1677
+ #client;
1678
+ id;
1679
+ provider;
1680
+ constructor({ client, id, provider, algosdk, algodClient }) {
1681
+ super(algosdk, algodClient);
1682
+ this.#client = client;
1683
+ this.id = id;
1684
+ this.provider = provider;
1685
+ }
1686
+ static async init() {
1687
+ if (typeof window == "undefined" ||
1688
+ window.exodus === undefined) {
1689
+ throw new Error("Exodus is not available.");
1690
+ }
1691
+ const { algosdk, algodClient } = await Algod.init();
1692
+ const exodus = window.exodus.algorand;
1693
+ return new ExodusClient({
1694
+ id: PROVIDER_ID.EXODUS,
1695
+ client: exodus,
1696
+ provider: providers[PROVIDER_ID.EXODUS],
1697
+ algosdk: algosdk,
1698
+ algodClient: algodClient,
1699
+ });
1700
+ }
1701
+ async connect() {
1702
+ const { address } = await this.#client.connect();
1703
+ if (!address) {
1704
+ throw new Error(`No accounts found for ${this.provider}`);
1705
+ }
1706
+ const accounts = [
1707
+ {
1708
+ name: `Exodus 1`,
1709
+ address,
1710
+ providerId: this.provider.id,
1711
+ },
1712
+ ];
1713
+ return {
1714
+ ...this.provider,
1715
+ accounts,
1716
+ };
1717
+ }
1718
+ async reconnect(onDisconnect) {
1719
+ if (window === undefined ||
1720
+ window.exodus === undefined ||
1721
+ window.exodus.algorand.isConnected !== true) {
1722
+ onDisconnect();
1723
+ }
1724
+ return null;
1725
+ }
1726
+ async disconnect() {
1727
+ return;
1728
+ }
1729
+ async signTransactions(connectedAccounts, transactions) {
1730
+ // Decode the transactions to access their properties.
1731
+ const decodedTxns = transactions.map((txn) => {
1732
+ return this.algosdk.decodeObj(txn);
1733
+ });
1734
+ // Get the unsigned transactions.
1735
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1736
+ // If the transaction isn't already signed and is to be sent from a connected account,
1737
+ // add it to the arrays of transactions to be signed.
1738
+ if (!("txn" in txn) &&
1739
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1740
+ acc.push(transactions[i]);
1741
+ }
1742
+ return acc;
1743
+ }, []);
1744
+ // Sign them with the client.
1745
+ const result = await this.#client.signTransaction(txnsToSign);
1746
+ // Join the newly signed transactions with the original group of transactions.
1747
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1748
+ if (!("txn" in txn)) {
1749
+ const signedByUser = result.shift();
1750
+ signedByUser && acc.push(signedByUser);
1751
+ }
1752
+ else {
1753
+ acc.push(transactions[i]);
1754
+ }
1755
+ return acc;
1756
+ }, []);
1757
+ return signedTxns;
1758
+ }
1759
+ async signEncodedTransactions(transactions) {
1760
+ const transactionsToSign = [];
1761
+ const signedRawTransactions = [];
1762
+ for (const [type, txn] of transactions) {
1763
+ if (type === "u") {
1764
+ const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
1765
+ transactionsToSign.push(decoded.toByte());
1766
+ }
1767
+ }
1768
+ const result = await this.#client.signTransaction(transactionsToSign);
1769
+ if (!result) {
1770
+ throw new Error("Signing failed.");
1771
+ }
1772
+ let resultIndex = 0;
1773
+ for (const [type, txn] of transactions) {
1774
+ if (type === "u") {
1775
+ signedRawTransactions.push(result[resultIndex]);
1776
+ resultIndex++;
1777
+ }
1778
+ else {
1779
+ signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1780
+ }
1781
+ }
1782
+ return signedRawTransactions;
1783
+ }
1784
+ }
1785
+
1786
+ const DefaultKMDConfig = {
1787
+ host: KMD_HOST,
1788
+ token: KMD_TOKEN,
1789
+ port: KMD_PORT,
1790
+ };
1791
+ class KMDWallet extends BaseWallet {
1792
+ #client;
1793
+ walletId;
1794
+ id;
1795
+ provider;
1796
+ constructor({ client, id, provider, algosdk, algodClient }) {
1797
+ super(algosdk, algodClient);
1798
+ this.#client = client;
1799
+ this.id = id;
1800
+ this.provider = provider;
1801
+ this.walletId = "";
1802
+ }
1803
+ static async init() {
1804
+ // TODO: allow diff config options?
1805
+ const kmdConfig = DefaultKMDConfig;
1806
+ const { algosdk, algodClient } = await Algod.init();
1807
+ const kmdClient = new algosdk.Kmd(kmdConfig.token, kmdConfig.host, kmdConfig.port);
1808
+ return new KMDWallet({
1809
+ id: PROVIDER_ID.KMD_WALLET,
1810
+ client: kmdClient,
1811
+ provider: providers[PROVIDER_ID.KMD_WALLET],
1812
+ algosdk: algosdk,
1813
+ algodClient: algodClient,
1814
+ });
1815
+ }
1816
+ async connect() {
1817
+ // TODO: prompt for wallet and password?
1818
+ return {
1819
+ ...this.provider,
1820
+ accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
1821
+ };
1822
+ }
1823
+ async disconnect() {
1824
+ return;
1825
+ }
1826
+ async reconnect() {
1827
+ return {
1828
+ ...this.provider,
1829
+ accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
1830
+ };
1831
+ }
1832
+ async requestPassword() {
1833
+ // TODO: store it locally?
1834
+ const pw = prompt("gib password");
1835
+ return pw ? pw : "";
1836
+ }
1837
+ async getWalletToken(walletId, password) {
1838
+ const handleResp = await this.#client.initWalletHandle(walletId, password);
1839
+ return handleResp.wallet_handle_token;
1840
+ }
1841
+ async releaseToken(token) {
1842
+ await this.#client.releaseWalletHandle(token);
1843
+ }
1844
+ async listWallets() {
1845
+ const walletResponse = await this.#client.listWallets();
1846
+ const walletList = walletResponse["wallets"];
1847
+ const walletMap = {};
1848
+ for (const w of walletList) {
1849
+ walletMap[w.name] = w.id;
1850
+ }
1851
+ return walletMap;
1852
+ }
1853
+ async listAccounts(wallet, password) {
1854
+ const walletMap = await this.listWallets();
1855
+ if (!(wallet in walletMap))
1856
+ throw Error("No wallet named: " + wallet);
1857
+ this.walletId = walletMap[wallet];
1858
+ // Get a handle token
1859
+ const token = await this.getWalletToken(this.walletId, password);
1860
+ // Fetch accounts and format them as lib expects
1861
+ const listResponse = await this.#client.listKeys(token);
1862
+ const addresses = listResponse["addresses"];
1863
+ const mappedAccounts = addresses.map((address, index) => {
1864
+ return {
1865
+ name: `KMDWallet ${index + 1}`,
1866
+ address,
1867
+ providerId: this.provider.id,
1868
+ };
1869
+ });
1870
+ // Release handle token
1871
+ this.releaseToken(token);
1872
+ return mappedAccounts;
1873
+ }
1874
+ async signTransactions(connectedAccounts, transactions) {
1875
+ // Decode the transactions to access their properties.
1876
+ const decodedTxns = transactions.map((txn) => {
1877
+ return this.algosdk.decodeObj(txn);
1878
+ });
1879
+ // Get a handle token
1880
+ const pw = await this.requestPassword();
1881
+ const token = await this.getWalletToken(this.walletId, pw);
1882
+ const signedTxns = [];
1883
+ // Sign them with the client.
1884
+ const signingPromises = [];
1885
+ for (const idx in decodedTxns) {
1886
+ const dtxn = decodedTxns[idx];
1887
+ // push the incoming txn into signed, we'll overwrite it later
1888
+ signedTxns.push(transactions[idx]);
1889
+ // Its already signed, skip it
1890
+ if (!("snd" in dtxn))
1891
+ continue;
1892
+ // Not to be signed by our signer, skip it
1893
+ if (!connectedAccounts.includes(this.algosdk.encodeAddress(dtxn.snd)))
1894
+ continue;
1895
+ // overwrite with an empty blob
1896
+ signedTxns[idx] = new Uint8Array();
1897
+ const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
1898
+ signingPromises.push(this.#client.signTransaction(token, pw, txn));
1899
+ }
1900
+ const signingResults = await Promise.all(signingPromises);
1901
+ // Restore the newly signed txns in the correct order
1902
+ let signedIdx = 0;
1903
+ for (const idx in signedTxns) {
1904
+ // If its an empty array, infer that it is one of the
1905
+ // ones we wanted to have signed and overwrite the empty buff
1906
+ if (signedTxns[idx].length === 0) {
1907
+ signedTxns[idx] = signingResults[signedIdx];
1908
+ signedIdx += 1;
1909
+ }
1910
+ }
1911
+ return signedTxns;
1912
+ }
1913
+ signEncodedTransactions(transactions) {
1914
+ throw new Error("Method not implemented.");
1915
+ }
1916
+ }
1917
+
1918
+ class WalletConnectClient extends BaseWallet {
1919
+ #client;
1920
+ id;
1921
+ provider;
1922
+ constructor({ client, id, provider, algosdk, algodClient }) {
1923
+ super(algosdk, algodClient);
1924
+ this.#client = client;
1925
+ this.id = id;
1926
+ this.provider = provider;
1927
+ }
1928
+ static async init() {
1929
+ const { algosdk, algodClient } = await Algod.init();
1930
+ const WalletConnect = (await import('@walletconnect/client')).default;
1931
+ const QRCodeModal = (await import('algorand-walletconnect-qrcode-modal'))
1932
+ .default;
1933
+ const walletConnect = new WalletConnect({
1934
+ bridge: "https://bridge.walletconnect.org",
1935
+ qrcodeModal: QRCodeModal,
1936
+ });
1937
+ const initWallet = {
1938
+ id: PROVIDER_ID.WALLET_CONNECT,
1939
+ client: walletConnect,
1940
+ provider: providers[PROVIDER_ID.WALLET_CONNECT],
1941
+ algosdk: algosdk,
1942
+ algodClient: algodClient,
1943
+ };
1944
+ return new WalletConnectClient(initWallet);
1945
+ }
1946
+ async connect() {
1947
+ let chainId = 416001;
1948
+ if (NODE_NETWORK === "betanet") {
1949
+ chainId = 416003;
1950
+ }
1951
+ else if (NODE_NETWORK === "testnet") {
1952
+ chainId = 416002;
1953
+ }
1954
+ if (!this.#client.connected) {
1955
+ await this.#client.createSession({ chainId });
1956
+ }
1957
+ return new Promise((resolve, reject) => {
1958
+ this.#client.on("connect", (error, payload) => {
1959
+ if (error) {
1960
+ reject(error);
1961
+ }
1962
+ const { accounts } = payload.params[0];
1963
+ resolve({
1964
+ ...this.provider,
1965
+ accounts: accounts.map((address, index) => ({
1966
+ name: `Wallet Connect ${index + 1}`,
1967
+ address,
1968
+ providerId: this.provider.id,
1969
+ })),
1970
+ });
1971
+ });
1972
+ this.#client.on("session_update", (error, payload) => {
1973
+ if (error) {
1974
+ reject(error);
1975
+ }
1976
+ const { accounts } = payload.params[0];
1977
+ resolve({
1978
+ ...this.provider,
1979
+ accounts: accounts.map((address, index) => ({
1980
+ name: `Wallet Connect ${index + 1}`,
1981
+ address,
1982
+ providerId: this.provider.id,
1983
+ })),
1984
+ });
1985
+ });
1986
+ });
1987
+ }
1988
+ async reconnect() {
1989
+ this.#client = (await WalletConnectClient.init()).#client;
1990
+ const accounts = this.#client.accounts;
1991
+ if (!accounts) {
1992
+ return null;
1993
+ }
1994
+ return {
1995
+ ...this.provider,
1996
+ accounts: accounts.map((address, index) => ({
1997
+ name: `Wallet Connect ${index + 1}`,
1998
+ address,
1999
+ providerId: this.provider.id,
2000
+ })),
2001
+ };
2002
+ }
2003
+ check() {
2004
+ return this.#client.connected;
2005
+ }
2006
+ async disconnect() {
2007
+ try {
2008
+ await this.#client.killSession();
2009
+ }
2010
+ catch (e) {
2011
+ console.error("Error disconnecting", e);
2012
+ }
2013
+ }
2014
+ formatTransactionsArray(transactions) {
2015
+ const formattedTransactions = transactions.map((txn) => {
2016
+ const formattedTxn = {
2017
+ txn: txn[1],
2018
+ };
2019
+ if (txn[0] === "s") {
2020
+ const decodedTxn = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn[1], "base64")));
2021
+ formattedTxn.txn = Buffer.from(this.algosdk.encodeUnsignedTransaction(decodedTxn.txn)).toString("base64");
2022
+ formattedTxn.signers = [];
2023
+ }
2024
+ return formattedTxn;
2025
+ });
2026
+ return formattedTransactions;
2027
+ }
2028
+ async signTransactions(connectedAccounts, transactions) {
2029
+ // Decode the transactions to access their properties.
2030
+ const decodedTxns = transactions.map((txn) => {
2031
+ return this.algosdk.decodeObj(txn);
2032
+ });
2033
+ // Marshal the transactions,
2034
+ // and add the signers property if they shouldn't be signed.
2035
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
2036
+ if (!("txn" in txn) &&
2037
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
2038
+ acc.push({
2039
+ txn: Buffer.from(transactions[i]).toString("base64"),
2040
+ });
2041
+ }
2042
+ else {
2043
+ acc.push({
2044
+ txn: Buffer.from(transactions[i]).toString("base64"),
2045
+ signers: [],
2046
+ });
2047
+ }
2048
+ return acc;
2049
+ }, []);
2050
+ const requestParams = [txnsToSign];
2051
+ const request = formatJsonRpcRequest("algo_signTxn", requestParams);
2052
+ // Play an audio file to keep Wallet Connect's web socket open on iOS
2053
+ // when the user goes into background mode.
2054
+ this.keepWCAliveStart();
2055
+ // Sign them with the client.
2056
+ const result = await this.#client.sendCustomRequest(request);
2057
+ this.keepWCAliveStop();
2058
+ // Join the newly signed transactions with the original group of transactions.
2059
+ const signedTxns = result.reduce((signedTxns, txn, i) => {
2060
+ if (txn) {
2061
+ signedTxns.push(new Uint8Array(Buffer.from(txn, "base64")));
2062
+ }
2063
+ if (txn === null) {
2064
+ signedTxns.push(transactions[i]);
2065
+ }
2066
+ return signedTxns;
2067
+ }, []);
2068
+ return signedTxns;
2069
+ }
2070
+ async signEncodedTransactions(transactions) {
2071
+ const transactionsToSign = this.formatTransactionsArray(transactions);
2072
+ const requestParams = [transactionsToSign];
2073
+ const request = formatJsonRpcRequest("algo_signTxn", requestParams);
2074
+ this.keepWCAliveStart();
2075
+ const result = await this.#client.sendCustomRequest(request);
2076
+ this.keepWCAliveStop();
2077
+ const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
2078
+ if (txn) {
2079
+ signedTxns.push(new Uint8Array(Buffer.from(txn, "base64")));
2080
+ }
2081
+ if (txn === null) {
2082
+ signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
2083
+ }
2084
+ return signedTxns;
2085
+ }, []);
2086
+ return signedRawTransactions;
2087
+ }
2088
+ }
2089
+
2090
+ const clients = {
2091
+ [PROVIDER_ID.KMD_WALLET]: KMDWallet.init().catch((e) => {
2092
+ if (typeof window !== "undefined") {
2093
+ console.info("error initializing client", e);
2094
+ return;
2095
+ }
2096
+ }),
2097
+ [PROVIDER_ID.PERA_WALLET]: PeraWalletClient.init().catch((e) => {
2098
+ if (typeof window !== "undefined") {
2099
+ console.info("error initializing client", e);
2100
+ return;
2101
+ }
2102
+ }),
2103
+ [PROVIDER_ID.MYALGO_WALLET]: MyAlgoWalletClient.init().catch((e) => {
2104
+ if (typeof window !== "undefined") {
2105
+ console.info("error initializing client", e);
2106
+ return;
2107
+ }
2108
+ }),
2109
+ [PROVIDER_ID.ALGO_SIGNER]: AlgoSignerClient.init().catch((e) => {
2110
+ if (typeof window !== "undefined") {
2111
+ console.info("error initializing client", e);
2112
+ return;
2113
+ }
2114
+ }),
2115
+ [PROVIDER_ID.DEFLY]: DeflyWalletClient.init().catch((e) => {
2116
+ if (typeof window !== "undefined") {
2117
+ console.info("error initializing client", e);
2118
+ return;
2119
+ }
2120
+ }),
2121
+ [PROVIDER_ID.EXODUS]: ExodusClient.init().catch((e) => {
2122
+ if (typeof window !== "undefined") {
2123
+ console.info("error initializing client", e);
2124
+ return;
2125
+ }
2126
+ }),
2127
+ [PROVIDER_ID.WALLET_CONNECT]: WalletConnectClient.init().catch((e) => {
2128
+ if (typeof window !== "undefined") {
2129
+ console.info("error initializing client", e);
2130
+ return;
2131
+ }
2132
+ }),
2133
+ };
2134
+
2135
+ const getWalletClient = async (id) => {
2136
+ if (!id) {
2137
+ throw new Error("No wallet provider id provided");
2138
+ }
2139
+ const client = await clients[id];
2140
+ if (!client) {
2141
+ throw new Error(`No wallet client found for provider id: ${id}`);
2142
+ }
2143
+ return client;
2144
+ };
501
2145
 
502
2146
  function useWallet() {
503
2147
  const allAccounts = useWalletStore((state) => state.accounts);
@@ -508,12 +2152,12 @@ function useWallet() {
508
2152
  if (!walletClient || !activeAccount?.address) {
509
2153
  throw new Error("No wallet found.");
510
2154
  }
511
- const signedTransactions = await walletClient.signTransactions(activeAccount.address, transactions);
2155
+ const signedTransactions = await walletClient.signTransactions(accounts.map((acct) => acct.address), transactions);
512
2156
  return signedTransactions;
513
2157
  };
514
- const sendTransactions = async (transactions) => {
2158
+ const sendTransactions = async (transactions, waitRoundsToConfirm) => {
515
2159
  const walletClient = await getWalletClient(activeAccount?.providerId);
516
- const result = await walletClient?.sendRawTransactions(transactions);
2160
+ const result = await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
517
2161
  return result;
518
2162
  };
519
2163
  const signer = async (txnGroup, indexesToSign) => {
@@ -546,9 +2190,9 @@ function useWallet() {
546
2190
  const walletClient = await getWalletClient(activeAccount?.providerId);
547
2191
  return await walletClient?.signEncodedTransactions(transactions);
548
2192
  };
549
- const sendRawTransactions = async (transactions) => {
2193
+ const sendRawTransactions = async (transactions, waitRoundsToConfirm) => {
550
2194
  const walletClient = await getWalletClient(activeAccount?.providerId);
551
- return await walletClient?.sendRawTransactions(transactions);
2195
+ return await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
552
2196
  };
553
2197
  return {
554
2198
  accounts,
@@ -703,5 +2347,4 @@ function useConnectWallet(options) {
703
2347
  };
704
2348
  }
705
2349
 
706
- export { useConnectWallet, useWallet };
707
- //# sourceMappingURL=index.js.map
2350
+ export { KMD_HOST, KMD_PASSWORD, KMD_PORT, KMD_TOKEN, KMD_WALLET$1 as KMD_WALLET, NODE_NETWORK, NODE_PORT, NODE_SERVER, NODE_TOKEN, PROVIDER_ID, getWalletClient, useConnectWallet, useWallet };