Skip to main content
Bounty Ended with 100 reputation awarded by humn
added 1359 characters in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49

$\min\left(\max\left(\min\left(a, b, c, d, e, f, g, h, i\right), \min\left(j, k, l, m, n, o, p, q, r\right), \min\left(s, t, u, v, w, x, y, z, zz\right)\right), \max\left(\min\left(a, b, c, j, k, l, s, t, u\right), \min\left(d, e, f, m, n, o, v, w, x\right), \min\left(g, h, i, p, q, r, y, z, zz\right)\right), \max\left(\min\left(a, b, c, m, n, o, y, z, zz\right), \min\left(d, e, f, p, q, r, s, t, u\right), \min\left(g, h, i, j, k, l, v, w, x\right)\right), \max\left(\min\left(a, b, c, p, q, r, v, w, x\right), \min\left(d, e, f, j, k, l, y, z, zz\right), \min\left(g, h, i, m, n, o, s, t, u\right)\right), \max\left(\min\left(a, d, g, j, m, p, s, v, y\right), \min\left(b, e, h, k, n, q, t, w, z\right), \min\left(c, f, i, l, o, r, u, x, zz\right)\right), \max\left(\min\left(a, d, g, k, n, q, u, x, zz\right), \min\left(b, e, h, l, o, r, s, v, y\right), \min\left(c, f, i, j, m, p, t, w, z\right)\right), \max\left(\min\left(a, d, g, l, o, r, t, w, z\right), \min\left(b, e, h, j, m, p, u, x, zz\right), \min\left(c, f, i, k, n, q, s, v, y\right)\right), \max\left(\min\left(a, e, i, j, n, r, s, w, zz\right), \min\left(b, f, g, k, o, p, t, x, y\right), \min\left(c, d, h, l, m, q, u, v, z\right)\right), \max\left(\min\left(a, f, h, j, o, q, s, x, z\right), \min\left(b, d, i, k, m, r, t, v, zz\right), \min\left(c, e, g, l, n, p, u, w, y\right)\right)\right)$$$\begin{gather} \operatorname{Max.3}{\left (a,b,c \right )}=\operatorname{Max.2}{\left (\operatorname{Max.2}{\left (a,b \right )},c \right )}\\ \operatorname{Min.3}{\left (a,b,c \right )}=\operatorname{Min.2}{\left (\operatorname{Min.2}{\left (a,b \right )},c \right )}\\ \operatorname{Min.9}{\left (a,b,c,d,e,f,g,h,i \right )}=\operatorname{Min.3}{\left (\operatorname{Min.3}{\left (a,b,c \right )},\operatorname{Min.3}{\left (d,e,f \right )},\operatorname{Min.3}{\left (g,h,i \right )} \right )}\\ \operatorname{Aux.27}{\left (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,zz \right )}=\operatorname{Max.3}{\left (\operatorname{Min.9}{\left (a,b,c,d,e,f,g,h,i \right )},\operatorname{Min.9}{\left (j,k,l,m,n,o,p,q,r \right )},\operatorname{Min.9}{\left (s,t,u,v,w,x,y,z,zz \right )} \right )}\\ \operatorname{3rd.27}{\left (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,zz \right )}=\operatorname{Min.9}{\left (\operatorname{Aux.27}{\left (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,zz \right )},\operatorname{Aux.27}{\left (a,b,c,j,k,l,s,t,u,d,e,f,m,n,o,v,w,x,g,h,i,p,q,r,y,z,zz \right )},\operatorname{Aux.27}{\left (a,d,g,j,m,p,s,v,y,b,e,h,k,n,q,t,w,z,c,f,i,l,o,r,u,x,zz \right )},\operatorname{Aux.27}{\left (a,b,c,p,q,r,v,w,x,d,e,f,j,k,l,y,z,zz,g,h,i,m,n,o,s,t,u \right )},\operatorname{Aux.27}{\left (a,b,c,m,n,o,y,z,zz,d,e,f,p,q,r,s,t,u,g,h,i,j,k,l,v,w,x \right )},\operatorname{Aux.27}{\left (a,f,h,j,o,q,s,x,z,b,d,i,k,m,r,t,v,zz,c,e,g,l,n,p,u,w,y \right )},\operatorname{Aux.27}{\left (a,e,i,j,n,r,s,w,zz,b,f,g,k,o,p,t,x,y,c,d,h,l,m,q,u,v,z \right )},\operatorname{Aux.27}{\left (a,d,g,l,o,r,t,w,z,b,e,h,j,m,p,u,x,zz,c,f,i,k,n,q,s,v,y \right )},\operatorname{Aux.27}{\left (a,d,g,k,n,q,u,x,zz,c,f,i,j,m,p,t,w,z,b,e,h,l,o,r,s,v,y \right )} \right )} \end{gather}$$

