#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define pii pair<int,int>
#define pll pair<long long , long long>
#define vi vector<int>
#define vpii vector<pii>
#define SZ(x) ((int)(x.size()))
#define fi first
#define se second
#define IN(x,y) ((y).find((x))!=(y).end())
#define ALL(t) t.begin(),t.end()
#define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++)
#define REP(i,a,b) for(int (i)=(a);(i)<=(b);++i)
#define REPD(i,a,b) for(int (i)=(a); (i)>=(b);--i)
#define FOR(i, n) for (int (i) = 0; (i) < (n); ++(i))
#define dem(x) __builtin_popcount(x)
#define Mask(x) (1LL << (x))
#define BIT(x, i) ((x) >> (i) & 1)
#define ln '\n'
#define io_faster ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
///mt19937 rnd(time(0));
const int INF = 1e9 , mod = 1e9 + 7;
template <class T1, class T2>
inline T1 mul(T1& x, const T2 &k){ return x = (1LL * x * k) % mod; }
template <class T1 , class T2>
inline T1 pw(T1 x, T2 k){T1 res = 1; for (; k ; k >>= 1){ if (k & 1) mul(res, x); mul(x, x); } return res;}
template <class T>
inline bool minimize(T &x, const T &y){ if (x > y){x = y; return 1;} return 0; }
template <class T>
inline bool maximize(T &x, const T &y){ if (x < y){x = y; return 1;} return 0; }
template <class T>
inline void add(T &x , const T &y){ if ((x += y) >= mod) x -= mod; }
template <class T>
inline T product (const T &x , const T &y) { return 1LL * x * y % mod; }
#define PROB "formation"
void file(){
if(fopen(PROB".inp", "r")){
freopen(PROB".inp","r",stdin);
freopen(PROB".out","w",stdout);
}
}
void sinh_(){
// srand(time(0));
// freopen(PROB".inp" , "w" , stdout);
// int n;
}
typedef long long ll;
typedef double db;
const int N = 2e3 + 5;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, +1};
const int maxn = 2e3;
int n, m, k;
bool a[N][N], b[N][N];
int dist[N][N] = {}, d[N][N];
ll ans[N][N] = {}, Ans[N][N];
ll res = 0;
int pre_cnt[N*2][N*2] = {};
pair<ll, int> t[N][N] = {}, r[N][N] = {}, diagon[N * 2];
void readip(){
cin >> n >> m >> k;
REP(i, 1, n) REP(j, 1, m) cin >> a[i][j];
}
int cal(int x, int y, int xx, int yy) {
maximize(x, 1 - m);
minimize(xx, n - 1);
maximize(y, 2);
minimize(yy, n + m);
return pre_cnt[xx + maxn][yy]
+ pre_cnt[x - 1 + maxn][y - 1]
- pre_cnt[x - 1 + maxn][yy]
- pre_cnt[xx + maxn][y - 1];
}
void sub5() {
vector<vi> dist(n + 2, vi(m + 2, -1));
queue<pii> q;
REP(i, 1, n) REP(j, 1, m) if (a[i][j]) {
dist[i][j] = 0;
q.push(mp(i, j));
}
while(!q.empty()) {
int x = q.front().fi;
int y = q.front().se;
q.pop();
FOR(i, 4) {
int nx = x + dx[i], ny = y + dy[i];
if (nx < 0 || nx > n || ny < 0 || ny > m || dist[nx][ny] != -1) continue;
dist[nx][ny] = dist[x][y] + 1;
q.push(mp(nx, ny));
}
}
ll res = 0;
REP(i, 1, n) REP(j, 1, m) res += dist[i][j];
cout << res << ln;
}
void prepare() {
REP(i, 1, n) REP(j, 1, m) if (a[i][j])
pre_cnt[i - j + maxn][i + j] += 1;
REP(i, 1 - m + maxn, n - 1 + maxn) REP(j, 2, n + m)
pre_cnt[i][j] += pre_cnt[i - 1][j] + pre_cnt[i][j - 1] - pre_cnt[i - 1][j - 1];
memset(dist, -1, sizeof dist);
REP(d, 0, n + m) {
int tmp = cal(1 - 1 - d , 1 + 1 - d, 1 - 1 + d, 1 + 1 + d);
if (tmp >= k) {
dist[1][1] = d;
res -= 1LL * (tmp - k) * d;
break;
}
}
assert(dist[1][1] != -1);
REP(i, 1, n) REP(j, 1, m) {
if (i == 1 && j == 1) continue;
int D = (j == 1) ? dist[i - 1][j] : dist[i][j - 1];
REP(d, D - 1, D + 1) {
int tmp = cal(i - j - d, i + j - d, i - j + d, i + j + d);
if (tmp >= k) {
dist[i][j] = d;
res -= 1LL * (tmp - k) * d;
break;
}
}
assert(dist[i][j] != -1);
}
}
void xoay() { // i j -> j, n - i + 1
REP(i, 1, n) REP(j, 1, m) {
b[j][n - i + 1] = a[i][j];
d[j][n - i + 1] = dist[i][j];
Ans[j][n - i + 1] = ans[i][j];
}
swap(n, m);
REP(i, 1, n) REP(j, 1, m) {
a[i][j] = b[i][j];
dist[i][j] = d[i][j];
ans[i][j] = Ans[i][j];
}
}
void solve(){
if (k == 1) {
sub5();
return;
}
prepare();
FOR(dir, 4) {
REP(i, 0, n + m) diagon[i] = mp(0LL, 0);
REP(i, 0, n + 1) REP(j, 0, m + 1) t[i][j] = mp(0, 0), r[i][j] = mp(0, 0);
REP(i, 1, n) REPD(j, m, 1) {
t[i][j].fi = (a[i][j] ? i + j : 0) + t[i - 1][j].fi + t[i - 1][j + 1].fi - (i <= 2 ? 0 : t[i - 2][j + 1].fi);
t[i][j].se = (a[i][j] ? 1 : 0) + t[i - 1][j].se + t[i - 1][j + 1].se - (i <= 2 ? 0 : t[i - 2][j + 1].se);
r[i][j].fi = (a[i][j] ? i + j : 0) + r[i - 1][j].fi + r[i][j + 1].fi - r[i - 1][j + 1].fi;
r[i][j].se = (a[i][j] ? 1 : 0) + r[i - 1][j].se + r[i][j + 1].se - r[i - 1][j + 1].se;
diagon[i + j].fi += (a[i][j] ? i + j : 0);
diagon[i + j].se += (a[i][j] ? 1 : 0);
}
REP(i, 2, n + m) {
diagon[i].fi += diagon[i - 1].fi;
diagon[i].se += diagon[i - 1].se;
}
REP(i, 1, n) REP(j, 1, m) {
ll sum = t[min(n, i + dist[i][j])][j].fi - r[i - 1][j].fi;
int cnt = t[min(n, i + dist[i][j])][j].se - r[i - 1][j].se;
if (j + dist[i][j] + 1 <= m) {
sum -= t[i - 1][j + dist[i][j] + 1].fi;
sum += r[i - 1][j + dist[i][j] + 1].fi;
cnt -= t[i - 1][j + dist[i][j] + 1].se;
cnt += r[i - 1][j + dist[i][j] + 1].se;
}
if (i + dist[i][j] > n) {
int l = n + j + 1, r = min(n + m, i + j + dist[i][j]);
if (l <= r) {
sum += diagon[r].fi - diagon[l - 1].fi;
cnt += diagon[r].se - diagon[l - 1].se;
}
}
ans[i][j] += sum - 1LL * (i + j) * cnt;
}
xoay();
}
REP(i, 1, m) r[0][i] = mp(0, 0);
REP(i, 1, n) REP(j, 1, m) {
r[i][j].fi = r[i - 1][j].fi + (a[i][j] ? i : 0);
r[i][j].se = r[i - 1][j].se + (a[i][j] ? 1 : 0);
}
REP(i, 1, n) REP(j, 1, m) {
int L = max(1, i - dist[i][j]), R = i - 1;
if (L <= R) {
ll sum = r[R][j].fi - r[L - 1][j].fi;
int cnt = r[R][j].se - r[L - 1][j].se;
ans[i][j] -= 1LL * i * cnt - sum;
}
L = i + 1, R = min(n, i + dist[i][j]);
if (L <= R) {
ll sum = r[R][j].fi - r[L - 1][j].fi;
int cnt = r[R][j].se - r[L - 1][j].se;
ans[i][j] -= sum - 1LL * i * cnt;
}
}
REP(i, 1, n) r[i][0] = mp(0, 0);
REP(i, 1, n) REP(j, 1, m) {
r[i][j].fi = r[i][j - 1].fi + (a[i][j] ? j : 0);
r[i][j].se = r[i][j - 1].se + (a[i][j] ? 1 : 0);
}
REP(i, 1, n) REP(j, 1, m) {
int L = max(1, j - dist[i][j]), R = j - 1;
if (L <= R) {
ll sum = r[i][R].fi - r[i][L - 1].fi;
int cnt = r[i][R].se - r[i][L - 1].se;
ans[i][j] -= 1LL * j * cnt - sum;
}
L = j + 1, R = min(m, j + dist[i][j]);
if (L <= R) {
ll sum = r[i][R].fi - r[i][L - 1].fi;
int cnt = r[i][R].se - r[i][L - 1].se;
ans[i][j] -= sum - 1LL * j * cnt;
}
}
REP(i, 1, n) REP(j, 1, m) res += ans[i][j];
cout << res << ln;
}
int main(){
sinh_();
io_faster
file();
int t = 1;
// cin >> t;
while (t--){
readip();
solve();
}
}
CiNpbmNsdWRlIDxjYXNzZXJ0PgojaW5jbHVkZSA8Y2N0eXBlPgojaW5jbHVkZSA8Y2Vycm5vPgojaW5jbHVkZSA8Y2Zsb2F0PgojaW5jbHVkZSA8Y2lzbzY0Nj4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxjbG9jYWxlPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjc2V0am1wPgojaW5jbHVkZSA8Y3NpZ25hbD4KI2luY2x1ZGUgPGNzdGRhcmc+CiNpbmNsdWRlIDxjc3RkZGVmPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjdGltZT4KI2luY2x1ZGUgPGNjb21wbGV4PgojaW5jbHVkZSA8Y2ZlbnY+CiNpbmNsdWRlIDxjaW50dHlwZXM+CiNpbmNsdWRlIDxjc3RkYm9vbD4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxjdGdtYXRoPgojaW5jbHVkZSA8Y3djaGFyPgojaW5jbHVkZSA8Y3djdHlwZT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGJpdHNldD4KI2luY2x1ZGUgPGNvbXBsZXg+CiNpbmNsdWRlIDxkZXF1ZT4KI2luY2x1ZGUgPGV4Y2VwdGlvbj4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGlvcz4KI2luY2x1ZGUgPGlvc2Z3ZD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXN0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGxvY2FsZT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPG5ldz4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxzdGRleGNlcHQ+CiNpbmNsdWRlIDxzdHJlYW1idWY+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx2YWxhcnJheT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8YXRvbWljPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgojaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgojaW5jbHVkZSA8ZnV0dXJlPgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPG11dGV4PgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8cmF0aW8+CiNpbmNsdWRlIDxyZWdleD4KI2luY2x1ZGUgPHNjb3BlZF9hbGxvY2F0b3I+CiNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CiNpbmNsdWRlIDx0aHJlYWQ+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPHR5cGVpbmRleD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGViIGVtcGxhY2VfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBpaSBwYWlyPGludCxpbnQ+CiNkZWZpbmUgcGxsIHBhaXI8bG9uZyBsb25nICwgbG9uZyBsb25nPgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdnBpaSB2ZWN0b3I8cGlpPgojZGVmaW5lIFNaKHgpICgoaW50KSh4LnNpemUoKSkpCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBJTih4LHkpICgoeSkuZmluZCgoeCkpIT0oeSkuZW5kKCkpCiNkZWZpbmUgQUxMKHQpIHQuYmVnaW4oKSx0LmVuZCgpCiNkZWZpbmUgRk9SRUFDSChpLHQpIGZvciAodHlwZW9mKHQuYmVnaW4oKSkgaT10LmJlZ2luKCk7IGkhPXQuZW5kKCk7IGkrKykKI2RlZmluZSBSRVAoaSxhLGIpIGZvcihpbnQgKGkpPShhKTsoaSk8PShiKTsrK2kpCiNkZWZpbmUgUkVQRChpLGEsYikgZm9yKGludCAoaSk9KGEpOyAoaSk+PShiKTstLWkpCiNkZWZpbmUgRk9SKGksIG4pIGZvciAoaW50IChpKSA9IDA7IChpKSA8IChuKTsgKysoaSkpCiNkZWZpbmUgZGVtKHgpIF9fYnVpbHRpbl9wb3Bjb3VudCh4KQojZGVmaW5lIE1hc2soeCkgKDFMTCA8PCAoeCkpCiNkZWZpbmUgQklUKHgsIGkpICgoeCkgPj4gKGkpICYgMSkKI2RlZmluZSBsbiAnXG4nCiNkZWZpbmUgaW9fZmFzdGVyIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoMCk7Y291dC50aWUoMCk7Ci8vL210MTk5Mzcgcm5kKHRpbWUoMCkpOwoKY29uc3QgaW50IElORiA9IDFlOSAsIG1vZCA9IDFlOSArIDc7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgppbmxpbmUgVDEgbXVsKFQxJiB4LCBjb25zdCBUMiAmayl7IHJldHVybiB4ID0gKDFMTCAqIHggKiBrKSAlIG1vZDsgfQoKdGVtcGxhdGUgPGNsYXNzIFQxICwgY2xhc3MgVDI+CmlubGluZSBUMSBwdyhUMSB4LCBUMiBrKXtUMSByZXMgPSAxOyBmb3IgKDsgayA7IGsgPj49IDEpeyBpZiAoayAmIDEpIG11bChyZXMsIHgpOyBtdWwoeCwgeCk7IH0gcmV0dXJuIHJlczt9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lIGJvb2wgbWluaW1pemUoVCAmeCwgY29uc3QgVCAmeSl7IGlmICh4ID4geSl7eCA9IHk7IHJldHVybiAxO30gcmV0dXJuIDA7IH0KCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUgYm9vbCBtYXhpbWl6ZShUICZ4LCBjb25zdCBUICZ5KXsgaWYgKHggPCB5KXt4ID0geTsgcmV0dXJuIDE7fSByZXR1cm4gMDsgfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSB2b2lkIGFkZChUICZ4ICwgY29uc3QgVCAmeSl7IGlmICgoeCArPSB5KSA+PSBtb2QpIHggLT0gbW9kOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lIFQgcHJvZHVjdCAoY29uc3QgVCAmeCAsIGNvbnN0IFQgJnkpIHsgcmV0dXJuIDFMTCAqIHggKiB5ICUgbW9kOyB9CgojZGVmaW5lIFBST0IgImZvcm1hdGlvbiIKdm9pZCBmaWxlKCl7CiAgICBpZihmb3BlbihQUk9CIi5pbnAiLCAiciIpKXsKICAgICAgICBmcmVvcGVuKFBST0IiLmlucCIsInIiLHN0ZGluKTsKICAgICAgICBmcmVvcGVuKFBST0IiLm91dCIsInciLHN0ZG91dCk7CiAgICB9Cn0Kdm9pZCBzaW5oXygpewovLyAgICBzcmFuZCh0aW1lKDApKTsKLy8gICAgZnJlb3BlbihQUk9CIi5pbnAiICwgInciICwgc3Rkb3V0KTsKLy8gICAgaW50IG47Cn0KCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGRvdWJsZSBkYjsKY29uc3QgaW50IE4gPSAyZTMgKyA1Owpjb25zdCBpbnQgZHhbXSA9IHstMSwgMSwgMCwgMH07CmNvbnN0IGludCBkeVtdID0gezAsIDAsIC0xLCArMX07CmNvbnN0IGludCBtYXhuID0gMmUzOwoKaW50IG4sIG0sIGs7CmJvb2wgYVtOXVtOXSwgYltOXVtOXTsKaW50IGRpc3RbTl1bTl0gPSB7fSwgZFtOXVtOXTsKbGwgYW5zW05dW05dID0ge30sIEFuc1tOXVtOXTsKbGwgcmVzID0gMDsKaW50IHByZV9jbnRbTioyXVtOKjJdID0ge307CnBhaXI8bGwsIGludD4gdFtOXVtOXSA9IHt9LCByW05dW05dID0ge30sIGRpYWdvbltOICogMl07Cgp2b2lkIHJlYWRpcCgpewogICAgY2luID4+IG4gPj4gbSA+PiBrOwogICAgUkVQKGksIDEsIG4pIFJFUChqLCAxLCBtKSBjaW4gPj4gYVtpXVtqXTsKfQoKaW50IGNhbChpbnQgeCwgaW50IHksIGludCB4eCwgaW50IHl5KSB7CiAgICBtYXhpbWl6ZSh4LCAxIC0gbSk7CiAgICBtaW5pbWl6ZSh4eCwgbiAtIDEpOwogICAgbWF4aW1pemUoeSwgMik7CiAgICBtaW5pbWl6ZSh5eSwgbiArIG0pOwogICAgcmV0dXJuIHByZV9jbnRbeHggKyBtYXhuXVt5eV0gCgogICAgICAgICsgcHJlX2NudFt4IC0gMSArIG1heG5dW3kgLSAxXSAKICAgICAgICAtIHByZV9jbnRbeCAtIDEgKyBtYXhuXVt5eV0gCiAgICAgICAgLSBwcmVfY250W3h4ICsgbWF4bl1beSAtIDFdOwp9Cgp2b2lkIHN1YjUoKSB7CiAgICB2ZWN0b3I8dmk+IGRpc3QobiArIDIsIHZpKG0gKyAyLCAtMSkpOwogICAgcXVldWU8cGlpPiBxOwogICAgUkVQKGksIDEsIG4pIFJFUChqLCAxLCBtKSBpZiAoYVtpXVtqXSkgewogICAgICAgIGRpc3RbaV1bal0gPSAwOwogICAgICAgIHEucHVzaChtcChpLCBqKSk7CiAgICB9CiAgICB3aGlsZSghcS5lbXB0eSgpKSB7CiAgICAgICAgaW50IHggPSBxLmZyb250KCkuZmk7CiAgICAgICAgaW50IHkgPSBxLmZyb250KCkuc2U7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICBGT1IoaSwgNCkgewogICAgICAgICAgICBpbnQgbnggPSB4ICsgZHhbaV0sIG55ID0geSArIGR5W2ldOwogICAgICAgICAgICBpZiAobnggPCAwIHx8IG54ID4gbiB8fCBueSA8IDAgfHwgbnkgPiBtIHx8IGRpc3RbbnhdW255XSAhPSAtMSkgY29udGludWU7CiAgICAgICAgICAgIGRpc3RbbnhdW255XSA9IGRpc3RbeF1beV0gKyAxOwogICAgICAgICAgICBxLnB1c2gobXAobngsIG55KSk7CiAgICAgICAgfQogICAgfQogICAgbGwgcmVzID0gMDsKICAgIFJFUChpLCAxLCBuKSBSRVAoaiwgMSwgbSkgcmVzICs9IGRpc3RbaV1bal07CiAgICBjb3V0IDw8IHJlcyA8PCBsbjsKfQoKCnZvaWQgcHJlcGFyZSgpIHsKICAgIFJFUChpLCAxLCBuKSBSRVAoaiwgMSwgbSkgaWYgKGFbaV1bal0pIAogICAgICAgIHByZV9jbnRbaSAtIGogKyBtYXhuXVtpICsgal0gKz0gMTsKCiAgICBSRVAoaSwgMSAtIG0gKyBtYXhuLCBuIC0gMSArIG1heG4pICBSRVAoaiwgMiwgbiArIG0pIAogICAgICAgIHByZV9jbnRbaV1bal0gKz0gcHJlX2NudFtpIC0gMV1bal0gKyBwcmVfY250W2ldW2ogLSAxXSAtIHByZV9jbnRbaSAtIDFdW2ogLSAxXTsKCiAgICBtZW1zZXQoZGlzdCwgLTEsIHNpemVvZiBkaXN0KTsKICAgIFJFUChkLCAwLCBuICsgbSkgewogICAgICAgIGludCB0bXAgPSBjYWwoMSAtIDEgLSBkICwgMSArIDEgLSBkLCAxIC0gMSArIGQsIDEgKyAxICsgZCk7CiAgICAgICAgaWYgKHRtcCA+PSBrKSB7CiAgICAgICAgICAgIGRpc3RbMV1bMV0gPSBkOwogICAgICAgICAgICByZXMgLT0gMUxMICogKHRtcCAtIGspICogZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGFzc2VydChkaXN0WzFdWzFdICE9IC0xKTsKCiAgICBSRVAoaSwgMSwgbikgUkVQKGosIDEsIG0pIHsKICAgICAgICBpZiAoaSA9PSAxICYmIGogPT0gMSkgY29udGludWU7CiAgICAgICAgaW50IEQgPSAoaiA9PSAxKSA/IGRpc3RbaSAtIDFdW2pdIDogZGlzdFtpXVtqIC0gMV07CiAgICAgICAgUkVQKGQsIEQgLSAxLCBEICsgMSkgewogICAgICAgICAgICBpbnQgdG1wID0gY2FsKGkgLSBqIC0gZCwgaSArIGogLSBkLCBpIC0gaiArIGQsIGkgKyBqICsgZCk7CiAgICAgICAgICAgIGlmICh0bXAgPj0gaykgewogICAgICAgICAgICAgICAgZGlzdFtpXVtqXSA9IGQ7CiAgICAgICAgICAgICAgICByZXMgLT0gMUxMICogKHRtcCAtIGspICogZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFzc2VydChkaXN0W2ldW2pdICE9IC0xKTsKICAgIH0KfQoKdm9pZCB4b2F5KCkgeyAvLyBpIGogLT4gaiwgbiAtIGkgKyAxCiAgICBSRVAoaSwgMSwgbikgUkVQKGosIDEsIG0pIHsKICAgICAgICBiW2pdW24gLSBpICsgMV0gPSBhW2ldW2pdOwogICAgICAgIGRbal1bbiAtIGkgKyAxXSA9IGRpc3RbaV1bal07CiAgICAgICAgQW5zW2pdW24gLSBpICsgMV0gPSBhbnNbaV1bal07CiAgICB9CgogICAgc3dhcChuLCBtKTsKCiAgICBSRVAoaSwgMSwgbikgUkVQKGosIDEsIG0pIHsKICAgICAgICBhW2ldW2pdID0gYltpXVtqXTsKICAgICAgICBkaXN0W2ldW2pdID0gZFtpXVtqXTsKICAgICAgICBhbnNbaV1bal0gPSBBbnNbaV1bal07CiAgICB9Cn0KCnZvaWQgc29sdmUoKXsgIAogICAgaWYgKGsgPT0gMSkgewogICAgICAgIHN1YjUoKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcHJlcGFyZSgpOyAgCiAgICBGT1IoZGlyLCA0KSB7CiAgICAgICAgUkVQKGksIDAsIG4gKyBtKSBkaWFnb25baV0gPSBtcCgwTEwsIDApOwogICAgICAgIFJFUChpLCAwLCBuICsgMSkgUkVQKGosIDAsIG0gKyAxKSB0W2ldW2pdID0gbXAoMCwgMCksIHJbaV1bal0gPSBtcCgwLCAwKTsKCiAgICAgICAgUkVQKGksIDEsIG4pIFJFUEQoaiwgbSwgMSkgewogICAgICAgICAgICB0W2ldW2pdLmZpID0gKGFbaV1bal0gPyBpICsgaiA6IDApICsgdFtpIC0gMV1bal0uZmkgKyB0W2kgLSAxXVtqICsgMV0uZmkgLSAoaSA8PSAyID8gMCA6IHRbaSAtIDJdW2ogKyAxXS5maSk7CiAgICAgICAgICAgIHRbaV1bal0uc2UgPSAoYVtpXVtqXSA/IDEgOiAwKSAgICAgKyB0W2kgLSAxXVtqXS5zZSArIHRbaSAtIDFdW2ogKyAxXS5zZSAtIChpIDw9IDIgPyAwIDogdFtpIC0gMl1baiArIDFdLnNlKTsgICAKCiAgICAgICAgICAgIHJbaV1bal0uZmkgPSAoYVtpXVtqXSA/IGkgKyBqIDogMCkgKyByW2kgLSAxXVtqXS5maSArIHJbaV1baiArIDFdLmZpIC0gcltpIC0gMV1baiArIDFdLmZpOwogICAgICAgICAgICByW2ldW2pdLnNlID0gKGFbaV1bal0gPyAxIDogMCkgICAgICsgcltpIC0gMV1bal0uc2UgKyByW2ldW2ogKyAxXS5zZSAtIHJbaSAtIDFdW2ogKyAxXS5zZTsKCiAgICAgICAgICAgIGRpYWdvbltpICsgal0uZmkgKz0gKGFbaV1bal0gPyBpICsgaiA6IDApOwogICAgICAgICAgICBkaWFnb25baSArIGpdLnNlICs9IChhW2ldW2pdID8gMSA6IDApOwogICAgICAgIH0KCgoKICAgICAgICBSRVAoaSwgMiwgbiArIG0pIHsKICAgICAgICAgICAgZGlhZ29uW2ldLmZpICs9IGRpYWdvbltpIC0gMV0uZmk7CiAgICAgICAgICAgIGRpYWdvbltpXS5zZSArPSBkaWFnb25baSAtIDFdLnNlOwogICAgICAgIH0KCiAgICAgICAgUkVQKGksIDEsIG4pIFJFUChqLCAxLCBtKSB7CiAgICAgICAgICAgIGxsIHN1bSA9IHRbbWluKG4sIGkgKyBkaXN0W2ldW2pdKV1bal0uZmkgLSByW2kgLSAxXVtqXS5maTsKICAgICAgICAgICAgaW50IGNudCA9IHRbbWluKG4sIGkgKyBkaXN0W2ldW2pdKV1bal0uc2UgLSByW2kgLSAxXVtqXS5zZTsKCiAgICAgICAgICAgIGlmIChqICsgZGlzdFtpXVtqXSArIDEgPD0gbSkgIHsKICAgICAgICAgICAgICAgIHN1bSAtPSB0W2kgLSAxXVtqICsgZGlzdFtpXVtqXSArIDFdLmZpOwogICAgICAgICAgICAgICAgc3VtICs9IHJbaSAtIDFdW2ogKyBkaXN0W2ldW2pdICsgMV0uZmk7CgogICAgICAgICAgICAgICAgY250IC09IHRbaSAtIDFdW2ogKyBkaXN0W2ldW2pdICsgMV0uc2U7CiAgICAgICAgICAgICAgICBjbnQgKz0gcltpIC0gMV1baiArIGRpc3RbaV1bal0gKyAxXS5zZTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIGlmIChpICsgZGlzdFtpXVtqXSA+IG4pIHsKICAgICAgICAgICAgICAgIGludCBsID0gbiArIGogKyAxLCByID0gbWluKG4gKyBtLCBpICsgaiArIGRpc3RbaV1bal0pOwogICAgICAgICAgICAgICAgaWYgKGwgPD0gcikgewogICAgICAgICAgICAgICAgICAgIHN1bSArPSBkaWFnb25bcl0uZmkgLSBkaWFnb25bbCAtIDFdLmZpOwogICAgICAgICAgICAgICAgICAgIGNudCArPSBkaWFnb25bcl0uc2UgLSBkaWFnb25bbCAtIDFdLnNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBhbnNbaV1bal0gKz0gc3VtIC0gMUxMICogKGkgKyBqKSAqIGNudDsKICAgICAgICB9CiAgICAgICAgeG9heSgpOwogICAgfQoKCiAgICBSRVAoaSwgMSwgbSkgclswXVtpXSA9IG1wKDAsIDApOwogICAgUkVQKGksIDEsIG4pIFJFUChqLCAxLCBtKSB7CiAgICAgICAgcltpXVtqXS5maSA9IHJbaSAtIDFdW2pdLmZpICsgKGFbaV1bal0gPyBpIDogMCk7CiAgICAgICAgcltpXVtqXS5zZSA9IHJbaSAtIDFdW2pdLnNlICsgKGFbaV1bal0gPyAxIDogMCk7CiAgICB9CgogICAgUkVQKGksIDEsIG4pIFJFUChqLCAxLCBtKSB7CiAgICAgICAgaW50IEwgPSBtYXgoMSwgaSAtIGRpc3RbaV1bal0pLCBSID0gaSAtIDE7CiAgICAgICAgaWYgKEwgPD0gUikgewogICAgICAgICAgICBsbCBzdW0gPSByW1JdW2pdLmZpIC0gcltMIC0gMV1bal0uZmk7CiAgICAgICAgICAgIGludCBjbnQgPSByW1JdW2pdLnNlIC0gcltMIC0gMV1bal0uc2U7CiAgICAgICAgICAgIGFuc1tpXVtqXSAtPSAxTEwgKiBpICogY250IC0gc3VtOwogICAgICAgIH0KICAgICAgICBMID0gaSArIDEsIFIgPSBtaW4obiwgaSArIGRpc3RbaV1bal0pOwogICAgICAgIGlmIChMIDw9IFIpIHsKICAgICAgICAgICAgbGwgc3VtID0gcltSXVtqXS5maSAtIHJbTCAtIDFdW2pdLmZpOwogICAgICAgICAgICBpbnQgY250ID0gcltSXVtqXS5zZSAtIHJbTCAtIDFdW2pdLnNlOwogICAgICAgICAgICBhbnNbaV1bal0gLT0gc3VtIC0gMUxMICogaSAqIGNudDsKICAgICAgICB9CiAgICB9CiAgICBSRVAoaSwgMSwgbikgcltpXVswXSA9IG1wKDAsIDApOwogICAgUkVQKGksIDEsIG4pIFJFUChqLCAxLCBtKSB7CiAgICAgICAgcltpXVtqXS5maSA9IHJbaV1baiAtIDFdLmZpICsgKGFbaV1bal0gPyBqIDogMCk7CiAgICAgICAgcltpXVtqXS5zZSA9IHJbaV1baiAtIDFdLnNlICsgKGFbaV1bal0gPyAxIDogMCk7CiAgICB9CiAgICBSRVAoaSwgMSwgbikgUkVQKGosIDEsIG0pIHsKICAgICAgICBpbnQgTCA9IG1heCgxLCBqIC0gZGlzdFtpXVtqXSksIFIgPSBqIC0gMTsKICAgICAgICBpZiAoTCA8PSBSKSB7CiAgICAgICAgICAgIGxsIHN1bSA9IHJbaV1bUl0uZmkgLSByW2ldW0wgLSAxXS5maTsKICAgICAgICAgICAgaW50IGNudCA9IHJbaV1bUl0uc2UgLSByW2ldW0wgLSAxXS5zZTsKICAgICAgICAgICAgYW5zW2ldW2pdIC09IDFMTCAqIGogKiBjbnQgLSBzdW07CiAgICAgICAgfQogICAgICAgIEwgPSBqICsgMSwgUiA9IG1pbihtLCBqICsgZGlzdFtpXVtqXSk7CiAgICAgICAgaWYgKEwgPD0gUikgewogICAgICAgICAgICBsbCBzdW0gPSByW2ldW1JdLmZpIC0gcltpXVtMIC0gMV0uZmk7CiAgICAgICAgICAgIGludCBjbnQgPSByW2ldW1JdLnNlIC0gcltpXVtMIC0gMV0uc2U7CiAgICAgICAgICAgIGFuc1tpXVtqXSAtPSBzdW0gLSAxTEwgKiBqICogY250OwogICAgICAgIH0KICAgIH0KCiAgICBSRVAoaSwgMSwgbikgIFJFUChqLCAxLCBtKSByZXMgKz0gYW5zW2ldW2pdOwogICAgY291dCA8PCByZXMgPDwgbG47Cn0KCmludCBtYWluKCl7CiAgICBzaW5oXygpOwogICAgaW9fZmFzdGVyCiAgICBmaWxlKCk7CiAgICBpbnQgdCA9IDE7Ci8vICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSl7CiAgICAgICAgcmVhZGlwKCk7CiAgICAgICAgc29sdmUoKTsKICAgIH0KfQo=