From 0f7047add2a293e3c12fe37fda57700b5f1a0fb4 Mon Sep 17 00:00:00 2001
From: Lyuben Penkovski <lyuben.penkovski@vereign.com>
Date: Wed, 8 Nov 2023 09:58:05 +0200
Subject: [PATCH] Unit tests for exporting policy bundle

---
 internal/service/policy/bundle_test.go        |  94 ++++++++++++++++++
 internal/service/policy/service_test.go       |  91 +++++++++++++++++
 .../stretchr/testify/require/doc.go           | Bin 0 -> 856 bytes
 .../testify/require/forward_requirements.go   | Bin 0 -> 428 bytes
 .../stretchr/testify/require/require.go       | Bin 0 -> 62044 bytes
 .../stretchr/testify/require/require.go.tmpl  | Bin 0 -> 187 bytes
 .../testify/require/require_forward.go        | Bin 0 -> 56572 bytes
 .../testify/require/require_forward.go.tmpl   | Bin 0 -> 173 bytes
 .../stretchr/testify/require/requirements.go  | Bin 0 -> 1131 bytes
 vendor/modules.txt                            | Bin 22279 -> 22315 bytes
 10 files changed, 185 insertions(+)
 create mode 100644 internal/service/policy/bundle_test.go
 create mode 100644 vendor/github.com/stretchr/testify/require/doc.go
 create mode 100644 vendor/github.com/stretchr/testify/require/forward_requirements.go
 create mode 100644 vendor/github.com/stretchr/testify/require/require.go
 create mode 100644 vendor/github.com/stretchr/testify/require/require.go.tmpl
 create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go
 create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go.tmpl
 create mode 100644 vendor/github.com/stretchr/testify/require/requirements.go

diff --git a/internal/service/policy/bundle_test.go b/internal/service/policy/bundle_test.go
new file mode 100644
index 00000000..663fc440
--- /dev/null
+++ b/internal/service/policy/bundle_test.go
@@ -0,0 +1,94 @@
+package policy
+
+import (
+	"archive/zip"
+	"bytes"
+	"encoding/json"
+	"io"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+
+	"gitlab.eclipse.org/eclipse/xfsc/tsa/policy/internal/storage"
+)
+
+// should not be modified, read only
+var testPolicy = &storage.Policy{
+	Repository: "myrepo",
+	Name:       "mypolicy",
+	Group:      "example",
+	Version:    "1.0",
+	Rego:       "package test",
+	Data:       `{"hello":"static data"}`,
+	DataConfig: `{"cfg":"static data config"}`,
+	Locked:     true,
+	LastUpdate: time.Date(2023, 11, 7, 1, 0, 0, 0, time.UTC),
+}
+
+var testMetadata = Metadata{
+	Policy: struct {
+		Name       string    `json:"name"`
+		Group      string    `json:"group"`
+		Version    string    `json:"version"`
+		Repository string    `json:"repository"`
+		Locked     bool      `json:"locked"`
+		LastUpdate time.Time `json:"lastUpdate"`
+	}{
+		Name:       "mypolicy",
+		Group:      "example",
+		Version:    "1.0",
+		Repository: "myrepo",
+		Locked:     true,
+		LastUpdate: time.Date(2023, 11, 7, 1, 0, 0, 0, time.UTC),
+	},
+}
+
+func TestPolicy_createPolicyBundle(t *testing.T) {
+	bundle, err := createPolicyBundle(testPolicy)
+	assert.NoError(t, err)
+	assert.NotNil(t, bundle)
+
+	reader, err := zip.NewReader(bytes.NewReader(bundle), int64(len(bundle)))
+	assert.NoError(t, err)
+	assert.NotNil(t, reader)
+
+	// check metadata
+	require.NotNil(t, reader.File[0])
+	require.Equal(t, "metadata.json", reader.File[0].Name)
+	metaFile, err := reader.File[0].Open()
+	require.NoError(t, err)
+
+	var meta Metadata
+	err = json.NewDecoder(metaFile).Decode(&meta)
+	require.NoError(t, err)
+	assert.Equal(t, testMetadata, meta)
+
+	// check policy source code
+	assert.NotNil(t, reader.File[1])
+	assert.Equal(t, "policy.rego", reader.File[1].Name)
+	sourceFile, err := reader.File[1].Open()
+	require.NoError(t, err)
+	source, err := io.ReadAll(sourceFile)
+	require.NoError(t, err)
+	assert.Equal(t, "package test", string(source))
+
+	// check static data
+	assert.NotNil(t, reader.File[2])
+	assert.Equal(t, "data.json", reader.File[2].Name)
+	dataFile, err := reader.File[2].Open()
+	require.NoError(t, err)
+	data, err := io.ReadAll(dataFile)
+	require.NoError(t, err)
+	assert.Equal(t, `{"hello":"static data"}`, string(data))
+
+	// check static data configuration
+	assert.NotNil(t, reader.File[3])
+	assert.Equal(t, "data-config.json", reader.File[3].Name)
+	dataConfigFile, err := reader.File[3].Open()
+	require.NoError(t, err)
+	dataConfig, err := io.ReadAll(dataConfigFile)
+	require.NoError(t, err)
+	assert.Equal(t, `{"cfg":"static data config"}`, string(dataConfig))
+}
diff --git a/internal/service/policy/service_test.go b/internal/service/policy/service_test.go
index 9a22ad40..2819b017 100644
--- a/internal/service/policy/service_test.go
+++ b/internal/service/policy/service_test.go
@@ -1,14 +1,18 @@
 package policy_test
 
 import (
+	"archive/zip"
+	"bytes"
 	"context"
 	"fmt"
+	"io"
 	"net/http"
 	"net/http/httptest"
 	"testing"
 	"time"
 
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
 	"gitlab.eclipse.org/eclipse/xfsc/tsa/golib/errors"
@@ -881,3 +885,90 @@ func TestService_SubscribeForPolicyChange(t *testing.T) {
 		})
 	}
 }