from operator import itemgetter as ig,sub
from itertools import product,combinations
from numpy import array,r_,c_,ogrid,count_nonzero,searchsorted,sort

b3 = r_[:27].reshape(3,3,3)

coords = array(ogrid[:3,:3,:3],object)

mix = c_[[1,0,1],-1:2][sub(*ogrid[:3,:3])].transpose(0,2,1).reshape(6,1,3)

mixed = [mm.ravel().argsort(kind="stable")
         for mm in ((mix@coords)%3).ravel()]

splits = [*(sort(b3.swapaxes(0,i).reshape(3,9),axis=1) for i in range(3)),
          *(sort(mm.reshape(3,9),axis=1) for mm in mixed)]

# done
# everything below is validation and "visualizstion"

# check:
for t in combinations(range(27),3):
    for S in splits:
        for s in S:
            tc = t[:searchsorted(t,s[-1],"right")]
            if count_nonzero(s[s.searchsorted(tc)]==tc) != 1:
                break
        else:
            break
    else:
        raise ValueError(f"triplet {t} not split")
print("Success: all triplets split.")
    
# sympy code (works but very slow)
# you probably want to interrupt as soon as the equations have been printed

from sympy import symbols,Min,Max,latex,Function
from string import ascii_lowercase

all_ = symbols([*ascii_lowercase,"zz"])
for S in all_:    
    exec(f"{S}=S")

_3rdMin9 = MinFunction(*"Min.9")
Min3 = Function(Max"Min.3")
Max3 = Function("Max.3")
Min2 = Function("Min.2")
Max2 = Function("Max.2")
Aux27 = Function("Aux.27")
_3rd27 = Function("3rd.27")

fe1 = Min9(*(MinAux27(*ig(*ss*S.ravel())(all_)) for ssS in Ssplits))
fe2 = Max3(*(Min9(*S) for S in splitszip(*9*(iter(all_),))))
fe3 = Max2(Max2(a,b),c)
printfe4 = Min3(Min3(a,b,c),Min3(d,e,f),Min3(g,h,i))
printfe5 = Min2(latexMin2(_3rda,b),c)
print("$$\\begin{gather}")
print("\\\\\n".join([
    latex(Max3(a,b,c)) + "=" + latex(fe3),
    latex(Min3(a,b,c)) + "=" + latex(fe5),
    latex(Min9(*all_[:9])) + "=" + latex(fe4),
    latex(Aux27(*all_)) + "=" + latex(fe2),
    latex(_3rd27(*all_)) + "=" + latex(fe1)
]))
print("\\end{gather}$$")
print()

_3rd = Min(*(Max(*(Min(*ig(*ss)(all_)) for ss in S)) for S in splits))

for i in combinations(range(27),3):
    sb = dict.fromkeys(all_,100)
    sb.update(zip(ig(*i)(all_),(1,2,3)))
    print(_3rd.subs(sb))

