tx · J2DMxezfqgViwjspp1h55dBuFpyFabwac4nMEjM7wxNR

3N11gzZic4yASFhatzjC8zvLnpNhDo2B1Rv:  -0.01000000 Waves

2023.10.06 13:34 [2786644] smart account 3N11gzZic4yASFhatzjC8zvLnpNhDo2B1Rv > SELF 0.00000000 Waves

{ "type": 13, "id": "J2DMxezfqgViwjspp1h55dBuFpyFabwac4nMEjM7wxNR", "fee": 1000000, "feeAssetId": null, "timestamp": 1696588469206, "version": 2, "chainId": 84, "sender": "3N11gzZic4yASFhatzjC8zvLnpNhDo2B1Rv", "senderPublicKey": "EnUXxxhBK8wUfh1FveDYv9G5HBMXop6YwZWzVrBrLo2i", "proofs": [ "G6xq6NvoCAJ3ZuatvxvJVnQZwFH7DSD56Nj1Gfxw3X3Pfe7VJdVgeUkBepwQh6vSQcdbvQYKgbY4GQESQNx2hwo" ], "script": "base64:BgIiCAISAwoBCBIICgYBAQgIGBgSBAoCCAgSBAoCCAESAwoBCAoADGFkbWluQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAgVhZG1pbgIAAA13eFN3YXBBZGRyZXNzAiMzUDY4ek5pdWZzdTF2aVpwdTFhWTNjZGFoUlJLY3ZWNU45MwELd3JpdGVTdHJpbmcCA2tleQtzdHJpbmdWYWx1ZQkBC1N0cmluZ0VudHJ5AgUDa2V5BQtzdHJpbmdWYWx1ZQEMd3JpdGVJbnRlZ2VyAgNrZXkMaW50ZWdlclZhbHVlCQEMSW50ZWdlckVudHJ5AgUDa2V5BQxpbnRlZ2VyVmFsdWUBB2lzQWRtaW4BDWNhbGxlckFkZHJlc3MDCQAAAgUNY2FsbGVyQWRkcmVzcwkA2QQBBQxhZG1pbkFkZHJlc3MGBwENc3BsaXRDZm1tSnNvbgEFZW50cnkJALUJAgUFZW50cnkCAS8BEWRldGVybWluZVBsYXRmb3JtAwRjZm1tCXRva2VuSWRJbgp0b2tlbklkT3V0BARpdGVtCQENc3BsaXRDZm1tSnNvbgEFBGNmbW0EC2lucHV0QW1vdW50CQC2CQEJAJEDAgUEaXRlbQACBAckbWF0Y2gwBQtpbnB1dEFtb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEC2lucHV0QW1vdW50BQckbWF0Y2gwAwkAAAIJAJEDAgUEaXRlbQAAAgRTV09QCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUEaXRlbQABAghleGNoYW5nZQkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQl0b2tlbklkSW4FC2lucHV0QW1vdW50BQNuaWwDCQAAAgkAkQMCBQRpdGVtAAACDldhdmVzIEV4Y2hhbmdlCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDXd4U3dhcEFkZHJlc3MCBHN3YXAJAMwIAgABCQDMCAIFCnRva2VuSWRPdXQJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUJdG9rZW5JZEluBQtpbnB1dEFtb3VudAUDbmlsAwkAAAIJAJEDAgUEaXRlbQAAAgtQdXp6bGUgU3dhcAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBGl0ZW0AAQIEc3dhcAkAzAgCBQp0b2tlbklkT3V0CQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFCXRva2VuSWRJbgULaW5wdXRBbW91bnQFA25pbAkAAgECG1BsYXRmb3JtIGlkIGRvZXMgbm90IG1hdGNoIQkAAgECFHZhbHVlIGlzIG5vdCBhbiBpbnQhAQxwcm9jZXNzQ2ZtbXMDBXN3YXBzCXRva2VuSWRJbgp0b2tlbklkT3V0CgEKaW52b2tlU3dhcAIFYWNjdW0EbmV4dAQLJHQwMjI2NDIyOTEFBWFjY3VtBAZyZXN1bHQIBQskdDAyMjY0MjI5MQJfMQQFaW5kZXgIBQskdDAyMjY0MjI5MQJfMgMJAGYCCQCQAwEFBXN3YXBzBQVpbmRleAkAlAoCCQERZGV0ZXJtaW5lUGxhdGZvcm0DBQRuZXh0BQl0b2tlbklkSW4FCnRva2VuSWRPdXQJAGQCBQVpbmRleAABCQCUCgIFBnJlc3VsdAUFaW5kZXgKAAIkbAUFc3dhcHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQppbnZva2VTd2FwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA0MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoARRkaXN0cmlidXRlRGlmZmVyZW5jZQIFc3dhcHMEZGlmZgQKdG90YWxTd2FwcwkAkAMBBQVzd2FwcwoBDWFkanVzdEFtb3VudHMCBWFjY3VtBG5leHQECyR0MDI2MzIyNjc0BQVhY2N1bQQNYWRqdXN0ZWRTd2FwcwgFCyR0MDI2MzIyNjc0Al8xBA1yZW1haW5pbmdEaWZmCAULJHQwMjYzMjI2NzQCXzIEBGl0ZW0JAQ1zcGxpdENmbW1Kc29uAQUEbmV4dAQLaW5wdXRBbW91bnQJALYJAQkAkQMCBQRpdGVtAAIEByRtYXRjaDAFC2lucHV0QW1vdW50AwkAAQIFByRtYXRjaDACA0ludAQFaW5wdXQFByRtYXRjaDAEDmFtb3VudFRvQWRqdXN0BApyZW1haW5EaWZmCQBpAgUNcmVtYWluaW5nRGlmZgkAZAIJAGUCBQp0b3RhbFN3YXBzCQCQAwEFDWFkanVzdGVkU3dhcHMAAQQHJG1hdGNoMQUKcmVtYWluRGlmZgMJAAECBQckbWF0Y2gxAgNJbnQEAXgFByRtYXRjaDEDCQBmAgUNcmVtYWluaW5nRGlmZgAACQCXAwEJAMwIAgUFaW5wdXQJAMwIAgUBeAUDbmlsAwkAZgIAAAUNcmVtYWluaW5nRGlmZgkAlgMBCQDMCAIJAGQCCQEBLQEFBWlucHV0AAEJAMwIAgUBeAUDbmlsAAAJAAIBAg5Xcm9uZyBkYXRhdHlwZQQObmV3SW5wdXRBbW91bnQJAJYDAQkAzAgCAAEJAMwIAgkAZAIFBWlucHV0BQ5hbW91bnRUb0FkanVzdAUDbmlsBAduZXdJdGVtCQCsAgIJAKwCAgkArAICCQCsAgIJAJEDAgUEaXRlbQAAAgEvCQCRAwIFBGl0ZW0AAQIBLwkApAMBBQ5uZXdJbnB1dEFtb3VudAkAlAoCCQDNCAIFDWFkanVzdGVkU3dhcHMFB25ld0l0ZW0JAGUCBQ1yZW1haW5pbmdEaWZmCQBoAgUOYW1vdW50VG9BZGp1c3QJAGQCCQBlAgUKdG90YWxTd2FwcwkAkAMBBQ1hZGp1c3RlZFN3YXBzAAEJAAIBAhlJbnB1dCBoYXMgd3JvbmcgZGF0YXR5cGUhCgACJGwFBXN3YXBzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFBGRpZmYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDWFkanVzdEFtb3VudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDQwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgBF2hhbmRsZVNlY29uZElucHV0QW1vdW50AxNwcmVkZXRlcm1pbmVkQW1vdW50D2F2YWlsYWJsZUFtb3VudAVzd2FwcwQEZGlmZgkAZQIFD2F2YWlsYWJsZUFtb3VudAUTcHJlZGV0ZXJtaW5lZEFtb3VudAQNYWRqdXN0ZWRTd2FwcwMJAQIhPQIFBGRpZmYAAAgJARRkaXN0cmlidXRlRGlmZmVyZW5jZQIFBXN3YXBzBQRkaWZmAl8xBQVzd2FwcwUNYWRqdXN0ZWRTd2FwcwUBaQEFc2V0dXABBWFkbWluAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzAgVhZG1pbgkAzAgCCQELd3JpdGVTdHJpbmcCAgVhZG1pbgUFYWRtaW4FA25pbAkAAgECE0RhcHAgYWxyZWFkeSBzZXR1cCEBaQEIYmFzaWNBcmIGC3N0YXJ0QW1vdW50DnNlY29uZEFtb3VudEluCmZpcnN0VG9rZW4Lc2Vjb25kVG9rZW4JZmlyc3RTd2FwCnNlY29uZFN3YXADCQEHaXNBZG1pbgEICAUBaQZjYWxsZXIFYnl0ZXMEDGZpcnN0VG9rZW5JZAQDdElkCQDZBAEFCmZpcnN0VG9rZW4EByRtYXRjaDAFA3RJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAN0SWQFByRtYXRjaDAFA3RJZAkAAgECEEludmFsaWQgZGF0YXR5cGUEGWF2YWlsYWJsZUFtb3VudEZpcnN0VG9rZW4JAPAHAgUEdGhpcwUMZmlyc3RUb2tlbklkAwkAZwIFGWF2YWlsYWJsZUFtb3VudEZpcnN0VG9rZW4FC3N0YXJ0QW1vdW50BAZyZXN1bHQJAQxwcm9jZXNzQ2ZtbXMDBQlmaXJzdFN3YXAFCmZpcnN0VG9rZW4FC3NlY29uZFRva2VuBA1zZWNvbmRUb2tlbklkBAJpZAkA2QQBBQtzZWNvbmRUb2tlbgQHJG1hdGNoMAUCaWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAFAmlkCQACAQIQSW52YWxpZCBkYXRhdHlwZQQaYXZhaWxhYmxlQW1vdW50U2Vjb25kVG9rZW4JAPAHAgUEdGhpcwUNc2Vjb25kVG9rZW5JZAQLc2Vjb25kU3dhcHMDCQAAAgUaYXZhaWxhYmxlQW1vdW50U2Vjb25kVG9rZW4FDnNlY29uZEFtb3VudEluBQpzZWNvbmRTd2FwCQEXaGFuZGxlU2Vjb25kSW5wdXRBbW91bnQDBQ5zZWNvbmRBbW91bnRJbgUaYXZhaWxhYmxlQW1vdW50U2Vjb25kVG9rZW4FCnNlY29uZFN3YXAECXJlc3VsdFR3bwkBDHByb2Nlc3NDZm1tcwMFC3NlY29uZFN3YXBzBQtzZWNvbmRUb2tlbgUKZmlyc3RUb2tlbgQYY3VycmVudFN0YXJ0VG9rZW5CYWxhbmNlCQDwBwIFBHRoaXMFDGZpcnN0VG9rZW5JZAMJAGYCBRhjdXJyZW50U3RhcnRUb2tlbkJhbGFuY2UFC3N0YXJ0QW1vdW50BQNuaWwJAAIBAhlUcmFkZSB3YXMgbm90IHByb2ZpdGFibGUhCQACAQIpQXZhaWxhYmxlIGlucHV0IGFtb3VudCBpcyBub3Qgc3VmZmljaWVudCEJAAIBAipBZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggYWRtaW4gYWRkcmVzcyEBaQERdXBkYXRlU3RyaW5nRW50cnkCA2tleQtzdHJpbmdWYWx1ZQMJAQdpc0FkbWluAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQELd3JpdGVTdHJpbmcCBQNrZXkFC3N0cmluZ1ZhbHVlBQNuaWwJAAIBAipBZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggYWRtaW4gYWRkcmVzcyEBaQESdXBkYXRlSW50ZWdlckVudHJ5AgNrZXkMaW50ZWdlclZhbHVlAwkBB2lzQWRtaW4BCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIJAQx3cml0ZUludGVnZXICBQNrZXkFDGludGVnZXJWYWx1ZQUDbmlsCQACAQIqQWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIGFkbWluIGFkZHJlc3MhAWkBEmRlbGV0ZVN0b3JhZ2VFbnRyeQEDa2V5AwkBB2lzQWRtaW4BCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIJAQtEZWxldGVFbnRyeQEFA2tleQUDbmlsCQACAQIqQWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIGFkbWluIGFkZHJlc3MhAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleeZQUnE=", "height": 2786644, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 5WAd5iLZ9EVt2AjjapnsEVyA8G9vgfFQUfAXJNYCijME Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let a = valueOrElse(getString(this, "admin"), "")
5+
6+let b = "3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93"
7+
8+func c (d,e) = StringEntry(d, e)
9+
10+
11+func f (d,g) = IntegerEntry(d, g)
12+
13+
14+func h (i) = if ((i == fromBase58String(a)))
15+ then true
16+ else false
17+
18+
19+func j (k) = split(k, "/")
20+
21+
22+func l (m,n,o) = {
23+ let p = j(m)
24+ let q = parseInt(p[2])
25+ let r = q
26+ if ($isInstanceOf(r, "Int"))
27+ then {
28+ let q = r
29+ if ((p[0] == "SWOP"))
30+ then invoke(addressFromStringValue(p[1]), "exchange", [1], [AttachedPayment(fromBase58String(n), q)])
31+ else if ((p[0] == "Waves Exchange"))
32+ then invoke(addressFromStringValue(b), "swap", [1, o, a], [AttachedPayment(fromBase58String(n), q)])
33+ else if ((p[0] == "Puzzle Swap"))
34+ then invoke(addressFromStringValue(p[1]), "swap", [o, 1], [AttachedPayment(fromBase58String(n), q)])
35+ else throw("Platform id does not match!")
36+ }
37+ else throw("value is not an int!")
38+ }
39+
40+
41+func s (t,n,o) = {
42+ func u (v,w) = {
43+ let x = v
44+ let y = x._1
45+ let z = x._2
46+ if ((size(t) > z))
47+ then $Tuple2(l(w, n, o), (z + 1))
48+ else $Tuple2(y, z)
49+ }
50+
51+ let A = t
52+ let B = size(A)
53+ let C = $Tuple2(nil, 0)
54+ func D (E,F) = if ((F >= B))
55+ then E
56+ else u(E, A[F])
57+
58+ func G (E,F) = if ((F >= B))
59+ then E
60+ else throw("List size exceeds 40")
61+
62+ G(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(C, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
63+ }
64+
65+
66+func H (t,I) = {
67+ let J = size(t)
68+ func K (v,w) = {
69+ let L = v
70+ let M = L._1
71+ let N = L._2
72+ let p = j(w)
73+ let q = parseInt(p[2])
74+ let r = q
75+ if ($isInstanceOf(r, "Int"))
76+ then {
77+ let O = r
78+ let P = {
79+ let Q = (N / ((J - size(M)) + 1))
80+ let R = Q
81+ if ($isInstanceOf(R, "Int"))
82+ then {
83+ let S = R
84+ if ((N > 0))
85+ then min([O, S])
86+ else if ((0 > N))
87+ then max([(-(O) + 1), S])
88+ else 0
89+ }
90+ else throw("Wrong datatype")
91+ }
92+ let T = max([1, (O + P)])
93+ let U = ((((p[0] + "/") + p[1]) + "/") + toString(T))
94+ $Tuple2((M :+ U), (N - (P * ((J - size(M)) + 1))))
95+ }
96+ else throw("Input has wrong datatype!")
97+ }
98+
99+ let A = t
100+ let B = size(A)
101+ let C = $Tuple2(nil, I)
102+ func D (E,F) = if ((F >= B))
103+ then E
104+ else K(E, A[F])
105+
106+ func G (E,F) = if ((F >= B))
107+ then E
108+ else throw("List size exceeds 40")
109+
110+ G(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(D(C, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
111+ }
112+
113+
114+func V (W,X,t) = {
115+ let I = (X - W)
116+ let M = if ((I != 0))
117+ then H(t, I)._1
118+ else t
119+ M
120+ }
121+
122+
123+@Callable(Y)
124+func setup (Z) = if (!(isDefined(getString(this, "admin"))))
125+ then [c("admin", Z)]
126+ else throw("Dapp already setup!")
127+
128+
129+
130+@Callable(Y)
131+func basicArb (aa,ab,ac,ad,ae,af) = if (h(Y.caller.bytes))
132+ then {
133+ let ag = {
134+ let ah = fromBase58String(ac)
135+ let r = ah
136+ if ($isInstanceOf(r, "ByteVector"))
137+ then {
138+ let ah = r
139+ ah
140+ }
141+ else throw("Invalid datatype")
142+ }
143+ let ai = assetBalance(this, ag)
144+ if ((ai >= aa))
145+ then {
146+ let y = s(ae, ac, ad)
147+ let aj = {
148+ let ak = fromBase58String(ad)
149+ let r = ak
150+ if ($isInstanceOf(r, "ByteVector"))
151+ then {
152+ let ak = r
153+ ak
154+ }
155+ else throw("Invalid datatype")
156+ }
157+ let al = assetBalance(this, aj)
158+ let am = if ((al == ab))
159+ then af
160+ else V(ab, al, af)
161+ let an = s(am, ad, ac)
162+ let ao = assetBalance(this, ag)
163+ if ((ao > aa))
164+ then nil
165+ else throw("Trade was not profitable!")
166+ }
167+ else throw("Available input amount is not sufficient!")
168+ }
169+ else throw("Address does not match with admin address!")
170+
171+
172+
173+@Callable(Y)
174+func updateStringEntry (d,e) = if (h(Y.caller.bytes))
175+ then [c(d, e)]
176+ else throw("Address does not match with admin address!")
177+
178+
179+
180+@Callable(Y)
181+func updateIntegerEntry (d,g) = if (h(Y.caller.bytes))
182+ then [f(d, g)]
183+ else throw("Address does not match with admin address!")
184+
185+
186+
187+@Callable(Y)
188+func deleteStorageEntry (d) = if (h(Y.caller.bytes))
189+ then [DeleteEntry(d)]
190+ else throw("Address does not match with admin address!")
191+
192+
193+@Verifier(ap)
194+func aq () = sigVerify(ap.bodyBytes, ap.proofs[0], ap.senderPublicKey)
195+

github/deemru/w8io/873ac7e 
18.50 ms