From 30aad0aa18cd9a2dcc37313e7631b5441374cdab Mon Sep 17 00:00:00 2001 From: fwx913451 Date: Thu, 27 Aug 2020 21:18:43 +0800 Subject: [PATCH 1/2] fuanan add package --- dl-tests.sh | 108 ++++++++++++++++++ find-up-2.1.0.tgz | Bin 0 -> 2234 bytes fixture-2.1.0.tar.bz2 | Bin 0 -> 222 bytes nodejs-find-up.spec | 53 +++++++++ nodejs-find-up.yaml | 4 + test.js | 247 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 412 insertions(+) create mode 100644 dl-tests.sh create mode 100644 find-up-2.1.0.tgz create mode 100644 fixture-2.1.0.tar.bz2 create mode 100644 nodejs-find-up.spec create mode 100644 nodejs-find-up.yaml create mode 100644 test.js diff --git a/dl-tests.sh b/dl-tests.sh new file mode 100644 index 0000000..776531b --- /dev/null +++ b/dl-tests.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +tag=$(sed -n 's/^Version:\s\(.*\)$/\1/p' ./*.spec | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') +url=$(sed -n 's/^URL:\s\(.*\)$/\1/p' ./*.spec | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') +pkgdir=$(basename $url | sed -s 's/\.git$//') + +echo "tag: $tag" +echo "URL: $url" +echo "pkgdir: $pkgdir" + +set -e + +tmp=$(mktemp -d) + +trap cleanup EXIT +cleanup() { + echo Cleaning up... + set +e + [ -z "$tmp" -o ! -d "$tmp" ] || rm -rf "$tmp" +} + +unset CDPATH +pwd=$(pwd) + +pushd "$tmp" +git clone $url +cd $pkgdir +echo Finding git tag +gittag=$(git show-ref --tags | cut -d' ' -f2 | grep "${tag}$" || git show-ref --tags | cut -d' ' -f2 | sort -Vr | head -n1) +if [ -z $gittag ]; then + gittag=tags/$tag +fi +echo "Git Tag: $gittag" +if [ -d "test" ]; then + git archive --prefix='test/' --format=tar ${gittag}:test/ \ + | bzip2 > "$pwd"/tests-${tag}.tar.bz2 +elif [ -d "tests" ]; then + git archive --prefix='tests/' --format=tar ${gittag}:tests/ \ + | bzip2 > "$pwd"/tests-${tag}.tar.bz2 +elif [ -d "spec" ]; then + git archive --prefix='spec/' --format=tar ${gittag}:spec/ \ + | bzip2 > "$pwd"/tests-${tag}.tar.bz2 +else + echo "No test directory found for tag ${gittag}" +fi +if [ -d "support" ]; then + git archive --prefix='support/' --format=tar ${gittag}:support/ \ + | bzip2 > "$pwd"/support-${tag}.tar.bz2 +fi +if [ -d "fixture" ]; then + git archive --prefix='fixture/' --format=tar ${gittag}:fixture/ \ + | bzip2 > "$pwd"/fixture-${tag}.tar.bz2 +fi +if [ -d "examples" ]; then + git archive --prefix='examples/' --format=tar ${gittag}:examples/ \ + | bzip2 > "$pwd"/examples-${tag}.tar.bz2 +elif [ -d "example" ]; then + git archive --prefix='example/' --format=tar ${gittag}:example/ \ + | bzip2 > "$pwd"/examples-${tag}.tar.bz2 +fi +if [ -d "tasks" ]; then + git archive --prefix='tasks/' --format=tar ${gittag}:tasks/ \ + | bzip2 > "$pwd"/tasks-${tag}.tar.bz2 +fi +if [ -d "docs" ]; then + git archive --prefix='docs/' --format=tar ${gittag}:docs/ \ + | bzip2 > "$pwd"/docs-${tag}.tar.bz2 +elif [ -d "doc" ]; then + git archive --prefix='doc/' --format=tar ${gittag}:doc/ \ + | bzip2 > "$pwd"/docs-${tag}.tar.bz2 +fi +if [ -d "src" ]; then + git archive --prefix='src/' --format=tar ${gittag}:src/ \ + | bzip2 > "$pwd"/src-${tag}.tar.bz2 +fi +if [ -d "tools" ]; then + git archive --prefix='tools/' --format=tar ${gittag}:tools/ \ + | bzip2 > "$pwd"/tools-${tag}.tar.bz2 +fi +if [ -d "scripts" ]; then + git archive --prefix='scripts/' --format=tar ${gittag}:scripts/ \ + | bzip2 > "$pwd"/scripts-${tag}.tar.bz2 +fi +if [ -d "modules" ]; then + git archive --prefix='modules/' --format=tar ${gittag}:modules/ \ + | bzip2 > "$pwd"/modules-${tag}.tar.bz2 +fi +if [ -d "ts" ]; then + git archive --prefix='ts/' --format=tar ${gittag}:ts/ \ + | bzip2 > "$pwd"/ts-${tag}.tar.bz2 +fi +if [ -d "build" ]; then + git archive --prefix='build/' --format=tar ${gittag}:build/ \ + | bzip2 > "$pwd"/build-${tag}.tar.bz2 +fi +if [ -d "fixtures" ]; then + git archive --prefix='fixtures/' --format=tar ${gittag}:fixtures/ \ + | bzip2 > "$pwd"/fixtures-${tag}.tar.bz2 +fi +if [ -d "mocks" ]; then + git archive --prefix='mocks/' --format=tar ${gittag}:mocks/ \ + | bzip2 > "$pwd"/mocks-${tag}.tar.bz2 +fi +if [ -d "typings" ]; then + git archive --prefix='typings/' --format=tar ${gittag}:typings/ \ + | bzip2 > "$pwd"/typings-${tag}.tar.bz2 +fi +popd diff --git a/find-up-2.1.0.tgz b/find-up-2.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..24904e1b5c1f14f1de98fa60256f3bb4b5a89607 GIT binary patch literal 2234 zcmV;r2u1fFiwFP!000001MOM;ZsWKS-+!a0m?p)=E^PTDUqE`++Fr?Xow&-hr{0tXUO3U9oo*d zJz=#l`PAP@9=!UMTfJW2-QEWJ+}qtzpY>+a$JW?sZo#X@R=rto?lpIIwqDh-(;&WI zTam|FEF)W>D!&vbSqv;ce<$sO2CyF3Gq%1D>tio)t8utqA>s`a(&GWqn|ed9Csdb7 zM|feBjvV6*uwm@^3`Pr>+y1o|Odt*+v;_+ya6Q4ChzpO&1i<$k7Dy%T)Ep)>!9p%Q zH01($Nb7>$12qE%YKmgTK{m5J|32PdCPdX8KFio*@qkGU z!#qYR%a?EI&8^vWILrVpYS9FHY9Xn!G#fsMcdsDCD zR$ZFfWjF0d=aEB@|4*5$h|NM}76NJDes5$Ww>)87Vk$xk!(_m2$BYBTP}KGWH4$VDWPvqYzh0(J#B2FfxVyv9ScM&EH% zef;zje7M88Yl$FoOw{%S4il`N#-9@L>dxFH{!J2=@(a$Rj2FX^WTgzDtkYPIoT);R zFD^0M2dMl~K~jHBuqYM*1Z)m{!Dk+#rSen7*Gl6!aOfTcin}EYX=O!U%MG-Iloj}Z z8t>C}cvse=DGStChPAfljS~x{7;9_UYSnVyaW5bV6{UKa){N~An2+A0sV15LI1I+9RJ;DT-H-!XV&Pg=6C=esMi=v9>m!lDkS2<`eto!cb1`a%F|j_?<-G zcXYbX9`mxY{1;uEZBq2FVkZ28Ig3suw~^ECpZ_fWr)k-<#F#I~|7K%rPsRWG)?Tx@ zwcDilU*CJl|G!BaP8nbx4xPmRP{K}G(~fw!5Z+`OLCGn@N`4LBKb}y(hSL2c8iD#u zVDO|u0z3&*CK#3p6M?6Txwy{-W5CDYOl>j2fDv)9g9U_Gdf)^;ifk{Sdcp<=71EG1 znj(zk<7kcvCo*I8AtiS_Jbo^?+=*wHhT3UZ#xxs`EUs{Ukj_{yD7-d*;A0kEtyuk5emvqR6eQ)Na5@@=zlGG3sZ_@=_0LgqGZ`lwtRZwfqwNpH#dPoM1QWHs{%%^;|x)M)nV+;%^ zlBqc^N0TXu?=TN13bA93?(;b4o+*sj?N<|tNKVk<4C#_D0L}{%v)ZQZf;HcMsYng9OhH%pB zv<)O48mL+8uwx{ma8XB{mU&u%cI&kD#!$0*h+=8PmS_j(CkBy7UJL(@hGwrz%Q)(F zhZc4#xJqldoO*5!j0&_Yb3g_;wtA-(jm(KNdI|*Rb&UjtObsg@K^E$t4U8oqw2f8= zvCuu;75C}CuUhE;v1RwaV75DB`pkU>8DGBtx3;$%h5B!2m+t?q#!LP8P1**ek4SLw zhl|75^IaI=?H0>@ObLScR>l08?eqqhrD+s}a=%uKgni@5s^jTgOlprk*Xi&Lke#WI|2*^zq}TkN?C!Bx6c|1wc+IDy>SoPapr44#k1z za1rQXFiA(UNn_5F;;=v)*&?MCF-G=33e=33-P*Izrymj$jqx9TrHU&b$ZDs+JqwGE z2NW0h+m~oEy zTn$xVMf&BliC?<5)i>#LBehMTl)m8V&0SvNKC@KWCvl@)rEe2g=r)lgb(wP5zoNqM zN?$>|$RJylWu<(0`4oJSmc2^Kn8&!|OSso@bs=tT+U~^1g^Oq6Gg_<`$)6Mcm8B#g zPg&0|*MDOv1M}2H$oAoi68d0*{yR=bvXoW@0Zg??+iZ5KRMOi3XYSs|`F8+ZGtsSJW`SE zv4}>@WvF7#X{HXxTt9i`A;|E0f=pjWOZW&##X~ZN<8#T>(_;QJqq0zji-GZf16J>B z1!VOmwETgAjBf`jjHaRz%cSM4rctf?pMS%}N=chbeptc&))(|kducE2r9D&oFXuw+ IqyQoS02vomE&u=k literal 0 HcmV?d00001 diff --git a/fixture-2.1.0.tar.bz2 b/fixture-2.1.0.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..62886189d0d48e82468b10971d7a642230a94e1c GIT binary patch literal 222 zcmV<403rWET4*^jL0KkKSsf=R1pom{f0W3806+i%|9}8MR6ujM{!jz}KmY&;FaX#F z85(J(MiV0h&=@et(@ioknHVO3z=}lEK}{JRri|3ujXh12?hcjiLFa@JRW}8TfB@x6 zSTZ<~5(Z=XK0|LGS`Ff)3cxt{@qW5WM3UFv5xf+7A35ip!_Z(>yhal&#zTxP1_PW~ z!5AT{5oHM}6u&A=H0eRTtI_#Q*CF{nC@ Y--Ez*9qU2In1TK- - 2.1.0-1 +- package init diff --git a/nodejs-find-up.yaml b/nodejs-find-up.yaml new file mode 100644 index 0000000..7a6b7a0 --- /dev/null +++ b/nodejs-find-up.yaml @@ -0,0 +1,4 @@ +version_control: github +src_repo: sindresorhus/find-up +tag_prefix: "^v" +seperator: "." diff --git a/test.js b/test.js new file mode 100644 index 0000000..557afe2 --- /dev/null +++ b/test.js @@ -0,0 +1,247 @@ +import fs from 'fs'; +import path from 'path'; +import test from 'ava'; +import tempfile from 'tempfile'; +import fn from './'; + +const name = { + pkgDir: 'find-up', + pkg: 'package.json', + fixtureDir: 'fixture', + baz: 'baz.js', + qux: 'qux.js' +}; + +// These paths are relative to the project root +const rel = { + fixtureDir: name.fixtureDir +}; +rel.baz = path.join(rel.fixtureDir, name.baz); +rel.qux = path.join(rel.fixtureDir, name.qux); +rel.barDir = path.join(rel.fixtureDir, 'foo', 'bar'); + +const abs = { + pkgDir: __dirname +}; +abs.pkg = path.join(abs.pkgDir, name.pkg); +abs.fixtureDir = path.join(abs.pkgDir, name.fixtureDir); +abs.baz = path.join(abs.fixtureDir, name.baz); +abs.qux = path.join(abs.fixtureDir, name.qux); +abs.barDir = path.join(abs.fixtureDir, 'foo', 'bar'); + +// Create a disjoint directory, used for the not-found tests +test.beforeEach(t => { + const tmpDir = tempfile(); + fs.mkdirSync(tmpDir); + t.context.disjoint = tmpDir; +}); + +test.afterEach(t => { + fs.rmdirSync(t.context.disjoint); +}); + +test('async (child file)', async t => { + const filePath = await fn(name.pkg); + + t.is(filePath, abs.pkg); +}); + +test('sync (child file)', t => { + const filePath = fn.sync(name.pkg); + + t.is(filePath, abs.pkg); +}); + +test('async (child dir)', async t => { + const filePath = await fn(name.fixtureDir); + + t.is(filePath, abs.fixtureDir); +}); + +test('sync (child dir)', t => { + const filePath = fn.sync(name.fixtureDir); + + t.is(filePath, abs.fixtureDir); +}); + +test('async (child file, custom cwd)', async t => { + const filePath = await fn(name.baz, { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.baz); +}); + +test('sync (child file, custom cwd)', t => { + const filePath = fn.sync(name.baz, { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.baz); +}); + +test('async (child file, array, custom cwd)', async t => { + const filePath = await fn([name.baz], { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.baz); +}); + +test('sync (child file, array, custom cwd)', t => { + const filePath = fn.sync([name.baz], { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.baz); +}); + +test('async (first child file, array, custom cwd)', async t => { + const filePath = await fn([name.qux, name.baz], { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.qux); +}); + +test('sync (first child file, array, custom cwd)', t => { + const filePath = fn.sync([name.qux, name.baz], { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.qux); +}); + +test('async (second child file, array, custom cwd)', async t => { + const filePath = await fn(['fake', name.baz], { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.baz); +}); + +test('sync (second child file, array, custom cwd)', t => { + const filePath = fn.sync(['fake', name.baz], { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.baz); +}); + +test('async (cwd)', async t => { + const filePath = await fn(name.pkgDir, { + cwd: abs.pkgDir + }); + + t.is(filePath, abs.pkgDir); +}); + +test('sync (cwd)', t => { + const filePath = fn.sync(name.pkgDir, { + cwd: abs.pkgDir + }); + + t.is(filePath, abs.pkgDir); +}); + +test('async (cousin file, custom cwd)', async t => { + const filePath = await fn(name.baz, { + cwd: rel.barDir + }); + + t.is(filePath, abs.baz); +}); + +test('sync (cousin file, custom cwd)', t => { + const filePath = fn.sync(name.baz, { + cwd: rel.barDir + }); + + t.is(filePath, abs.baz); +}); + +test('async (nested descendant file)', async t => { + const filePath = await fn(rel.baz); + + t.is(filePath, abs.baz); +}); + +test('sync (nested descendant file)', t => { + const filePath = fn.sync(rel.baz); + + t.is(filePath, abs.baz); +}); + +test('async (nested descendant dir)', async t => { + const filePath = await fn(rel.barDir); + + t.is(filePath, abs.barDir); +}); + +test('sync (nested descendant dir)', t => { + const filePath = fn.sync(rel.barDir); + + t.is(filePath, abs.barDir); +}); + +test('async (nested cousin dir, custom cwd)', async t => { + const filePath = await fn(rel.barDir, { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.barDir); +}); + +test('sync (nested cousin dir, custom cwd)', t => { + const filePath = fn.sync(rel.barDir, { + cwd: rel.fixtureDir + }); + + t.is(filePath, abs.barDir); +}); + +test('async (ancestor dir, custom cwd)', async t => { + const filePath = await fn(name.fixtureDir, { + cwd: rel.barDir + }); + + t.is(filePath, abs.fixtureDir); +}); + +test('sync (ancestor dir, custom cwd)', t => { + const filePath = fn.sync(name.fixtureDir, { + cwd: rel.barDir + }); + + t.is(filePath, abs.fixtureDir); +}); + +test('async (not found)', async t => { + const filePath = await fn('somenonexistentfile.js'); + + t.is(filePath, null); +}); + +test('sync (not found)', t => { + const filePath = fn.sync('somenonexistentfile.js'); + + t.is(filePath, null); +}); + +// Both tests start in a disjoint directory. `package.json` should not be found +// and `null` should be returned. +test('async (not found, custom cwd)', async t => { + const filePath = await fn(name.pkg, { + cwd: t.context.disjoint + }); + + t.is(filePath, null); +}); + +test('sync (not found, custom cwd)', t => { + const filePath = fn.sync(name.pkg, { + cwd: t.context.disjoint + }); + + t.is(filePath, null); +}); From 21c6f3657476ce45dafa4311781f1b30a3047fac Mon Sep 17 00:00:00 2001 From: fwx913451 Date: Mon, 7 Sep 2020 20:22:01 +0800 Subject: [PATCH 2/2] fuanan add package --- find-up-2.1.0.tgz | Bin 2234 -> 0 bytes fixture-2.1.0.tar.bz2 | Bin 222 -> 0 bytes nodejs-find-up.spec | 6 ++---- v2.1.0.tar.gz | Bin 0 -> 3825 bytes 4 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 find-up-2.1.0.tgz delete mode 100644 fixture-2.1.0.tar.bz2 create mode 100644 v2.1.0.tar.gz diff --git a/find-up-2.1.0.tgz b/find-up-2.1.0.tgz deleted file mode 100644 index 24904e1b5c1f14f1de98fa60256f3bb4b5a89607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2234 zcmV;r2u1fFiwFP!000001MOM;ZsWKS-+!a0m?p)=E^PTDUqE`++Fr?Xow&-hr{0tXUO3U9oo*d zJz=#l`PAP@9=!UMTfJW2-QEWJ+}qtzpY>+a$JW?sZo#X@R=rto?lpIIwqDh-(;&WI zTam|FEF)W>D!&vbSqv;ce<$sO2CyF3Gq%1D>tio)t8utqA>s`a(&GWqn|ed9Csdb7 zM|feBjvV6*uwm@^3`Pr>+y1o|Odt*+v;_+ya6Q4ChzpO&1i<$k7Dy%T)Ep)>!9p%Q zH01($Nb7>$12qE%YKmgTK{m5J|32PdCPdX8KFio*@qkGU z!#qYR%a?EI&8^vWILrVpYS9FHY9Xn!G#fsMcdsDCD zR$ZFfWjF0d=aEB@|4*5$h|NM}76NJDes5$Ww>)87Vk$xk!(_m2$BYBTP}KGWH4$VDWPvqYzh0(J#B2FfxVyv9ScM&EH% zef;zje7M88Yl$FoOw{%S4il`N#-9@L>dxFH{!J2=@(a$Rj2FX^WTgzDtkYPIoT);R zFD^0M2dMl~K~jHBuqYM*1Z)m{!Dk+#rSen7*Gl6!aOfTcin}EYX=O!U%MG-Iloj}Z z8t>C}cvse=DGStChPAfljS~x{7;9_UYSnVyaW5bV6{UKa){N~An2+A0sV15LI1I+9RJ;DT-H-!XV&Pg=6C=esMi=v9>m!lDkS2<`eto!cb1`a%F|j_?<-G zcXYbX9`mxY{1;uEZBq2FVkZ28Ig3suw~^ECpZ_fWr)k-<#F#I~|7K%rPsRWG)?Tx@ zwcDilU*CJl|G!BaP8nbx4xPmRP{K}G(~fw!5Z+`OLCGn@N`4LBKb}y(hSL2c8iD#u zVDO|u0z3&*CK#3p6M?6Txwy{-W5CDYOl>j2fDv)9g9U_Gdf)^;ifk{Sdcp<=71EG1 znj(zk<7kcvCo*I8AtiS_Jbo^?+=*wHhT3UZ#xxs`EUs{Ukj_{yD7-d*;A0kEtyuk5emvqR6eQ)Na5@@=zlGG3sZ_@=_0LgqGZ`lwtRZwfqwNpH#dPoM1QWHs{%%^;|x)M)nV+;%^ zlBqc^N0TXu?=TN13bA93?(;b4o+*sj?N<|tNKVk<4C#_D0L}{%v)ZQZf;HcMsYng9OhH%pB zv<)O48mL+8uwx{ma8XB{mU&u%cI&kD#!$0*h+=8PmS_j(CkBy7UJL(@hGwrz%Q)(F zhZc4#xJqldoO*5!j0&_Yb3g_;wtA-(jm(KNdI|*Rb&UjtObsg@K^E$t4U8oqw2f8= zvCuu;75C}CuUhE;v1RwaV75DB`pkU>8DGBtx3;$%h5B!2m+t?q#!LP8P1**ek4SLw zhl|75^IaI=?H0>@ObLScR>l08?eqqhrD+s}a=%uKgni@5s^jTgOlprk*Xi&Lke#WI|2*^zq}TkN?C!Bx6c|1wc+IDy>SoPapr44#k1z za1rQXFiA(UNn_5F;;=v)*&?MCF-G=33e=33-P*Izrymj$jqx9TrHU&b$ZDs+JqwGE z2NW0h+m~oEy zTn$xVMf&BliC?<5)i>#LBehMTl)m8V&0SvNKC@KWCvl@)rEe2g=r)lgb(wP5zoNqM zN?$>|$RJylWu<(0`4oJSmc2^Kn8&!|OSso@bs=tT+U~^1g^Oq6Gg_<`$)6Mcm8B#g zPg&0|*MDOv1M}2H$oAoi68d0*{yR=bvXoW@0Zg??+iZ5KRMOi3XYSs|`F8+ZGtsSJW`SE zv4}>@WvF7#X{HXxTt9i`A;|E0f=pjWOZW&##X~ZN<8#T>(_;QJqq0zji-GZf16J>B z1!VOmwETgAjBf`jjHaRz%cSM4rctf?pMS%}N=chbeptc&))(|kducE2r9D&oFXuw+ IqyQoS02vomE&u=k diff --git a/fixture-2.1.0.tar.bz2 b/fixture-2.1.0.tar.bz2 deleted file mode 100644 index 62886189d0d48e82468b10971d7a642230a94e1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmV<403rWET4*^jL0KkKSsf=R1pom{f0W3806+i%|9}8MR6ujM{!jz}KmY&;FaX#F z85(J(MiV0h&=@et(@ioknHVO3z=}lEK}{JRri|3ujXh12?hcjiLFa@JRW}8TfB@x6 zSTZ<~5(Z=XK0|LGS`Ff)3cxt{@qW5WM3UFv5xf+7A35ip!_Z(>yhal&#zTxP1_PW~ z!5AT{5oHM}6u&A=H0eRTtI_#Q*CF{nC@ Y--Ez*9qU2In1TK- z^cf3o!&}xqJ-9yzY}bjw#$)OR`!%$HHK^^>YgW~$@9vu0<~F6eRjnB{W2-)>R=>9f z)Y87T%o(f?EZa3pp;xMxYvpR?et6(|*xlV;y#C>PYW;6j;dlFf#7V=SeEp~GU#6xV zFyCOVWv|csO8?(jX#e`|&b0mE2jQA=R|gCvP>F53m`W@!;B_ z*q{$I>Y8WFI&*9nYaB~6M!L@__6q~6^t~4N_V_IDbsJEIXO|;8pxo098WFZ#PW|8v z<{E?@;lDl;*;|A*twaJL(rR4+P`95J==-C7^c?$&<^wf%sB|b zgzMt5Z2ebZtxvE2-9{r@{|^99NIW0N^r{o{gCqI+SPY{m%ze>mP!+3!7sIwniSy)_<*9n_2(0?QH*l z2w;3qBcwziBoD8|7voo&qr1ZpLh?N#{KGr0sb7hl+sVn_MlSOie{4vvf8Fyg=r!}# z>j0Lm|D8GOztN~>>;D0Ox)-+3TucDt+8*n0_`AX{T;I6p-|@2x>T{d9durX!Z2?aJ zr~E*79O)uFzDL@!qIBXzd|?El6ZsZ6?xnkn4wz3kXzz=hfZ*VbNohzFQ7r!C=x`_v zCfFy<{)_#`&6AVEX21FPAAs@0W2}2T>90C#@u)1Fi#&wQM|(2=FbHkO+#}4gw0JZh zMeR*a<0I(LF3${yxm5KK-)AQE0-#aTP^L3(__i0wp^IUbO3A^A!OYZ%(R^k5r`Nw_ zUj?C0*PI8&^{`_8x3S%*W%=I+fcf?x=)acVJzV~0*8bZ&VE@ej-#^T^zs1-ZeZU>o z|MphBk*)s+fW`J7=>D4Kz#Z(rQ{Am*_J07l-Ts&ld{3$OWjyZS|97{mS^n=KV7~o7 zgjZjA|KF|FGy6XPr0tLQtLwD9geCT`?e5Hp|La-)?;#);a!NQHkBuPrgJv)|F%wS@ zMr5D(^h0R-G@rwAt`N04%z$(F$rO&PEk&rByizFBE06gB2h6->JJi+3v`Cm2@B-O? zN$%+8<+XDYpiH! zhX%y_5(}GmGH#_pD0gf(D490b2M#T{^eQNcXDKc#2|7Bo!iQ<2iM5T(5t=KH2_UK8 zm>Ir_nV4K?VS(L|^|YbYJey}_q4`@)98FTNuRuon33Vooie^KjO|Sp7|95PIx_qsd zzuzqN|Ml9|?u`F$)VDJK{{YY*QS!3gCr8rqBoBpxrX4Wv+P8A@uNDd{nP z6ms%cE{a@~ej1K-+ksU!eoFGm2CM=?C)5Y$iD^$_b26en9bA*4537rsFwcET39|@3 zC>w&q2pG}bYvNI#LkBhpblbJvA<>Be0%?F5jDQShR&c34G7G9$!H zwyxZ=15O|h&X#QURFBPqU}93;(QKDsThv4@?O?=0@G?~Hhd`r9Y}ar?6J>~+9eZpm z4%l62iEBU!gn?x8{hr6P_smm@Y#kHqGh1&#q&Qqjj`pfbVn9W?^1L3E2@Y8!_(@pF7n z({M)U0|pzNF_{D|3qVvU0vf=Jt*V+tqMQtF+xew^*g7Pe%^s9Di{y2?|DyA%PXMFaJnp|Co#&)^{D%Ck zeSBCXt-qgiTfH9XbhY-&lcRPE>e|N#N3Ras$3K&2(C@ed^Suod9f)xg_S*-qj+$L^@~V5%>9v6UA&@<8A3yH` zm)6VHalZ^)p^mhEfdc8hXdWFQE3Nqor0=49vTcYd$+_ zNmekZgQI5qWsw{Ubq=Kp@DT@FKmS6Q+6N2Qh)jR@PV4mZY z`O07Wb|Zsjklz23FLBq$W7+v{8}|B{{BI*W|33tL)Ck$cC~!bf%BxP*^4!K9Scbu{v0v)Wd)!b$4c47>CVas7Y>;aO1+Vik8cwkxQQ;%`{ z!-H$APDT-xlt_9ATd)r}AH_BFMDA34B2b}`Vqh{&FAi5Cw9ubH63x(hBbZWm2{R$NaP(*+yAVWt1wk3sy6Ax;oN>`5Ws&D@e1hJ z6KX*sHJIjAf$M2R9H+^QJgDfni`ySpORI!Lrv2jJ&N8) zY1;Yux%O@H)e6G@1On!|DYN+Y;9vBu1N|lQhL9C z`nPHdUE5&3TlUe)kg~|h6AMgKmeZ$8@rfkRERoY_V>cW-c5g#F z7=;7j+2(mPL@tmLIXG%7gWH_QEI*R;-VXt3IW>uggoHmtWf%_QR9r2^2TY-%h%PwB z&m%1ESrU}Roxmi(MCI$QaHEQq)Qn1RY8vJ`|N9?unmRJXoM$tbUwebTXGq6?cxYMs z_3x7SuU6Y>%>4a#qfyP?e?J7+V@$;oiwi$Oau(11ps7mfAw{*g*PS%rG*Jz3j!M?c zLzHTZiZO!as-|)UDpedHoaR1mrLexi!R?VrAW#%_d&ocb8(6CzszlhLfb|fQK!tq1 ziscXC6_n+3mYle>gh-@6qMVA+!8QX;KYp{*2P#w*$t2i5*>tFjt)qLh`OJ+6QA272QeH5FMujSDLDjvz|&ejJ5v{g zC^)p1p&>9F)p-t zdHfz2^e}vpC|DifO*Q`Ub$KGizM}Ahj8O$M-GZ}5iWkuH#}j%pR0@gS`J65;>GQ@2 z&sO4=8FV2l)3RfmdgGyA>NYOjd}0ouyf)8ASVf{NpXN4?*+Mp!Djy1V!$2-P8DLrm4^;1ttg)};46i+Bash1<_ael=q;9> z7V7h~vMy=n=t%c{{raw|I*p`zdr!)mE8S9^tywIkHF-i>v+lq}$G-he;z}n!qs7mZ z_A_;P4`M2~gK%kCf5+zJtSyqLYafamaFu1QKEH zDqh9Et&e%60T#lE^**)%8A;v2t1Xu3u6w}hqA2aSP{3C~l*8fQ)ZJj^h)0F