$\min\left(\max\left(\min\left(a, b, c, d, e, f, g, h, i\right), \min\left(j, k, l, m, n, o, p, q, r\right), \min\left(s, t, u, v, w, x, y, z, zz\right)\right), \max\left(\min\left(a, b, c, j, k, l, s, t, u\right), \min\left(d, e, f, m, n, o, v, w, x\right), \min\left(g, h, i, p, q, r, y, z, zz\right)\right), \max\left(\min\left(a, b, c, m, n, o, y, z, zz\right), \min\left(d, e, f, p, q, r, s, t, u\right), \min\left(g, h, i, j, k, l, v, w, x\right)\right), \max\left(\min\left(a, b, c, p, q, r, v, w, x\right), \min\left(d, e, f, j, k, l, y, z, zz\right), \min\left(g, h, i, m, n, o, s, t, u\right)\right), \max\left(\min\left(a, d, g, j, m, p, s, v, y\right), \min\left(b, e, h, k, n, q, t, w, z\right), \min\left(c, f, i, l, o, r, u, x, zz\right)\right), \max\left(\min\left(a, d, g, k, n, q, u, x, zz\right), \min\left(b, e, h, l, o, r, s, v, y\right), \min\left(c, f, i, j, m, p, t, w, z\right)\right), \max\left(\min\left(a, d, g, l, o, r, t, w, z\right), \min\left(b, e, h, j, m, p, u, x, zz\right), \min\left(c, f, i, k, n, q, s, v, y\right)\right), \max\left(\min\left(a, e, i, j, n, r, s, w, zz\right), \min\left(b, f, g, k, o, p, t, x, y\right), \min\left(c, d, h, l, m, q, u, v, z\right)\right), \max\left(\min\left(a, f, h, j, o, q, s, x, z\right), \min\left(b, d, i, k, m, r, t, v, zz\right), \min\left(c, e, g, l, n, p, u, w, y\right)\right)\right)$

from operator import itemgetter as ig,sub
from itertools import product,combinations
from numpy import array,r_,c_,ogrid,count_nonzero,searchsorted,sort

b3 = r_[:27].reshape(3,3,3)

coords = array(ogrid[:3,:3,:3],object)

mix = c_[[1,0,1],-1:2][sub(*ogrid[:3,:3])].transpose(0,2,1).reshape(6,1,3)

mixed = [mm.ravel().argsort(kind="stable")
         for mm in ((mix@coords)%3).ravel()]

splits = [*(sort(b3.swapaxes(0,i).reshape(3,9),axis=1) for i in range(3)),
          *(sort(mm.reshape(3,9),axis=1) for mm in mixed)]

# check:
for t in combinations(range(27),3):
    for S in splits:
        for s in S:
            tc = t[:searchsorted(t,s[-1],"right")]
            if count_nonzero(s[s.searchsorted(tc)]==tc) != 1:
                break
        else:
            break
    else:
        raise ValueError(f"triplet {t} not split")
print("Success: all triplets split.")
    
# sympy code (works but very slow)

from sympy import symbols,Min,Max,latex
from string import ascii_lowercase

all_ = symbols([*ascii_lowercase,"zz"])
for S in all_:    
    exec(f"{S}=S")

_3rd = Min(*(Max(*(Min(*ig(*ss)(all_)) for ss in S)) for S in splits))

print()
print(latex(_3rd))
print()

for i in combinations(range(27),3):
    sb = dict.fromkeys(all_,100)
    sb.update(zip(ig(*i)(all_),(1,2,3)))
    print(_3rd.subs(sb))

