Current section
Files
Jump to
Current section
Files
lib/apollo18/core/x.ex
defmodule Apollo18.Cipher do
@moduledoc """
Provides cipher mechanism to make your things be like Apollo 18:
Officially don't exists, only the owner know that it (if ?) exists.
The truth is out there (Maybe ...).
This module functionalities are present in web/javascript version.
This could be usefull to send/receive messages between a web browser
client (Javascript side) and a server (Elixir side).
For javascript instantiation use:
```javascript
let cipher = new Cipher();
```
Remember of take additional care to handle securely ```key```
and ```salt``` values when use it whit javascript. Rotate the key
each X minutes and store it ciphered for example.
If you want maximum security try use one new key per message.
Never, never, never use sequential keys, always randomize, please!
"""
alias Krug.StringUtil
alias Krug.NumberUtil
alias Krug.SanitizerUtil
alias Krug.EtsUtil
alias Apollo18.B
@z B.e()
@b B.d()
@a 4294967296
@doc """
Cipher a text/string object. Each time that a same string
is ciphered, the cipher will be another cipher.
However when decipher all then will result in same
origin string.
The ```salt``` parameter can be used to make more strong the cipher.
Increase of processing time is also proportional to this value.
By default the minimum value is equal to 1.
Only supported chars will be ciphered. All non supported chars
will be removed from original text/string before of
cipher process. This could generate some decipher "issues".
If you will/need use non supported chars then try use the
```Apollo18.Based64Cipher``` module.
Supported chars
```elixir
[
"A","Ä","Ã","Â","Á","À","Æ","А",
"B","Б","Ъ","Ь","Ы","C","Ç","D","Ð","Д","В","С",
"E","Ë","Ẽ","Ê","É","È","Э","Е",
"F","Ф","G","Г","H","Н",
"I","Ï","Ĩ","Î","Í","Ì",
"J","Ж","K","К","L","Л",
"M","М","N","Ñ","И","Й",
"O","Ö","Õ","Ô","Ó","Ò","Ѳ","О",
"P","Р","П","Q","R","S","Ш","Щ","T","Т","Þ","Ц","Ч",
"U","Ü","Ũ","Û","Ú","Ù",
"V","X","Х","W",
"Y","Ÿ","Ỹ","Ŷ","Ý","Ỳ","У",
"Z","З",
"ẞ","Ю","Я",
"a","ä","ã","â","á","à","æ","а",
"b","б","ъ","ь","ы","c","ç","d","ð","д","в","с",
"e","ë","ẽ","ê","é","è","ə","œ","ɛ","э","е",
"f","ф","g","г","h","н",
"i","ï","ĩ","î","í","ì",
"j","ж","k","к","l","л",
"m","м","n","ñ","и","й",
"o","ö","õ","ô","ó","ò","ѳ","о",
"p","р","п","q","r","s","ш","щ","t","т","þ","ц","ч",
"u","ü","ũ","û","ú","ù",
"v","x","х","w",
"y","ÿ","ỹ","ŷ","ý","ỳ","у",
"z","з",
"ß","ю","я",
"ʃ","ʒ","ʁ","ɾ",
"Ѣ","ѣ","Ѵ","ѵ",
"0","1","2","3","4","5","6","7","8","9",
" ",".",",",";",":","<",">","/","\\","?","|",
"[","]","{","}","(",")","º","°","ª",
"+","-","=","_","*","&","%","$","#","@",
"~","^","´","`","§","‘","’","“","”",
"!","'","\"","\n","\r","\t","\b","\f"
]
```
## Javascript Example
```javascript
var cipher = new Cipher(); // or new Based64Cipher(); if you want add a encoding base64 step.
var text = 'аз буки веди Conheço letras. глаголь добро есть Falar é benéfico живете зело земля Vive de verdade (nesta) terra иже и како люди мыслете a cal, de onde pensastes como seres humanos наш он покой é por nossa tranquilidade рцы слово твердо da palavra firmemente ук ферт хер цы [daqui em diante...] червь ша ер ять юс';
var key = 223456237;
var salt = 1;
var ciphered = cipher.cipher(text,salt,key);
(ciphered content):
{”[’[’[’[’/§H“/^*§,~#ªH1ª?ª?ª?´[_}_{_:ª?ª?´[_;”?#3.7[8#1.5=2+7[7&9!6&2+7[7<4+0+4?9&3&4+7[6=9&0%6-9@7-8[7[3?7=6#3?1-7=0&7[6&1-8#3-1-7[9!8&1%0&7[2:9@6=9@6-7[3!7[7#9&0+3!0?6?2&4+7[3=2+7&9!1%9!7[3.9!7=1-7[3.9!9=7=6.7[1}3$6?1I9&7[4&9&7[1I9&6-4&9@4&9&7[2(0+9&7-0%9@3(7[0%9&6-6-9@7[2+3=9!7[2+7[5=6#5=1-7[7=5.6&2+7[9=1&8&7=9!1%9!7[1}9@7[2&9@6=9[7[4&9&7[4+0+4&9&7[2-9&0+7-9@7-0%9&7-7[2&4+8=4+7[7-9&6-9&7-7[4?5%8=9@0+4+7-7[5?6#8-7[1-5?7[4-1-5=1-3+7[1}3!7[2-4+6-7[0+4+7-7-9@7[0%6-9@0+5-5%6?6=6?4&9@4&9&7[3-3%1&7[8&7=1-7&1-7[1%7&9!3-6&1-7[1}4&9@7[2-9@6=9@1I6-9@7[0?6?6-8=9&8=9&0+0%9&7[1.5=7[1?9!3-1%7[3I9!3-7[3%1&7[1}8]4&9@5-5%6?7[9&8=7[4&6?9@0+0%9&8[8[8[9]7[4%9!3-7&0&7[8-6#7[9!3-7[6.1%0&7[5.8&
```
## Elixir Examples
```elixir
iex > Apollo18.Cipher.cipher("mytext",1,345278)
"°(”)´[_;’/_@º!‘+G*4‘?°I§?”.§?”.§?”.§?”.“?”.”?”.G=”.’?”.~=”.0Aª,:6*1H0<3*1H"
```
```elixir
iex > Apollo18.Cipher.cipher("mytext",1,345278)
"°(”)_;_;º/`$^H”H`#º+0§?A0§?A0§?A0§?A0“?A0”?A§,°?0’?A`@§,G#5/2@7*6>9$7*"
```
```elixir
iex > Apollo18.Cipher.cipher("mytext",1,345278)
"´)´[`<´[’/ª/’/G*5G=§+”?_%”?_%”?_%”?_%~=_%0A_%ª!_%_=_%0D_%0E‘%(6<1}0[3<1}"
```
```elixir
iex > Apollo18.Cipher.cipher("mytext",2,345278)
"°(”)´[_:º/`$^H§H´!º%6?3!1+3=1?3!1?3=6H6H9H7H6?1+0*7H1*6H0
*7H8H6H9H7H8?1+3!3!6H6H1+7H6H6H1+7H6H6H1+7H6H6H1+7H6H6H8H
8H6H6H9H8H6H6H0*8H6H6H7H8H6H6H2*8H6H6H3*8H8H7+7H8$0*8*9H6
@4*7$0*8*"
```
```elixir
iex > Apollo18.Cipher.cipher("mytext",3,345278)
"§#Fª]E’{°;º/~*`$ºH0‘?E5@9+9$4%6-4+6=4+9$9$9$0@9$9$9$0@9$9
$2@0@6-4%2@0@9+4%3@0@1@9$2@0@4%4%6@1@0@2#8@3#2@2#4@2#3@4!0
@2#9$2#3@4!6@3#6@3#6@3#9$2#6@3#6@3#6@3#6@3#6@3#7@3#0@2#7@3
#0@2#6@3#0@2#7@3#0@2#6@3#9$2#7@3#3@4!1@8?9$2#7@3#8@7!1@8?6
@3#7@3#6@3#6@3#3@8!6@7!6@3#6@3#3@8!6@7!6@3#6@3#3@8!6@7!6@3
#6@3#3@8!6@7!6@3#6@3#8@7!6@7!6@3#6@3#3@4!6@7!6@3#6@3#1@8?6
@7!6@3#6@3#6@7!6@7!6@3#6@3#7@3#8@7!6@3#6@3#8@3#8@7!1@2#5@3
!8@3#5@6#3@2#1@3!2@2#5@8?5@2#5@6!3@2#1@3!"
```
```elixir
iex > Apollo18.Cipher.cipher("mytext",4,345278)
"‘[^(_{_:º/’/ª/”/´!’&8.8)2.7.6.8)3.6{9I9I9I2.9I9I9I9I9I9I3
.0.9I9I2.0.8}6<2.0.1}6<3.0.1.9I0.6.4.0[4.2>1.0[9I0[4.0[4.2
>9I0[1.0[7.0)7.0)7.0)2.0[7.0)7.0)1.0[0.3.6]0.2.1.7.0)1.0[0
.3.6]0.9I1.7.0)1.0[0.3.6]0.1.1.7.0)1.0[0.3.6]3.6]0.9I1.4.2
>3.0[7.0)0.1]0.0[0.1]4.0[3.1]0.0[0.1]9I0[8.2[6.0[3.1]5.0[3
.1]9I0[8.2[6.0[3.1]4.0[3.1]9I0[0.1]9I0[0.1]2.0[3.1]3.0[3.1
]6.0[3.1]3.0[3.1]4.0[3.1]2.0[3.1]6.0[3.1]3.0[3.1]5.0[3.1]2
.0[3.1]5.0[3.1]3.0[3.1]4.0[0.4.6]0.9I1.1.2]6.0[3.1]3.0[3.1
]2.0[3.1]2.0[3.1]2.0[3.1]2.0[3.1]2.0[3.1]2.0[3.1]7.0)0.4.6
]0.4.1.0.4.6]0.4.1.3.1]2.0[3.1]7.0)0.4.6]0.4.1.0.4.6]0.4.1
.3.1]2.0[3.1]7.0)0.4.6]0.4.1.0.4.6]0.4.1.3.1]2.0[3.1]7.0)0
.4.6]0.4.1.0.4.6]0.4.1.3.1]2.0[3.1]9I0[8.2[2.0[0.4.6]0.4.1
.3.1]2.0[3.1]7.0)1.2]2.0[0.4.6]0.4.1.3.1]2.0[3.1]2.0[3.1]4
.0[0.4.6]0.4.1.3.1]2.0[3.1]4.0[0.4.6]0.4.1.0.4.6]0.4.1.3.1
]2.0[3.1]4.0[3.1]4.0[0.4.6]0.4.1.3.1]2.0[3.1]5.0[3.1]4.0[0
.4.6]3.6]0.6.2.1.0[3.3]5.0[3.1]1.0[1.1]0.0[0.1]7.0)3.3]9I0
[0.1]1.0[1.2]2.0[3.1]1.0[1.1]0.0[0.1]7.0)3.3]"
```
"""
def cipher(string,salt \\ 1,key \\ 0) do
b = m()
EtsUtil.new(b)
k = j(string,salt |> f(),key,b,0)
EtsUtil.delete(b)
k
end
@doc """
Decipher a previously ciphered string that contains a text/string object.
Should be used the same ```salt``` and ```key``` values used in call to cipher function.
## Javascript Example
```javascript
var cipher = new Cipher(); // or new Based64Cipher(); if you used it previously to cipher.
var ciphered = '{”[’[’[’[’/§H“/^*§,~#ªH1ª?ª?ª?´[_}_{_:ª?ª?´[_;”?#3.7[8#1.5=2+7[7&9!6&2+7[7<4+0+4?9&3&4+7[6=9&0%6-9@7-8[7[3?7=6#3?1-7=0&7[6&1-8#3-1-7[9!8&1%0&7[2:9@6=9@6-7[3!7[7#9&0+3!0?6?2&4+7[3=2+7&9!1%9!7[3.9!7=1-7[3.9!9=7=6.7[1}3$6?1I9&7[4&9&7[1I9&6-4&9@4&9&7[2(0+9&7-0%9@3(7[0%9&6-6-9@7[2+3=9!7[2+7[5=6#5=1-7[7=5.6&2+7[9=1&8&7=9!1%9!7[1}9@7[2&9@6=9[7[4&9&7[4+0+4&9&7[2-9&0+7-9@7-0%9&7-7[2&4+8=4+7[7-9&6-9&7-7[4?5%8=9@0+4+7-7[5?6#8-7[1-5?7[4-1-5=1-3+7[1}3!7[2-4+6-7[0+4+7-7-9@7[0%6-9@0+5-5%6?6=6?4&9@4&9&7[3-3%1&7[8&7=1-7&1-7[1%7&9!3-6&1-7[1}4&9@7[2-9@6=9@1I6-9@7[0?6?6-8=9&8=9&0+0%9&7[1.5=7[1?9!3-1%7[3I9!3-7[3%1&7[1}8]4&9@5-5%6?7[9&8=7[4&6?9@0+0%9&8[8[8[9]7[4%9!3-7&0&7[8-6#7[9!3-7[6.1%0&7[5.8&';
var key = 223456237;
var salt = 1;
var deciphered = cipher.decipher(text,salt,key);
(deciphered content):
аз буки веди Conheço letras. глаголь добро есть Falar é benéfico живете зело земля Vive de verdade (nesta) terra иже и како люди мыслете a cal, de onde pensastes como seres humanos наш он покой é por nossa tranquilidade рцы слово твердо da palavra firmemente ук ферт хер цы [daqui em diante...] червь ша ер ять юс
```
## Elixir Examples
```elixir
iex > Apollo18.Cipher.decipher("°(”)´[_;’/_@º!‘+G*4‘?°I§?”.§?”.§?”.§?”.“?”.”?”.G=”.’?”.~=”.0Aª,:6*1H0<3*1H",1,345278)
"mytext"
```
```elixir
iex > Apollo18.Cipher.decipher("°(”)_;_;º/`$^H”H`#º+0§?A0§?A0§?A0§?A0“?A0”?A§,°?0’?A`@§,G#5/2@7*6>9$7*",1,345278)
"mytext"
```
```elixir
iex > Apollo18.Cipher.decipher("´)´[`<´[’/ª/’/G*5G=§+”?_%”?_%”?_%”?_%~=_%0A_%ª!_%_=_%0D_%0E‘%(6<1}0[3<1}",1,345278)
"mytext"
```
"""
def decipher(string,salt \\ 1,key \\ 0) do
z = dm()
EtsUtil.new(z)
j = string |> o(z()) |> w(salt |> f(),key,z,0)
EtsUtil.delete(z)
j
end
@doc false
def v(v,z) do
b(v,z)
end
@doc false
def a(z,t) do
r(t,h(),z)
end
@doc false
def u(u,l) do
d(l,u)
end
@doc false
defp p(f,e,h,z,a,x,p,t) do
cond do
(z |> g(a)) -> e |> i()
true -> y(f,e,h,z,a,x,p,t)
end
end
@doc false
defp c(w,y,c) do
y |> l(c) or c |> p(w)
end
@doc false
defp m(z,c,b,t,a) do
i = n(t,h(),c,b,a)
cond do
(b() |> q(i)) -> i
true -> v(z,c,b,t,a)
end
end
@doc false
defp k(v,d,y) do
cond do
(d |> l(y)) -> v
true -> y |> e()
end
end
@doc false
defp v(w,k,x,e,t) do
y = (x + v(w,k,0)) |> t() |> n(4) |> m() |> z() |> u()
h() |> n(e,k,x,t,y)
end
@doc false
defp n(w,x,m,r,e,d) do
EtsUtil.store_in_cache(x,e(w,m,r,e),d)
d
end
@doc false
defp v(g,f,y) do
cond do
(m(g,y) |> l(f)) -> y
true -> v(g,f,y + 1)
end
end
@doc false
defp i(i,z,n \\ 0) do
cond do
(n |> g(i |> s())) -> z
(z |> e(m(i,n))) -> s(z,m(i,n))
true -> i(i,z,n + 1)
end
end
@doc false
defp t(d,t) do
t |> h() |> q() |> g(d)
end
@doc false
defp w(k) do
# ======= "#{m(k,1)}#{m(k,0)}#{m(k,3)}#{m(k,2)}"
[
m(k,1),
m(k,0),
m(k,3),
m(k,2)
]
|> Enum.join()
end
@doc false
defp k(q,b) do
q |> m(b) |> a()
end
@doc false
defp s(b,a) do
x = a |> q()
z = b |> q()
b |> p(x,z)
end
@doc false
defp g(g,w,b) do
b |> h() |> p(g,w - 1)
end
@doc false
defp x(j,l,k,s,v,a \\ []) do
cond do
(b() |> l(j) or s(j) |> l(0)) -> a |> i() |> j(h())
(j |> hd() |> e() |> l(h())) -> x(j |> tl(),l,k,s,v,a)
true -> x(j |> tl(),l,k,s,v,[l(j |> hd(),l,k,s,v) | a])
end
end
@doc false
defp a(z,t,x,y,o) do
cond do
(o |> l(t)) -> y
(y |> l(x)) -> t
true -> z
end
end
@doc false
defp y(z) do
cond do
(!z) -> 20
true -> 60
end
end
@doc false
defp h(w) do
h() |> k(b(),w)
end
@doc false
defp w(w,p,n,k,o) do
cond do
(o |> g(p)) -> w
true -> h(w,n,k,o |> l(p - 1)) |> w(p,n,k,o + 1)
end
end
@doc false
defp a(z,p,t) do
[z |> h(), t |> h(), p |> h()] |> u()
end
@doc false
defp n(t,w,c,p,x) do
EtsUtil.read_from_cache(t,e(w,c,p,x))
end
@doc false
defp dm(p) do
p |> NumberUtil.to_positive()
end
@doc false
defp y(r,y,n,c,m) do
n |> o(m) |> o() |> x(y,m,r,c)
end
@doc false
defp k(x) do
x |> String.to_charlist()
end
@doc false
defp h(u,n,i,t) do
u = i(@b,u)
h = p(u,0,19)
a = p(h,0,1)
b = p(h,18,19)
h = p(h,2,17)
z = p(h,4,7) |> g()
p = p(h,8,11) |> g()
e = p(h,12,15) |> g()
x(a,b,n,i,r(10),t,u,p(u,y(t),q(u)),p(h,0,3) |> g() |> p(z,p,e))
end
@doc false
defp y(d,w,q) do
q = v(q)
cond do
(q |> p(d)) -> w
true -> q |> x()
end
end
@doc false
defp n(f) do
f |> Integer.parse(16)
end
@doc false
defp p(r,j,f) do
r |> String.slice(j..f)
end
@doc false
defp x(u) do
[u] |> List.to_string()
end
@doc false
defp l(c,b,f,a,g) do
z = n(a,"de",c,f,g)
cond do
(l(z,b(),h())) -> t(c,b,f,a,g)
true -> z
end
end
@doc false
defp w(j,y) do
y |> hd() |> e() |> l(j)
end
@doc false
defp j(k,l,e,z,h) do
cond do
(h |> g(l)) -> k |> j()
true -> f(k,e,z,h |> l(z())) |> j(l,e,z,h + 1)
end
end
@doc false
defp f(h,j) do
j |> hd() |> e() |> x(h |> e())
end
@doc false
defp e(t,z,x,y) do
# ===== "#{t}ciphered_#{z}_#{x}_#{y}"
[
t,
"ciphered_",
z,
x,
y
]
|> Enum.join()
end
@doc false
defp w(v,g,t,w) do
[v,w] |> y(g |> m(t))
end
@doc false
defp t(t,z,r,k,w) do
q = (g(t) - r) |> dm()
u = m(z,q)
n("de",k,t,r,w,u)
end
@doc false
defp x(t,x) do
x |> String.contains?(t)
end
@doc false
defp n(m,n) do
m |> StringUtil.left_zeros(n)
end
@doc false
defp g(y) do
y |> m() |> w() |> n() |> p() |> m(0)
end
@doc false
defp u(i) do
i |> IO.iodata_to_binary()
end
@doc false
defp m(r,s) do
r |> Enum.at(s)
end
@doc false
defp b(x,k,t,q) do
q |> h() |> h(t,x) |> u(k)
end
@doc false
defp x(a,b,s,r,y,o,n,d,m) do
# ======== c = "#{a}#{b}" |> n() |> p() |> m(0) |> B.a()
c = [a,b] |> Enum.join() |> n() |> p() |> m(0) |> B.a()
b = s |> d(c,0,r,y)
f(b,c,r,y,o,n,d,m)
end
@doc false
defp w(x,g,s) do
(g |> l(s) or s |> s() |> l(x))
end
@doc false
defp e(r,u) do
r |> String.starts_with?(u)
end
@doc false
defp q(v) do
v |> String.length()
end
@doc false
defp h(x,f,a) do
h() |> k(a,x,f)
end
@doc false
defp b(a) do
cond do
(b() |> l(a) or a |> p(z())) -> z()
true -> rem(a,@a)
end
end
@doc false
defp c(y,h,j,i) do
cond do
(j |> c(y,h)) -> i
(h |> t(i)) -> j |> g(h,i)
true -> h() |> b(h,v(),i)
end
end
@doc false
defp o(n) do
n |> c(4)
end
@doc false
defp d(x) do
x |> String.to_atom()
end
@doc false
defp r(w) do
SanitizerUtil.generate_random_only_num(w)
end
@doc false
defp l(k,l,j) do
(l |> l(k) or j |> l(k))
end
@doc false
defp c(a) do
a |> p(20,59) |> c(4) |> j(h())
end
@doc false
defp t(u) do
u |> Integer.to_string(16)
end
@doc false
defp f(u,k,e,o) do
a = B.z()
t(a |> t() |> n(4),k,u |> m(),o,e,B.b(),r(10),B.a(a))
end
@doc false
defp i(k) do
k |> Enum.reverse()
end
@doc false
defp b(l,o) do
x(o,l,h(),z())
end
@doc false
defp z(l,w) do
l |> Hexzip.y(w)
end
@doc false
defp v() do
" "
end
@doc false
defp m() do
x = "ollo1"
z = "_ciph"
z = "ap#{x}8#{z}er_"
x = 30
# ====== "#{z}#{r(x)}" |> d()
[
z,
r(x)
]
|> Enum.join()
|> d()
end
@doc false
defp s(h) do
h |> length()
end
@doc false
defp d(u,t,n,r,v) do
p = []
z = 10
o = 0
u |> b() |> n(z) |> m() |> p(p,t,o,z,n,r,v) |> u()
end
@doc false
defp x(y,x,p) do
y |> d(y,x) |> e() |> j(1,r(7) |> v(),p,0)
end
@doc false
defp z(z) do
[m(z,1),m(z,0),m(z,3),m(z,2)]
end
@doc false
defp m(r) do
r |> String.graphemes()
end
@doc false
defp p(v,f,x,q) do
# =========== "#{v - @z}#{f - @z}#{x - @z}#{q - @z}" |> v()
[
v - @z,
f - @z,
x - @z,
q - @z
]
|> Enum.join()
|> v()
end
@doc false
defp o(n,d,r,c,b) do
n |> o(z()) |> x(p(!b,r,c,d,n),r)
end
@doc false
defp dm() do
z = "pollo1"
t = "_decip"
t = "a#{z}8#{t}her_"
# ===== "#{t}#{r(30)}" |> d()
[
t,
r(30)
]
|> Enum.join()
|> d()
end
@doc false
defp s(j,o,r,y) do
a(o,r,j,o |> h(),y)
end
@doc false
defp j(n) do
n |> Hexzip.y(z())
end
@doc false
defp g(r,w) do
(r >= w)
end
@doc false
defp d(x,t,z) do
x |> StringUtil.replace(t,z)
end
@doc false
defp r(o,w) do
o |> Enum.chunk_every(w)
end
@doc false
defp p(j,s) do
!(j > s)
end
@doc false
defp o(h,p) do
h |> Hexzip.w(p)
end
@doc false
defp h() do
""
end
@doc false
defp f(x) do
cond do
(x |> g(1)) -> x
true -> 1
end
end
@doc false
defp w() do
["0","1","2","3","4","5","6","7","8","9"]
end
@doc false
defp b(c,p,u) do
(c |> l(p) or u |> g(s(p)))
end
@doc false
defp t(a,k,h,o,e,m,r,z) do
x = m |> n(4) |> m() |> p([],w(),0,4,@z,e,r) |> u()
k = p(o,k,z,e,r)
y = e(h,z,h |> s(),m,e,r)
# ===== "#{a |> p(0,1)}#{x}#{a |> p(2,3)}" |> m(k,y,m)
[
a |> p(0,1),
x,
a |> p(2,3)
]
|> Enum.join()
|> m(k,y,m)
end
@doc false
defp d(k,c) do
b() |> c(k,z(),c)
end
@doc false
defp y(s,x) do
s |> Enum.member?(x)
end
@doc false
defp p(q) do
cond do
(q == :error) -> {r(4) |> NumberUtil.to_integer(),""} |> p()
true -> q |> Tuple.to_list()
end
end
@doc false
defp c(x,t) do
x |> String.codepoints() |> r(t) |> Enum.map(&Enum.join/1)
end
@doc false
defp r(g,a,p) do
s(a,p,g,b())
end
@doc false
defp m(y,r,w,x) do
[@b |> Enum.random(),y,r,w |> z(x)] |> u()
end
@doc false
defp b() do
nil
end
@doc false
defp j(r,m) do
r |> Enum.join(m)
end
@doc false
defp q(t,q) do
(q != t)
end
@doc false
defp p(m,f,l,z,o) do
cond do
(!m) -> h()
true -> f |> d(l,0,z,o)
end
end
@doc false
defp k(c,t,r,z) do
cond do
(h(r) |> l(c)) -> z
(h(z) |> l(c)) -> r
true -> a(r,z,t)
end
end
@doc false
defp v(b) do
b |> NumberUtil.to_integer()
end
@doc false
defp l(s,w) do
s == w
end
@doc false
defp z() do
0
end
@doc false
def h(h,r) do
cond do
(b() |> b(h,r)) -> b()
(h() |> w(h,r,b())) -> b()
true -> h |> k(r)
end
end
@doc false
defp x(z,v,k,r) do
cond do
(w(r,b(),z)) -> false
(w(k,z)) -> v(v,tl(z))
(f(v,z)) -> true
true -> v(v,tl(z))
end
end
@doc false
defp f(o,y,r,c,b,d,n,m) do
cond do
(b and d |> c() |> q(o)) -> o(n,d,r,c,b)
true -> y(r,y,n,c,m)
end
end
@doc false
defp a(a) do
a |> h() |> k() |> hd()
end
@doc false
defp e(z) do
z |> StringUtil.trim()
end
@doc false
def l(g) do
y(z(),h(),g)
end
@doc false
defp y(q,p,x,o,a,u,e,k) do
h = q |> hd()
cond do
(!(x |> y(h))) -> p(q |> tl(),p,x,o + 1,a,u,e,k)
true -> p(q |> tl(),[m(x,h,u,e,k) | p],x,o + 1,a,u,e,k)
end
end
@doc false
defp e(h,z,s,m,e,r) do
p(h,[],z,0,s,m,e,r) |> u()
end
end