+
+func TestService_ExportBundle(t *testing.T) {
+	t.Run("policy not found in storage", func(t *testing.T) {
+		storage := &policyfakes.FakeStorage{
+			PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
+				return nil, errors.New(errors.NotFound, "policy not found")
+			},
+		}
+		svc := policy.New(storage, nil, nil, zap.NewNop())
+		res, reader, err := svc.ExportBundle(context.Background(), &goapolicy.ExportBundleRequest{})
+		assert.Nil(t, res)
+		assert.Nil(t, reader)
+		require.Error(t, err)
+		assert.ErrorContains(t, err, "policy not found")
+		e, ok := err.(*errors.Error)
+		assert.True(t, ok)
+		assert.True(t, errors.Is(errors.NotFound, e))
+	})
+
+	t.Run("error getting policy from storage", func(t *testing.T) {
+		storage := &policyfakes.FakeStorage{
+			PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
+				return nil, errors.New("unexpected error")
+			},
+		}
+		svc := policy.New(storage, nil, nil, zap.NewNop())
+		res, reader, err := svc.ExportBundle(context.Background(), &goapolicy.ExportBundleRequest{})
+		assert.Nil(t, res)
+		assert.Nil(t, reader)
+		require.Error(t, err)
+		assert.ErrorContains(t, err, "unexpected error")
+		e, ok := err.(*errors.Error)
+		assert.True(t, ok)
+		assert.True(t, errors.Is(errors.Unknown, e))
+	})
+
+	t.Run("successful export of policy bundle", func(t *testing.T) {
+		storage := &policyfakes.FakeStorage{
+			PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
+				return &storage.Policy{
+					Repository: "myrepo",
+					Name:       "myname",
+					Group:      "mygroup",
+					Version:    "1.52",
+					Rego:       "package test",
+					Data:       `{"key":"value"}`,
+					DataConfig: `{"new":"value"}`,
+					Locked:     false,
+					LastUpdate: time.Date(2023, 10, 8, 0, 0, 0, 0, time.UTC),
+				}, nil
+			},
+		}
+		svc := policy.New(storage, nil, nil, zap.NewNop())
+		res, reader, err := svc.ExportBundle(context.Background(), &goapolicy.ExportBundleRequest{})
+		require.NoError(t, err)
+		require.NotNil(t, res)
+		require.NotNil(t, reader)
+
+		assert.Equal(t, "application/zip", res.ContentType)
+		assert.Equal(t, `attachment; filename="myrepo_mygroup_myname_1.52.zip"`, res.ContentDisposition)
+		assert.NotZero(t, res.ContentLength)
+
+		archive, err := io.ReadAll(reader)
+		require.NoError(t, err)
+		require.NotNil(t, archive)
+
+		r, err := zip.NewReader(bytes.NewReader(archive), int64(res.ContentLength))
+		require.NoError(t, err)
+		require.NotNil(t, r)
+
+		// check metadata
+		require.NotNil(t, r.File[0])
+		require.Equal(t, "metadata.json", r.File[0].Name)
+
+		// check policy source code
+		assert.NotNil(t, r.File[1])
+		assert.Equal(t, "policy.rego", r.File[1].Name)
+
+		// check static data
+		assert.NotNil(t, r.File[2])
+		assert.Equal(t, "data.json", r.File[2].Name)
+
+		// check static data configuration
+		assert.NotNil(t, r.File[3])
+		assert.Equal(t, "data-config.json", r.File[3].Name)
+	})
+}
diff --git a/vendor/github.com/stretchr/testify/require/doc.go b/vendor/github.com/stretchr/testify/require/doc.go
new file mode 100644
index 0000000000000000000000000000000000000000..968434724559c180f09d0dadb0736282796c7a0d
GIT binary patch
literal 856
zcmdPbR|rT<&Q45ERVYd=EX^!RRmjXO$Vtsj%_}KZD9K1wC{D~xRY)u@PAw|Q%+D)U
zNQ4L{K!g$$3ZUAPN=vx(^%aUs@(YR;N>YnU6jCcvlS@IG6v{JF^Ar*xqG^elImLQh
z`uZT%$_lO(i6HwFLW>jAQ=y_E8L0|s`8hfH<(YZu3Yo<Ui3-X2AXO!)3aL=_rNtmQ
zxSK)77ndaFr6d-mK<z2bO9okP1u>K}Gq)hWs6;`7OJAQ;K|u-R!pyvMB`7yNvm~Q5
zNiR7+SHHNVD77RxqevgDB&|{(Y6)1WCe*aF(!6AakksOm;QZXwl8nr}bd3@PEwGNf
zbiEKwg=(lm1%<N2B85bS;*uhegKZU*JW_LV^1+5d<dU$-L7WA(S<khwG%-h`L`NY}
zM<Gc^K?xK<CFS`F<@rS^#R|n4`K3823Q4K(_|j8?xw97H3<YHcM|c!Mg+PWRKy5%o
zV@6^bG|tm=@{<yC6hJ-&g(EoTGxNZ9phvzAC@zyqOB6Emic3-xQxx*k6pB(yN{jM9
zeoj<K%FoY9P0Uj$N-ZwUDFGQ#sgRtQlcSJOqUV;Fnd6sVuA!L#OBAkUsYR8DBnNka
zLSjyFzCuZ2c51OgVxB^N0mxa2Ik4c%O)UncAy@)U%gjs6QAjLGF9oG#unQAmNh-Ot
zxFkPUA+@L|zeoY9uUMfZ9~6d(1qG>jDXA$SE-3v&r9qBHauX=h^HUV^OG^q$ON#Zl
KV7UMqo?HM}L>>JA

literal 0
HcmV?d00001

diff --git a/vendor/github.com/stretchr/testify/require/forward_requirements.go b/vendor/github.com/stretchr/testify/require/forward_requirements.go
new file mode 100644
index 0000000000000000000000000000000000000000..1dcb2338c4c4627f67b6a981a6fd38a76833b20c
GIT binary patch
literal 428
zcmXR&OwLYBPgN*NEiBC}O6B6x*H>^XE>0~f$;{6yRwyXSFUw3xEmlZ`i7Di!mSp6o
z6e}ba<(KBAD3oNRg7k!>7MEn^rH3eF=9Q!tr6ne(>T#7+7NjB@R$Nk4np~n#&Ba-w
z08`IZ3%1fPwOk=LF&ku&LSAY)vabB3tkmQZg|z%4kX;JJ1*yrIX_=`ha3l1%(n|A^
z75q}mH4x@%Drg~jqneAeD7B=tC{IBRAzIDF$ys8hP@==dSqpJSdcIY9YF=tlVo9n(
zafX6!vVu}_ih`b=etdF%N@{v)o`Ra1LVCVJQfX#R3W%MYqM!?+k(40R>gJc06qJ_e
zLW9^A8pH~^C8@auIf*5yFp>DQ{G#&2q7=RKe7%y~f*b|i%)I2B(v(!)wEUvn#1dVQ
I|B98k03kY)1ONa4

literal 0
HcmV?d00001

diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go
new file mode 100644
index 0000000000000000000000000000000000000000..63f8521476758e26809961c907c0dad8cedee517
GIT binary patch
literal 62044
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

literal 0
HcmV?d00001

diff --git a/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/stretchr/testify/require/require.go.tmpl
new file mode 100644
index 0000000000000000000000000000000000000000..55e42ddebdc45db4a80e88cf35b10b9b852e1460
GIT binary patch
literal 187
zcmb=f)^pC!%}vcKsjcNoE6qz*sIJy?$xrsoOUu{uOUzBJt<@+|2uUq2$;?X+(E-T@
zBo-y+7T4BlDpYfEW~M1*=qTi8D_Geol;~-cc%<eOq!wvfgM_LTGV~yP4NZkwu-e4p
w;?$xNJuG&Bjdsf~Do-p*NlihrL!l_Oq_ijxWI&0YTViI8Uw*lUCRZ&N0F=!?IsgCw

literal 0
HcmV?d00001

diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go
new file mode 100644
index 0000000000000000000000000000000000000000..3b5b09330a435238401036daf4f36d93801ac352
GIT binary patch
literal 56572
zcmdPb;?h!Z_IGhraCh}{4RQ=|by08(4e|GN4Dob!^zn&Q2=@%}P)N@#$tX?IOU}>L
zFD@xcElJKO(l1FZF3C)*)Q?ZjPf1Nr&EwKi2=VX?R&ew5aaHgQ4GvN8^AAyQa#e73
z@dO#`6sh3h=;y+vpry~nRgjpRotU1gP?TC&npu>}#g&;`kY7}ypuxqNSX`W1RHC4S
z&rXOMB`(g4l9B=irM%P<eGp5Di?g&S2f{Bc%2DFtEXmAGRZs$vN?e*;T>AP7&iQ#M
znI)O|c?zY)sl^J33eNet1&KwO#rb&(CHV>vlNAyblJj#5a#AZ4l40ugxYA1Vk`*)(
z6|@||PRz{DE7nAqrvcId)vt#zR7WAVINdQX#jz;8SV2!uFEg(swJ0qyIkmc0Q=yuR
zGc!#gLq{P$Tfxd!AyKbHPou;mHK!o8NYff5Sk1-BnV|;}(a_}LtmWc_dq5*muS5sz
zPGmdu^z<~jYEiwKMs2^Q;q$CQaY<2TUb>D#BGtW|hURC89jIO|NzBYEhQ>p&LP<tq
zi9$(6szPx=YI0^;W@-xDc{!QIB^rrEMTwO<3dK2@$*CZ76!MD{auW+c(GD@FBqJ4+
zY>>2<CP6$1Qkt5Rnwy$eqQ|AL&!w-=nW*QSp9j{bq2!U8lasFyo?n!cqNJms1Yu~R
zsfvauLnw&Fsk9oZ)Cy)+t&RdzNE2t$gt(<x0V&mik_^O+sG`(QrVz`)sk9hjEAGS!
zR-ZQDQJ01z?sOECQj3Z}=_9qc7*u$v7K7p~Ex#x?v7{t5MF}l((=_nJF6oBhiGLyt
z!&P=c!d!#c6avpY)XdvZH(*UD7&+V}v&gj~v$&*KAvq&8IlEY)JR`LvBeh5&Q6VL>
zC^fkxzo=3n6`~?D51jSWGs{x*6bcecGV~NYOB51wit`oH5;Jp(K^Z$U4Xg$vtB?t*
z57IJoQWc64G0e;_0x2v?1*^(afFuR58#43K;jYLmfm)8Ex_~=h18gItBtgy+RH-8n
zwtxc_WEHX<pn?usN5EC44e{_y!w697r&UB?LFyrRxMHMIS4h23?3-AUoPn=I164wf
zn6*%5u|jHLX<`njNdm8WK*<%P-U*BP^t^mfr3*@;3i(ATsYMF;kc17bp^EhsJi!7*
zsS1fjsR}8j1v#0?i6yBDFa<gw<3TlLUTJO;M1NvIL26=AVqS7;G03>o#N-SRU6PTS
ztB{$ekd$ANp#XAFu|jc1erZmMLN3U=(8^FDQ4b{)G@=c46pVEgjC2%?V|5guJdi*v
zj`|B#JIEqO)G7-k<b*0j<ys8Y3E<2GveZ!r>~AL=nF>W0-U<zD7?$W9e$k(XC;rK;
zzfi+j100yB$pIvUnL?;vGN8ExdqTl1C2|W&D)E&L`AJ!+$t9o~Cl#brPeH*`FI7(=
zFEd9+K}ktRAuTbdI8{f%0NfPK1XWp}Oq>X5&VmFJ6_PU&^YT)26v{I}nKd;}!PZv6
z0GdTP6ZKp{=4#|8W#P($FnO>$5PcWqluwl^3*r!Pz(IVCYy(n-1y+YQPeHWPJkZiW
zp+<Jf1qCbE1Z?3-gY*fp4?TD>QzW?3fpmglou~4A1xSz<gKG|Oy@Zs2Ksq!Gjf`~^
z42_IIO<+(G49ExfI26hfi!u|Fa#A6+S!PKkC|XidOHzw+GxJhY6p|8)Q&SW`UGEGe
zHIS+cWKL0PT53^hUUF)RLRn%?X=<^8Mq;r-enCM#NMA`lxW3Cx%>_035>rx&Qj3dI
zi#7EW+)DG3!JT}tYcoqKL53wK=H=y=C?usSAh{qhFGZm|GbcwOF{eDSvKZVj#L;$h
z1$#BMq98T7BsB%Kph-+F0ae#vUqgEL$my3lIRtDyI0|8I&{2Tci)<HiUIFQF1@~D{
zqBKzf)ExkaPf=<~X%Q$U5@AhRjZAP6lV75cke8X00E$rsP#}SO(wUIL2xKm(X##34
z6cpu`Wu~O2Kw8A`gaHl@|D-G(kT_^?BRD@d6&5WTAX7o556B>}12s~MigXkdU>*aD
z1%t;Ca1~4lttA<$VD%uI@{7P0LbSs35w%+d2)n`20doM7)dXV%tq2>0QIdu`PRK6y
z-~pGW0Sh#|u?CMps`WR)nHZd0po2*;cc4ce_Oj8n0yIvUni2*njZm@`C^wW;7C;)y
zCD@8hXhurSEK(>aP0Gnk1{F(bnW;G`kg^rrH3b)0dI}*KnZ=;eva~ogtu#j=Ex!mn
z)|Uuw<`<U~l_r-!OX!TmvQ&kFqRcW-a~@(E$XsxSO$N8i3-U`+^GY%kb8;#bQZm!h
zQj1{uQ~~5*g<w!PmnN4eRD;H+IANYt00GX-yb`czUVaIZ1WZ_=79<I3?1SSLC3rM~
zs||G&jB0fhzzpMBO$A#!g_5FD(2yD@VLhO(0z?nEp@V&t3lgEI_QHyhfhnV5p#(`I
zkgg)kMMRa@D4szpC`J=m4r=(OVWcv`r4!*~h+--@9TI0MX$dt=1C}m`N~xe+O5Krl
zESU#dEW#Xyl3=lyiI8-T){ntj{DI4`yt34y5^$ps+I}le%uNNCL*M~9P+J311i}Z^
z!LEeZqEVWeS7K}gYH(`mfC3H5#@9-K>V)|Sqzg6$1M?lK7%iF$P)C5<3ow_!Y{%DF
zfapUn1ZWhxX}E%yaN@^PI77WKDAGF2Ex6+Wdm1Mu0$_D&q8>QGrhyVExK~6(=z-^t
z6ozlNX>gQuq?K(HcAQ|zK>^xH!`~TFP{>RJwTM8Lf*RhS$zgqcPEG{{Xu%3eR2n5Z
zsGTHmvlZN(Qc$SHkqKdD!kXIDF5kfBLvj?T7l$w&xi1P*<cKygn^>ZdlbTpuqL81L
z3LRO7xDhlT1!Ad#rg;)G^B^P3sl^H<iACwDB|6}SbY_}DalVd1aVn@G3>Js<NfS#z
zTJwt_Lk6H|fH$TS70Qc1quNE__B417r&!Oi7*~fM;$~2EKupwu+E3f+0%|KFKw+N7
z7qDmr)X)f7a2Jz6(9)pM0|{VQVE{_9NFj__{)3dm=JlbO5!&-2zt;|G#)Fd|%1Q&|
zRSK|W2B7o{>S94gdhiz_iF)9kEzGf?go`n#Qkn!A9KqFMLiR02Cp{Uuya665h$Km!
zF)kF_!8riYKZjY4tGR@%7d<<WJ>o@|hyv#WoH0d2^8qxTr+~gR2_-FH4!FRA6FDy7
zZ0e1-pu`HKGmIljvFAKbD%BaFe1yLq@WfjWcou`Q6Ix*f&cev)k$SnnvltRs;DJ%3
z^2rghmJGdW^(;nD@?_Snl!p^IHRB8@8YMB$Vv@>p^uQved;o<Is6-~cVFwNw!r2)*
z3`eNxmqu*c4{R+gLUN1KX%q#>5s+I9T>yxjPRmmBK(iz{Xmg&B^*Qi`mXPU~q*R66
z)DqA#gYv}85;xH5o6Ou)@FInR)S}G%l+0xCa3*{O4kU{p;t{-Bp(Hao8x~!OdaiH>
zXn+b#4NZll{QMk+Y6ZwF2zX@DTA@})0kmLLFE|zCBpn4q11&J$H!~+EvluLhtL{XY
z57G)*W{PB!jsmh@^ju1d5<!zNAp4TDA(kS<s9m!n+y<^z;SPj53gQgp!VGKNg=dyz
zgrGKqXdQtHo_XMAQW2=DP?E2Jh(~aG$ShGPE-fg?$%L-w&B;kkE(wA31yVs8p$mRN
zF#!qhV$j4PbYUnwAV6d0FeM7fiQomo;Q2-8e1wUhM5mAsnrVjy0caI4D1|A6WFXs>
zSq!qcI5Q=+C^bbvDL1u53Dm*M%ZFq`$Z&sAVkT%BGc!*iQ2~}x!RA1{lcE5(IvL`I
zVui$<9GDSlMfthlo)bu~f(B$I8+3h7VqT>t*jb)wU_Zcp37S#>&4Pk5S5j(Peo-nc
zQR+Yyf;|hH&jT&|0R;@G8I%JK{><cT@H}vGegSATEocl6WD%%9OsyzMEy_#G0S~f(
z=KLU|q5Arq>G|M{sR8TNf-_WbPHJj_h6N;dL2?_oBg=_ujx9J}g3Pal&l|!MGdMLu
za&xkR7Gyd`4;E@L+w}Dn5>rx;B1|E%SRpSpH6=C0S|KqHRvdvAg@e`wmV&|rG$jn;
zKmw(-s3<kB1RO~qhd>vp>xC4RrfMXEdgMqR2bJ%zIbwAbuc(94WKt^FKaka;wK@uh
z$o@x^HjwZDn*}jjp|}JzzmoxSdVUFbT}OIq3dlrt(2R<@wL)<T#L+p$sY(P(C`iB|
zk_9N`Yd}*OW<bIV3G`A5ob<r4Nr#dP;$|uoUud=eX!)hD4=#5Q$zinoqGS1$hN}Pr
zWq(lrNg)^4l5=QNakPXh0@durnn-N}aA^VBsRG;ZL){`y0k(FVdR=AIS`FHqhUZCm
z8I06W!|XD{&7gA`hnTEGxB!x@$!=v6PW?E>yOCS~4?S4>1JvS&ha{1;87-rlyjZSC
zOfEt1MqyuZl9>k?1_zIrgBE+h8f%Gqt`Ji+&}LN4Oh6M?nz&jJP))EoOw^%p$RH)E
z7_~bxPzQjU0Wen(nn{J|LCX^423Q)75F<OiLR~lD6QnSA;0{`h^2RMOGe@B)6|^V{
zym=-uGY8asF3Bj$FHO(Do<Bi)G(c_Z(xOyfXvGFAOsSk$z*d31gK8g+UM@(vUw%1w
z5ooajXoo9qANb{$)6o+k+er3D8nGTp!{Za`7k<!ChL(I-A_i+JOCu+l(cfbv`6{P4
z71}F>PAGx8+3@{7(1JS?v?w{JI2BQFyMdPdYvfis<>%+%D5fDwz-y+#gIvf7o+@M1
z5DUOb5^M{y1xVvYU}fm#F3NUXux`+(1bDCj&68<RUy@t2Laf(-*a4~fX)^u^wFfOY
zFw=2nPAab5i{O2SL~dME$V`I`%7FHuDHMQ~+ZThz0+4q>g2qfUQqguSmS?2qDU=jd
zf;KId<U=<7fyX#N_T!ibcY`|{W0M_pHi9}y3SkX6AVFTkm8{@OvFuv}`2@NP6EuDd
z%2SXYKFC0{EuaGylJwZGh=@06sRRlDaEM~0O!uPH#1hahTJX^ZNTpF)W>IkoY?B};
zo2ElmmSiO6ffEj7NF3h&hnl2eq@!R69?nbDg9)YO<R_MxnP?bk>L|e2hMH)Kl#)QZ
zsuOXIV8P5vHAHP?rW&F0soao&Sqn~>sfIcVsYc*{gr<L_5)Z1<zX-et46}I0AE5a~
zkgYPHybMaX*aH`8IF>L*k}*OJSeOhVe8C46pgLCrBAY}Y^kHTVOeDZ;Cp9jxR6|sZ
zj5Kg;5K&QK33jkvBXadZ;w%xAZNT%<xJQdXW7qKP2o1(Gc$^bqKWGRAW1RtN5=zq`
zB2`eoQHkyd^u&Ry#3MOT;LercSTrOe6p>Rvng*;SL@gCbHim>$fG-vYHu|9T6jA|;
z5pNzLApuVLDV4BAPN*epBGMA7jKsW@oYW%d>~66_BB;%jl%G-wITZ%J{v{Eb8WC+z
zbUQS1D?K2F=_n|<yM}<WT6uZ7UV46hdQK|nTqGqO=&oE(^;`wF)YKeM`^u*@IlB@(
z(F3wM2)xw}abN`~AwedrKod{piNy-VrOC;u#l@iQJ{q7o9Zk>{UeIKn2DojkiKBUj
z;aZr-L1!ZAK^+d-dZz=LQqRao9DxHmEeY212Dg!m6-tY8^uY6X#X6v1p=qUx;c#%K
zg}NT*SRIg)bRc~ph?{U!yy&K(<!sud3{VFJ8p32G4WcqRUDHmQ1~m8;Xpwk8DT=xq
zSTG_TvS<qG2?A*dXW8PHUqW&5l9HcVtN_Zq&~iorcQJ!x-Owm$kR1#SYMP`MXzQ9P
zy-Qe1L3TS;${QpD$uDxqOD)5t^g#~7AzA>Tc!7j;g|!R<uiPb}VFTN{4_YEp3R-!T
zf;3tPO88&{QOcG8|6p)4Mn6$MNk3T$T+2c${%WN}B`byKSV+sD8q%;#R;mT<^rd-a
z1aT>~3Kc4k0w98th!{rLjWjv{H-VI*g1G2KEer;A{8F!#L6gy3L?jW@n!vWy6=XtC
zD&#;q67sP^5lj!xoD4G+B{M_2B!ew4!`(WFvoqX{l;mibA*5t#65<*)XAkno9s+qA
z9$l1V@8FWelG0-5{1mh)JiPr(q|phSIUHdy);yk<U*ZWmnizEMY%1tzS@3CKrUu}_
zcA8huNRFdcriKIr=oD$tU;}dJo@(uWBv%uW%@Gblb_`l2jxds>Opln{h1jA1@;B<h
z6OzfKC4j*(nt<$l8YU6i3?(2tp7fN0wJjeE8Pp@C6#yLv1h4qU+MI`)iIO~E4L;Dg
zjg`JWw&6+8gb?jZ2#9~F){R3nqp4RMK%GcL3?pnu&;JlJNXz^XJp|(wwZ11JVh2gi
zhj?!YGytIa2RhpTEv0Y_7Gi7O!z*C)y{UQ7qY^<A<(Y_DS|JHE=YV_&J^Y|RMA?rp
zR6|3{x6%`K*rujNUS^J_jzV5)xrT40Kln&cT&pvY%z)bf(E+Mk5vSfj4s=8nLnL*o
zWHcnFfb$uedvu^7g`<i^=tj?B)CuA=BEp!6T!nQe4ax1Gm7<VPCm|N7U$r5-h+t%3
z)MB1_E~z;siKsOgX!Z)UfHto*H?=4+2eP3JbjWOGo<a&(d48G#cn>Ccw;WP3hnS|3
z3p$TIAX7)d$VlH@&p=1PKo8W0#U7$iJ+S4zs0kO_qGN~?pi`^JX^c8)8|of#Si&5I
zSc43<9NAK&x&s=RzKI2pSvF8f0SZg-Ay|pU3Q&0+g{0CFh0GG@nSY?2jX62cNic<^
z)ROX4&@!&_e9&bT#d-=(prg2R6AOwJa!ZR#6u>6}rb3qULe}Vjj@Zght;Ds%9cnAw
zRU|A$274B^oCn#{)C_5a!>ADCX@fJ&NjV}3Gtg;JXh0G<Jm{gdCBEd2tLO*@U9W;O
z)Ke>xQwvZNJE&v<-^oHC!GaAQY>5@(DDo33SU>JWN@;Kn(sTy#HDpAFoHT~kP5_mu
zpj1R|{gj5if+D+30Le^)H0;UC+O7q~nK}7+sO<t+)PeUKL2G7kb(E-3l$w)Rl3A7t
z*}txklUfX3XPT#w3NZ-#UJK7Ws68ZPbEttdtd(GH!ja3N4nVFBQQ81d?cg+zSuR3l
zLHo)vN=9&#3cOZF0lfbol*S2^lu+ZqmJP;0ggA@}A&I5Tg!-KpK}kwphNcIU1WAh;
z8|qzfh~muDP{)81Czcu;Y6e<)O1peLh{KW0AS`xCO)g4JEC#Isgskub7jz}yra1JB
z1<;zm%wmNUxJvi}dQT+n8qu+tc_r1Lwe&g)2DP98JkCTtG!@`p4p<Ei1t=5wiAuFN
z_6(sIOOFu(WRHTgKg3dS!h|mUK`u3sl%pk1P-Rb2xTc{6ED_Z@c+oC$5P{4<3VL#l
zK#v?E%)#DAMh+g(-6Zt6Sp+pi&|?v^cq#VGBQ|ej!c`*W4TN@R6oO8e*HJJ=Bz+VW
zkO%^)!Jz;a{NUyDNqF)GlCh9viaH2E?a?!&aDudnA(rCI8wlqS%o_y46_l<)g$^jt
zKmkicf`sM`BsXY8$07wixkjKz4iV<y$Q#H`gM=hT^wFR`Mv6peRRXaa9E(`;hF^Xj
z@l^+CZ7J631H}|XE&;_SA`_r1LW(VTErYHGJvwmKBd8i7e#QuIXbDf9VWMJGE78j#
zs9h+v35pJanTEK~M#?+j;3gu$Lh}x)Ysk$$7^a{{84(V`k%Q2T#u2Hs$V6y1qsJ}w
ze1ypGsQpvSrUEEtu@;Gb`FRLap!o>W5;H`}M<|LQ`3R&8w;EWaKzBOgZjYh507sBR
z(>C?;5t4t<!y0NAdOkwvASxdb4sBRI0)?ZFf+6UtW1_aUd4kFTB-g<65y&7)OhJz_
zit-V%193zujq(w)&FFE9B_D-U7ND(e0%ae>8WxD-A#*>FOWPE{^B9nGW^fcFAVcB9
z5Fid}%>XeIRgCJ5E0DF2W)-Yo3lbqTCs_<qge8SjAwUqFV2~ZCzQ++Fv`8W#%b_h5
zoB@N8PP~Hs{ag#tirMmf1&}z@k&q;kT3DJ{mY9QbVLC{WYoSI$wNeJ?!gM7o1*LM>
zo#|=$`5=B$Vv$m9f{sE$wGxtujsm)l+5{X85~v+8A3@y&o3Dd&shrB7wt}-6%xajO
z;07ROVG7ZLp2A2A$}}p4CAlRW)DQ3+4i8@FU@)X41qT2^swlmfD)kr4a@>KAk$Qbn
z(MGVb6>$onV>hAMJXs+pH7~s+12m<r0M-q^P#ko`D@Z#u$AUB^f^Rm0>^RLy&C}2X
z?+Hsx1`X_jOn_|3_DRjt$gKnq+vzA6<4DFJMNpIBiz%vWb)e1xl^Nhrg(fSigeS;K
za9Bd@h1rE{4^mseCp8Z}?V=p@0x<+%Sf(M}&Q3{Sf>uz$LX+Ht4Dt=uaTG}O!^4~U
zsTgcCu3*QKfQ!+VA%T)0#>obV=@yVQ+PM-wsl~+_pdJgf?+50Co3fzO;E;~%FoGS|
z0al>|9W}w3V2g{1ISqiiDYh7Pa6Z0MIzY~c9)N&Wab=_`;0Zed=W`$#iyoX%+d!v8
zz)t2sR*eWsaEA~@3fxb?c_s(4QX-CCpmt!x`~^<0NE`Q|_Mj9G#l=w7Sc(a%1bP}c
z)QQOP=z$DAyMgEvIFN!oO#>ElWZ4SYTnCO|LLD5e&1n>u5E1*dD69~%3T;v&G9K2#
zinPebQCg86(}<Hc3{eU+QsRxI*v1)Q19Zj)D6PO6_jsbnFEt%9O^-2k1#JL<&W6uP
z1?@ipO<m_fmBYvAVfr<6!CO)|6ZMcp^gwrnV+|O%qEt}L3RyG>YTZz|RSvfXQeNR`
z$-q=$Nvfm;LYjsy(I>*dE!EI9)B|0pu0&RmfG`F#B&nbM5w;-(C`PvTOD)58xESPE
zHpCgdpk45J>Lm)ri6xoEX_cVU+mLU}0N?h2<Mxk?RM_2YpwtCA3>vcf6m&p6qMZ$P
z2liu$!AGo6a{C9wY=mb(?toq~Lh6CT(7KZ<O?Zg2z>x!Y8{9oeM@d8NM5?dBI<e${
zfr&NfA?fI+NfRG!M3nQOD8o433K9$&@W2~fCrLwHM>u{l^JHcYX44l@x<NZ@nZ=-k
zjgWFsW)A2cEF3L<zswx0T_$Q5;+Z*+rUt~3xC-&i94x7q7$1T!Od>nIWagyd3IrOI
zzaZPdv5yoMm~ox&l39f7<Wa~r_57kr1yK159-jc8LkcQ>L9H)Heg~Z$2}%YEo+Z#@
zg&`NtD1ao8Paw^MoV^KJ{1Oj0I$j|^FQ*d60aktp*U|KVQDl3-K?ZU<uEc|I6P6=J
z;r<!~K}L_0M3F)c+Jb}!9hS5PKEngGY{7O@ChRgK1&vI-R6T`+yv&>g@TEndF)@-Z
zSM$pUTL~_hpf_URxjYSghbCk+(myE+JmP`#?p!33A<I^glM8j~XQ<o32@-tSAEK~C
zu8bkd&<ZrV1S^rHAx#1vY&TNK)1Ux_1}vmPfkgn8RE;=I7jkMc;v~OB1@Mu>n5Ac;
z0#extFE~M4aET~8L1q#tHW5yuak+_P5jdT~b3c|=V?IJLmXZ_XD=dX3{X&X9#U)Z0
zKoS-_#IU3+9EZ(;>Rv=^1vYPzlUZD%kyuoeSgE4`Uib|vBtQp6<|Y<E0@lwz1a$da
z3FzMJl8jVPazio(cCRo<ODd!r531HdWp1J#(kWINN*<sIIfZc8Y@BOiQAq~)G)qvI
z9&tjRMl?hv=uk|E;#eI8C7i0Op{lJElpv}>)ABIY*c;$Tc7ZMiFF_0rK+o1g6GarD
zR4Sq25d?|LVjWoc79&>&porkA<pPB_QaGZO*aI7>X*gn)h_)_x#1z?I_~M-`^YEk$
zBFrO{bka1?QVGtqLyI~Fo`RswC-fwQtyFN$EhvHAO^CFB9FdnHEq>4-94O1Df|Tni
zD0qSzQ=mmn;Dce5lynrpePkU418|nl1YKSUN~4L8;sYd@2)<4*FEvL2w1XEkp{QVM
zt6%^t7c$cnz(oVtL7=V;^kPK?Xd6!teAKx{iH?F&NqN2!co{{sVJx_1Rf~OBk6(TX
z+%#+pm7(<twel~-E^yTa2{hdK7OWI+riGY5=U@kSDG6r-NF$625d*dlTg=cTcR&Ii
zQo2Hd7aT!Yb46ikBHn=u@a8DUf)jAI0I7$iWJodwiGY%^AvmRiXX8K_A^>!YMrx5l
zSz=LUVp2{j<Rt#gl1flir=*so7UgE<rKTt(C4z2k&4=86kP0#kqz1D731m)DYFcVh
zYF=_`3T(r+Mq;r-enCM#NFV6J)C|z&#<`##cVbFPQEG8<YB8?Eok1A|WCdb91<Kq%
zq#Hxq5%c^KNd5+AA0k(>z?==;<c>O(P@WGx`~eb6pt1@aj0&k`sd)<E8%mP%^U6|-
zN+1`Ug6mAs4tCJGGQ>Os)LjrOP~sC;T>$n6R6Wcis9{IP@PxX9{7^+Nq-YVW;9>xp
zPY9PjxXXG_5{7sfvC@sGkf%*?gX|pK5rDJ!K@WM9RW8JpKO_dMzCNgA8Pp}zpov&$
z6APBXQP$jHjZ)ARtDb0UXc9{l^78Xi6(GerWCQ}#fCRDBi$U$B%shqM#FFHU)MDt&
z6R46=2+7DS2Gtjd3gtzK1qG=^3TdD<BOoh^^*nJMX8<ZLK}tM}L1S1TJMxQkpvJ;@
z)bG`R2hBWT%Vmn-HiGM3XbTLrQv=n3mi`AStWXArN)n6GQ%jHni#8<(B$i-F3@yyC
zr7l0Br&;n#(571QOF;7}sYOM&W?LW%APpwe(v<p%1>_WPQ3<gQcN*~{e%b}QkHOJO
zL1hDS0H`@Yx7I7zLiDh~mKFjM^D>js3K~%326PCdLS|lZW=bk}k1(Q(2i6giT3iCU
zzXLJ6QvfmuRNlacZNLhPp;Oz{3PGv4iJ5uMi8;9%nhLl!nE2(Fz_h`7a$r8pKIAy2
zR!<CU0kp_TL$(05pn)huD`%)0RIvGE^su5J;Xxg(0duw<SO6t7X;LVGttp0<NsvIr
zmimHH(^D%7pfL>{P(VJdwg@5*AI1jPZdk6Z@XIfO7^MNxq32s#T;iOcTacNPs-aX|
zl2}wytfZ-<pp;pnUJN?yu&5+6FCA&*5UN`#4y+b5ZU|Nh>IZ;DAgXaS;-R{WDo{(j
z;*ug%0qPflP@BOyy{H0wKMw8`3{ebA3e*VhG}6MGh=dFq(}TKI18<BFVIKY{OVc1G
z&S;WDU>?MXI&AqQ7}V9o=&^$D*i0=dR!GSQPm#lW`H&JDqz6(nq7=&@vos1yiVSrW
z3QCILLk-~b+7gS>OF^sXpog|4r9x)Wkwzej^%O9g{Gbh1d7z_nGK)c70%FD`l0c`!
zf%?wiLwUgc6Pz>gC14lB+RmssiawoVumivm1#<;T3m$8`6r=|&tAP&2AwSO2kRpwU
zgb(SS4f0qW3>`FZL_x;+u*NRd{8*Y)oLYifZ-JTuh*lEzIWhPEKd53!%*g>|7wC*v
zF?3=!6EcX0FsT@97smV=YMzFui8j<xFxF8piPcd6F^xd8UQVSYU=COu(p&>s4s{7w
z$|x4s<(hu^CBYD*LH<F_dJuP^ic!CUgIW*Hd>}XIC_wDRUCTjqpl3al@eq(f7y$~O
zKm(VhRF9lA4N#PTV}az@AtJlus^_4gp#kzTYFt6W5mk&PcbC8u5wtl7atcZ`V#{Gs
zsYUsy`70ANh5<^tpo~@pk_J~B;K7W{l49_tHr#ax$UKcq4BtYFZfbQUz_x(XY9{Uk
z3Q~lYJSq2E8Wzvdq}>8`J*2pV_z@%aAZ>rt$OFY0v0X}VPqG+MzCp}`_aoi&or@By
zD)Dq8VH%)Lz|!ZTX0$_X1IId~rvo(|srv{~6P{U;0UoY`It<zZCn0P=^#vq&bifU#
zl8nR>aAU71H95a5wJ0@30W1xf<pE`wMA%JDV5N{%?3tkPLC7i$@bm-3P09JW1&KwO
z#rb*YK@WGghEg&p=piFopjq6~ykrf{Y6W7W1YuBWQBiP75okdsY!L}8N6;m<5Do!H
z8{9QI3Pi>r%(X)<3e$*)LvpJdv{VirG$THisb5-QxCeV=<0!yDX#_k!M0Re4<i%n{
zRt05WP;SSbTfq~Kpahkw0BeXsOn~HOY`GHbJ|bci$7n4gfFK6Jtwov8g{5`6<xGfU
zAdyv3keXbQnnFy*1Z#si78H)qvXQiUht{!0p9}~I3mh}_urR_Bp|s3|P&Z+XR~&f|
z=2Eg_6Ft))hFFp6EXvBeH2My%Lh>xMDGjNuFas~YI1_xVG3t;JN*@T??F6+E3ZTm2
z>lgx{0vfRGk_Z9ZyCvajF!%UD8$?uTWy7t3q$3>7Y?vx62?)`%CMF2Ln|cZEdIXPJ
z!tK<cWUnN`6wGj>LGFacG&DV>f`bzyJwe7QQR_i0!}Q?MdC<KOP<J9SAH)FMgT=VV
z=Ak+vWB7V{dMYH1%|mq)GssKLGzzsAoI>%B%0pD5rBX727SBLDmarwFzyqgfsOz9J
zD7ZtP2=lOxPr%G4CVrr43X(RdQj)-I$A~6~9Z20b&=4VN>PH#MC1TtiWCGIoEodDo
zs4+NLhiAdg#oijE!-zZBc5tk~oIqf>9i#y*50Mi=!)k;b940s#fH>li`dJL(2;5PL
znbW|d&1iWIrQHG=J;XD1ORaHR$hawZ%+^Rp!5G_!I#?VsqE6gsI@C;%4^RgpaSX*$
zvr2;64UP(s15gHFp%x*Rc;I+I&r<^z5s=YyaEN0WJqL?pjR|sVCP;9l4dk#n%n8_|
z3?t`+6qVvV7!xvBo>{C=QdF9XXqkbuY2;Qq<>%+%7$g9zfap%j&(8t35TOZ%D%CL9
ze6T0MmLQvtlpsN>@FqvFW>9Yi(|@3&*FYX5H!*<i)__<54+82JmJn;uLINY6LBmp+
zc`l_ziQp4OFnV~PimxOy7t{<dN(FD80bPFwQx3VM3&%Zps77mmOwsepFW1lnoyn1#
z3S%1@Xo01IQ$Yt%;7B!SX2B|Q1+dPL%-mF1m5wX|aUEC*%!A0ufhx%j&0*l+hPe*r
zCLPFqfyj0vB}G&dup~;VML`;oaX@auM)L`xwE&I+Qe%nwIRf2%1S1PaZV5`vOGhgl
z6T#^YR9=Agmu2QDKn04xN;NX`l5<LnGs{xpyZ;mQAg%$Mg(F_{98*#>bisiK%^b)%
z2P}&$i8t#&?18q_z`7vu0bY&<cDx=$AT=)qnM>s<cw|q5gCF7|&`Pt!q7og2)VvhD
z*#ztjv^)Y0>dazT@dOnhF6?n-3UKfeANZ8z8Hl$uAc27#{6s_#t?~)XO?oAWat!Po
zL@Z(Ck4Q&fA8ZFDgT$fkgzShyJ}4P$Umm2xwGdH+z~=R!K?LJcIe9{D1*c5RQXF9!
zQt=JZf|evfMK(x+96uv1VuJY+)6-CcArU~8iVWmj*FxC99ekbyVl_BVLM%h_I%w`5
zwQmJpcmSG`B5gqh$RI2W4yf5I1X}@)SI9C0sM%<~L5oHTyhEP_6d+$gqYUCLlsEza
DFT|>T

literal 0
HcmV?d00001

diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl
new file mode 100644
index 0000000000000000000000000000000000000000..54124df1d3bbed65addd5df5f9c57c4ea07d4253
GIT binary patch
literal 173
zcmb=f)^pC!%}vcK3C}Fa$S*AkQBX=$s;%WpE6qz*&`4C!ax5-REh@>(&nwncsIJy?
z$xrsoOUu{uOUzBJt<|Wm)(c21O3W>;t<_Yh=HkpuQ^?R!$j?@=vQ<dbE78*^@kq@n
tNG;N|1_@RxWavTo8k!2VT%4HZCF+&vfUI%LFDg$gN=Z$Do6c3s1po<wIz0dY

literal 0
HcmV?d00001

diff --git a/vendor/github.com/stretchr/testify/require/requirements.go b/vendor/github.com/stretchr/testify/require/requirements.go
new file mode 100644
index 0000000000000000000000000000000000000000..91772dfeb919224e3f35b7e9f13d4b866a8339f7
GIT binary patch
literal 1131
zcmXR&OwLYBPgN*NEiBC}O6B6x*H;KhEiTE-OAk@VELKR&Q^?FKNi9lCOiooOFG?&Z
zNG(!GEXps<OHt4&fhg1q;VP*tNJY{I*HO*I=~`5jUzDbimS2>cSfWr|Qk0pOuA`7x
zlwPc$r>6%uyt-DCi_<MJGsiE#TtkzqmJ4ELiAQP<$V#|6g=#KNh!{kbzP^HUer`cx
zQD$*|o?~%wYEemMex6%tUNYGE3d#Aox%qhtX{C9|API$nqWqG4uye~ZQu9F4Aia6%
z3MJ+F3T25orK!bw3JT7Nc?wCX3Z=!VX{9-!FiFcVQYcAG%1Kp7DatHM%~JsRy;u+8
zNL&s8S*igGO&vr)R@b6&&;tTwV;IOSq<g3=F()%65fpz4i3-J;dFeT+5O0y}D=ZGc
z=OJu<aLUimq0kFS`T03ydH~aQH1~td*1<@Hpuh(wTFP9Wr;rLt`DD5siv!Rc4>ldE
z>(leC(o^$NixNvx6^b(ybdwd7l2a7)^z`GC^HWmOQ}Yzm)D+V56_QFbb5cO;<P-&6
z5RIe+p;kA)w4|W4L>F38*g{JR1>KU=+=86Ml2n+8UV6S>Np3-of^KGBa!zSVsxBnY
L>w+9!ti%NXA1jX?

literal 0
HcmV?d00001

diff --git a/vendor/modules.txt b/vendor/modules.txt
index 266b4c667d82e0104cc24fc5adf3dd2d7a9b2b8b..8468837fd6dc462c625fb2729eeac8f06d01f8db 100644
GIT binary patch
delta 26
icmZo)$GCbO<A#5RlW!Z!uotBkmSz^EZvJb?r3wI`#tT0H

delta 14
VcmZ3zj<J0m<A#5Ro0W_>RRJ+r1*HH0

-- 
GitLab