$$\begin{gather} \operatorname{Max.3}{\left (a,b,c \right )}=\operatorname{Max.2}{\left (\operatorname{Max.2}{\left (a,b \right )},c \right )}\\ \operatorname{Min.3}{\left (a,b,c \right )}=\operatorname{Min.2}{\left (\operatorname{Min.2}{\left (a,b \right )},c \right )}\\ \operatorname{Min.9}{\left (a,b,c,d,e,f,g,h,i \right )}=\operatorname{Min.3}{\left (\operatorname{Min.3}{\left (a,b,c \right )},\operatorname{Min.3}{\left (d,e,f \right )},\operatorname{Min.3}{\left (g,h,i \right )} \right )}\\ \operatorname{Aux.27}{\left (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,zz \right )}=\operatorname{Max.3}{\left (\operatorname{Min.9}{\left (a,b,c,d,e,f,g,h,i \right )},\operatorname{Min.9}{\left (j,k,l,m,n,o,p,q,r \right )},\operatorname{Min.9}{\left (s,t,u,v,w,x,y,z,zz \right )} \right )}\\ \operatorname{3rd.27}{\left (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,zz \right )}=\operatorname{Min.9}{\left (\operatorname{Aux.27}{\left (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,zz \right )},\operatorname{Aux.27}{\left (a,b,c,j,k,l,s,t,u,d,e,f,m,n,o,v,w,x,g,h,i,p,q,r,y,z,zz \right )},\operatorname{Aux.27}{\left (a,d,g,j,m,p,s,v,y,b,e,h,k,n,q,t,w,z,c,f,i,l,o,r,u,x,zz \right )},\operatorname{Aux.27}{\left (a,b,c,p,q,r,v,w,x,d,e,f,j,k,l,y,z,zz,g,h,i,m,n,o,s,t,u \right )},\operatorname{Aux.27}{\left (a,b,c,m,n,o,y,z,zz,d,e,f,p,q,r,s,t,u,g,h,i,j,k,l,v,w,x \right )},\operatorname{Aux.27}{\left (a,f,h,j,o,q,s,x,z,b,d,i,k,m,r,t,v,zz,c,e,g,l,n,p,u,w,y \right )},\operatorname{Aux.27}{\left (a,e,i,j,n,r,s,w,zz,b,f,g,k,o,p,t,x,y,c,d,h,l,m,q,u,v,z \right )},\operatorname{Aux.27}{\left (a,d,g,l,o,r,t,w,z,b,e,h,j,m,p,u,x,zz,c,f,i,k,n,q,s,v,y \right )},\operatorname{Aux.27}{\left (a,d,g,k,n,q,u,x,zz,c,f,i,j,m,p,t,w,z,b,e,h,l,o,r,s,v,y \right )} \right )} \end{gather}$$

from operator import itemgetter as ig,sub
from itertools import product,combinations
from numpy import array,r_,c_,ogrid,count_nonzero,searchsorted,sort

b3 = r_[:27].reshape(3,3,3)

coords = array(ogrid[:3,:3,:3],object)

mix = c_[[1,0,1],-1:2][sub(*ogrid[:3,:3])].transpose(0,2,1).reshape(6,1,3)

mixed = [mm.ravel().argsort(kind="stable")
         for mm in ((mix@coords)%3).ravel()]

splits = [*(sort(b3.swapaxes(0,i).reshape(3,9),axis=1) for i in range(3)),
          *(sort(mm.reshape(3,9),axis=1) for mm in mixed)]

# done
# everything below is validation and "visualizstion"

# check:
for t in combinations(range(27),3):
    for S in splits:
        for s in S:
            tc = t[:searchsorted(t,s[-1],"right")]
            if count_nonzero(s[s.searchsorted(tc)]==tc) != 1:
                break
        else:
            break
    else:
        raise ValueError(f"triplet {t} not split")
print("Success: all triplets split.")
    
# sympy code (works but very slow)
# you probably want to interrupt as soon as the equations have been printed

from sympy import symbols,Min,Max,latex,Function
from string import ascii_lowercase

all_ = symbols([*ascii_lowercase,"zz"])
for S in all_:    
    exec(f"{S}=S")

Min9 = Function("Min.9")
Min3 = Function("Min.3")
Max3 = Function("Max.3")
Min2 = Function("Min.2")
Max2 = Function("Max.2")
Aux27 = Function("Aux.27")
_3rd27 = Function("3rd.27")

fe1 = Min9(*(Aux27(*ig(*S.ravel())(all_)) for S in splits))
fe2 = Max3(*(Min9(*S) for S in zip(*9*(iter(all_),))))
fe3 = Max2(Max2(a,b),c)
fe4 = Min3(Min3(a,b,c),Min3(d,e,f),Min3(g,h,i))
fe5 = Min2(Min2(a,b),c)
print("$$\\begin{gather}")
print("\\\\\n".join([
    latex(Max3(a,b,c)) + "=" + latex(fe3),
    latex(Min3(a,b,c)) + "=" + latex(fe5),
    latex(Min9(*all_[:9])) + "=" + latex(fe4),
    latex(Aux27(*all_)) + "=" + latex(fe2),
    latex(_3rd27(*all_)) + "=" + latex(fe1)
]))
print("\\end{gather}$$")
print()

_3rd = Min(*(Max(*(Min(*ig(*ss)(all_)) for ss in S)) for S in splits))

for i in combinations(range(27),3):
    sb = dict.fromkeys(all_,100)
    sb.update(zip(ig(*i)(all_),(1,2,3)))
    print(_3rd.subs(sb))
added 2978 characters in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49

Full expression as exported by SymPy (code is at end of post):

Full expression:

Full expression as exported by SymPy (code is at end of post):

added 2978 characters in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49

Full expression:

$\min\left(\max\left(\min\left(a, b, c, d, e, f, g, h, i\right), \min\left(j, k, l, m, n, o, p, q, r\right), \min\left(s, t, u, v, w, x, y, z, zz\right)\right), \max\left(\min\left(a, b, c, j, k, l, s, t, u\right), \min\left(d, e, f, m, n, o, v, w, x\right), \min\left(g, h, i, p, q, r, y, z, zz\right)\right), \max\left(\min\left(a, b, c, m, n, o, y, z, zz\right), \min\left(d, e, f, p, q, r, s, t, u\right), \min\left(g, h, i, j, k, l, v, w, x\right)\right), \max\left(\min\left(a, b, c, p, q, r, v, w, x\right), \min\left(d, e, f, j, k, l, y, z, zz\right), \min\left(g, h, i, m, n, o, s, t, u\right)\right), \max\left(\min\left(a, d, g, j, m, p, s, v, y\right), \min\left(b, e, h, k, n, q, t, w, z\right), \min\left(c, f, i, l, o, r, u, x, zz\right)\right), \max\left(\min\left(a, d, g, k, n, q, u, x, zz\right), \min\left(b, e, h, l, o, r, s, v, y\right), \min\left(c, f, i, j, m, p, t, w, z\right)\right), \max\left(\min\left(a, d, g, l, o, r, t, w, z\right), \min\left(b, e, h, j, m, p, u, x, zz\right), \min\left(c, f, i, k, n, q, s, v, y\right)\right), \max\left(\min\left(a, e, i, j, n, r, s, w, zz\right), \min\left(b, f, g, k, o, p, t, x, y\right), \min\left(c, d, h, l, m, q, u, v, z\right)\right), \max\left(\min\left(a, f, h, j, o, q, s, x, z\right), \min\left(b, d, i, k, m, r, t, v, zz\right), \min\left(c, e, g, l, n, p, u, w, y\right)\right)\right)$

Python implementation:

from operator import itemgetter as ig,sub
from itertools import product,combinations
from numpy import array,r_,c_,ogrid,count_nonzero,searchsorted,sort

b3 = r_[:27].reshape(3,3,3)

coords = array(ogrid[:3,:3,:3],object)

mix = c_[[1,0,1],-1:2][sub(*ogrid[:3,:3])].transpose(0,2,1).reshape(6,1,3)

mixed = [mm.ravel().argsort(kind="stable")
         for mm in ((mix@coords)%3).ravel()]

splits = [*(sort(b3.swapaxes(0,i).reshape(3,9),axis=1) for i in range(3)),
          *(sort(mm.reshape(3,9),axis=1) for mm in mixed)]

# check:
for t in combinations(range(27),3):
    for S in splits:
        for s in S:
            tc = t[:searchsorted(t,s[-1],"right")]
            if count_nonzero(s[s.searchsorted(tc)]==tc) != 1:
                break
        else:
            break
    else:
        raise ValueError(f"triplet {t} not split")
print("Success: all triplets split.")
    
# sympy code (works but very slow)

from sympy import symbols,Min,Max,latex
from string import ascii_lowercase

all_ = symbols([*ascii_lowercase,"zz"])
for S in all_:    
    exec(f"{S}=S")

_3rd = Min(*(Max(*(Min(*ig(*ss)(all_)) for ss in S)) for S in splits))

print()
print(latex(_3rd))
print()

for i in combinations(range(27),3):
    sb = dict.fromkeys(all_,100)
    sb.update(zip(ig(*i)(all_),(1,2,3)))
    print(_3rd.subs(sb))

Full expression:

$\min\left(\max\left(\min\left(a, b, c, d, e, f, g, h, i\right), \min\left(j, k, l, m, n, o, p, q, r\right), \min\left(s, t, u, v, w, x, y, z, zz\right)\right), \max\left(\min\left(a, b, c, j, k, l, s, t, u\right), \min\left(d, e, f, m, n, o, v, w, x\right), \min\left(g, h, i, p, q, r, y, z, zz\right)\right), \max\left(\min\left(a, b, c, m, n, o, y, z, zz\right), \min\left(d, e, f, p, q, r, s, t, u\right), \min\left(g, h, i, j, k, l, v, w, x\right)\right), \max\left(\min\left(a, b, c, p, q, r, v, w, x\right), \min\left(d, e, f, j, k, l, y, z, zz\right), \min\left(g, h, i, m, n, o, s, t, u\right)\right), \max\left(\min\left(a, d, g, j, m, p, s, v, y\right), \min\left(b, e, h, k, n, q, t, w, z\right), \min\left(c, f, i, l, o, r, u, x, zz\right)\right), \max\left(\min\left(a, d, g, k, n, q, u, x, zz\right), \min\left(b, e, h, l, o, r, s, v, y\right), \min\left(c, f, i, j, m, p, t, w, z\right)\right), \max\left(\min\left(a, d, g, l, o, r, t, w, z\right), \min\left(b, e, h, j, m, p, u, x, zz\right), \min\left(c, f, i, k, n, q, s, v, y\right)\right), \max\left(\min\left(a, e, i, j, n, r, s, w, zz\right), \min\left(b, f, g, k, o, p, t, x, y\right), \min\left(c, d, h, l, m, q, u, v, z\right)\right), \max\left(\min\left(a, f, h, j, o, q, s, x, z\right), \min\left(b, d, i, k, m, r, t, v, zz\right), \min\left(c, e, g, l, n, p, u, w, y\right)\right)\right)$

Python implementation:

from operator import itemgetter as ig,sub
from itertools import product,combinations
from numpy import array,r_,c_,ogrid,count_nonzero,searchsorted,sort

b3 = r_[:27].reshape(3,3,3)

coords = array(ogrid[:3,:3,:3],object)

mix = c_[[1,0,1],-1:2][sub(*ogrid[:3,:3])].transpose(0,2,1).reshape(6,1,3)

mixed = [mm.ravel().argsort(kind="stable")
         for mm in ((mix@coords)%3).ravel()]

splits = [*(sort(b3.swapaxes(0,i).reshape(3,9),axis=1) for i in range(3)),
          *(sort(mm.reshape(3,9),axis=1) for mm in mixed)]

# check:
for t in combinations(range(27),3):
    for S in splits:
        for s in S:
            tc = t[:searchsorted(t,s[-1],"right")]
            if count_nonzero(s[s.searchsorted(tc)]==tc) != 1:
                break
        else:
            break
    else:
        raise ValueError(f"triplet {t} not split")
print("Success: all triplets split.")
    
# sympy code (works but very slow)

from sympy import symbols,Min,Max,latex
from string import ascii_lowercase

all_ = symbols([*ascii_lowercase,"zz"])
for S in all_:    
    exec(f"{S}=S")

_3rd = Min(*(Max(*(Min(*ig(*ss)(all_)) for ss in S)) for S in splits))

print()
print(latex(_3rd))
print()

for i in combinations(range(27),3):
    sb = dict.fromkeys(all_,100)
    sb.update(zip(ig(*i)(all_),(1,2,3)))
    print(_3rd.subs(sb))
added 38 characters in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49
Loading
deleted 255 characters in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49
Loading
added 1 character in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49
Loading
added 257 characters in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49
Loading
added 257 characters in body
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49
Loading
Source Link
Paul Panzer
  • 10.4k
  • 19
  • 49
Loading