From 2f21a24831b30d7619413911634cb368f5166141 Mon Sep 17 00:00:00 2001 From: Tiger Kaovilai Date: Wed, 2 Aug 2023 16:44:05 -0400 Subject: [PATCH] use wait.PollImmediate addresses https://github.com/vmware-tanzu/velero/pull/6354#pullrequestreview-1537141771 Signed-off-by: Tiger Kaovilai --- changelogs/unreleased/6354-kaovilai | 2 +- config/crd/v1/bases/velero.io_restores.yaml | 17 +++++++ config/crd/v1/crds/crds.go | 2 +- .../existing-resource-policy_design.md | 45 +++++++++++++++---- pkg/apis/velero/v1/restore_types.go | 10 +++++ pkg/apis/velero/v1/zz_generated.deepcopy.go | 5 +++ pkg/controller/restore_controller.go | 5 ++- pkg/restore/restore.go | 12 ++--- 8 files changed, 81 insertions(+), 17 deletions(-) diff --git a/changelogs/unreleased/6354-kaovilai b/changelogs/unreleased/6354-kaovilai index cd6fe7ddf4..2ef21a4684 100644 --- a/changelogs/unreleased/6354-kaovilai +++ b/changelogs/unreleased/6354-kaovilai @@ -1 +1 @@ -Implement recreate ExistingResourcePolicy to restore API \ No newline at end of file +Implement recreate ExistingResourcePolicy to restore API to enable restore for immutable resources such as Pods. \ No newline at end of file diff --git a/config/crd/v1/bases/velero.io_restores.yaml b/config/crd/v1/bases/velero.io_restores.yaml index d0659409c2..d57cd92345 100644 --- a/config/crd/v1/bases/velero.io_restores.yaml +++ b/config/crd/v1/bases/velero.io_restores.yaml @@ -62,6 +62,23 @@ spec: - recreate nullable: true type: string + existingResourcePolicyRecreateResources: + description: ExistingResourcePolicyRecreateResources is a slice of + resource names where recreate ExistingResourcePolicy will apply. + Resoruce names can be in the format of "group/version/resource" + or "resource" If empty, a default list of resources (Pod, PV, Secret, + ConfigMap) will be used. Resources with finalizers without velero.io/recreate-remove-finalizer=true + annotation will not be recreated. Recreate will not recreate resources + with ownershipReferences. + example: + - pods + - persistentvolumes + - secrets + - configmaps + items: + type: string + nullable: true + type: array hooks: description: Hooks represent custom behaviors that should be executed during or post restore. diff --git a/config/crd/v1/crds/crds.go b/config/crd/v1/crds/crds.go index 7680d78f9d..e9d1a67813 100644 --- a/config/crd/v1/crds/crds.go +++ b/config/crd/v1/crds/crds.go @@ -36,7 +36,7 @@ var rawCRDs = [][]byte{ []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4VM\x93\xdb6\f\xbd\xfbW`\xa6\x87\xb43\x91\x9c\xb4\x97\x8eo\xad\x93\xc3N\xd24\xb3N\xf7NS\xb0\xc4.E\xb2\x04\xe8\xcd\xf6\xd7w@J\xfe\x94\xbd\xdeCu\x13\t\x82\x8f\x0f\x0f\x8f\xac\xaaj\xa6\x82y\xc0Hƻ\x05\xa8`\xf0;\xa3\x93?\xaa\x1f\x7f\xa5\xda\xf8\xf9\xf6\xfd\xecѸf\x01\xcbD\xec\xfb{$\x9f\xa2\xc6\x0f\xb81ΰ\xf1n\xd6#\xabF\xb1Z\xcc\x00\x94s\x9e\x95\f\x93\xfc\x02h\xef8zk1V-\xba\xfa1\xadq\x9d\x8cm0\xe6\xe4\xe3\xd6\xdbw\xf5\xfb\x9f\xebw3\x00\xa7z\\@㟜\xf5\xaa\x89\xf8OBb\xaa\xb7h1\xfa\xda\xf8\x19\x05Ԓ\xbb\x8d>\x85\x05\xec'\xca\xdaa߂\xf9Ð澤\xc93\xd6\x10\x7f\x9a\x9a\xfdl\x86\x88`ST\xf6\x1cD\x9e$\xe3\xdadU<\x9b\x9e\x01\x90\xf6\x01\x17\xf0E`\x04\xa5\xb1\x99\x01\fG̰\xaa\xe1t\xdb\xf7%\x95\xee\xb0W\x05/\x80\x0f\xe8~\xfbz\xf7\xf0\xcb\xeah\x18\xa0A\xd2\xd1\x04\xceD\x9d`\x06C\xa0`@\x00\xecw\xa0@9P\x91\xcdFi\x86M\xf4=\xac\x95~La\x97\x15\xc0\xaf\xffF\xcd@\xec\xa3j\xf1-P\xd2\x1d(\xc9WB\xc1\xfa\x166\xc6b\xbd[\x14\xa2\x0f\x18ٌ,\x97\xef@C\a\xa3'\xc0\xdf\xc8\xd9J\x144\"\x1e$\xe0\x0eG~\xb0\x19\xe8\x00\xbf\x01\xee\fA\xc4\x10\x91\xd0\x159\x1d%\x06\tRn8A\r+\x8c\x92\x06\xa8\xf3\xc96\xa2\xb9-F\x86\x88ڷ\xce\xfc\xbb\xcbM\u0090lj\x15\x8fr\xd8\x7f\xc61F\xa7,l\x95M\xf8\x16\x94k\xa0W\xcf\x101\xf3\x94\xdcA\xbe\x1cB5\xfc\xe1#\x82q\x1b\xbf\x80\x8e9\xd0b>o\r\x8f\xbd\xa3}\xdf'g\xf8y\x9e\xdb\xc0\xac\x13\xfbH\xf3\x06\xb7h\xe7d\xdaJE\xdd\x19F\xcd)\xe2\\\x05Se\xe8.\xf7O\xdd7?ġ\xdb\xe8\xcd\x11V~\x16\x99\x11G\xe3ڃ\x89\xac\xf9+\x15\x10\xd5\x17\xc1\x94\xa5\xe5\x14{\xa2eHع\xff\xb8\xfa\x06\xe3ֹ\x18\xa7\xec\x17\xe5\xec\x16Ҿ\x04B\x98q\x1b\x8c\xa5\x88Yy\x92\x13]\x13\xbcq\x9c\x7f\xb45\xe8N駴\xee\r\xd3(f\xa9U\r\xcbl(\xb0FH\xa1Q\x8cM\rw\x0e\x96\xaaG\xbbT\x84\xff{\x01\x84i\xaa\x84\xd8\xdbJp腧\xc1\x85\xb5\x83\x89\xd1\xc9.\xd4\xeb\xa4\xd5W\x01\xb5TO\b\x94\x95fctn\r\xd8\xf8\bj\xdf\xf9\x03\x81\xf5Q\xe6\xe9\xce\xcd\xe0Tl\x91OGO\xb0|\xcbA\xb2\xfdS\xa7\x8e\x8d\xe6G\xac\xdbZ\xbc\x82\x06 \xc5=~\xaa\xcf2^\xc6\x00\x93\xea\x9dD2\x8aXh\x10^\xc5\nĤ\x0e1\x9do-\x1f\xba\xd4OoP\xc1\xef\x19\xf3g\xdf^\x9d_z\xc7\"\xf7\xabA\x0fަ\x1eWN\x05\xea\xfc\v\xb1w\x8c\xfd\x9f\x01c\xb91\xaf\x86\x8e\x17\xef\ue5ba\x12\x98\xec\xc5}\xefQ\xfc\x1e/\x9ft\b\xb8)\xcb\r\x98\x86ț\x0e\xba\\ݽ\x86\xc2\v\xe1\xaf(ҝ\xdb\xf8\xe9\xb8\v\xed=~\xf9\x1a\x7fY\xab\xf2\x10\x18\xb5*K\xca݆\xf0)\xad1:d\xa4\xbd\xcd>\x19\xee&3\x02}S\xe6\x84H\xf9\x01\xa4\xd5\xe9\xd3K\xbe5B\x83\x16\x19\x1bX?\x97\x1b\xe9\x99\x18\xfbs\xdc\x1b\x1f{\xc5\v\x90˻b3!#\x97\xacUk\x8b\v\xe0\x98.\xa9l\xf2\xe0\xa1S4цGg\xfe*1S\xc2\xd85\xe3Ue\xc0\xc5{\xa3\x82/\xf841\xfa5z\x8dDx\xdeF\x17O2\xd9\x04g\x83$/\xac急\xe1\xe1>\x8c\xfc\x17\x00\x00\xff\xff\t\x15i;\xcd\r\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xc4YKs\x1b7\xf2\xbf\xebSt9\a\xfdSe\x0ec\xff\xb7\xb6\xb6x\xb3\xe5͖v\x13Yeʾ\xa4r\x00\a=3\x88f\x00\x04\xc0P\xe2\xa6\xf2ݷ\x1a\x0fr\x1e )\xa9\xd6\u07b9H\x04\x1a\x8d\x1f\x1a\xfd\xc6b\xb1\xb8`Z|Ac\x85\x92+`Z\xe0\xa3CI\xbflq\xff7[\b\xb5ܾ\xb9\xb8\x17\x92\xafષNu\x9fЪޔ\xf8\x01+!\x85\x13J^t\xe8\x18g\x8e\xad.\x00\x98\x94\xca1\x1a\xb6\xf4\x13\xa0T\xd2\x19նh\x165\xca\xe2\xbe\xdf\xe0\xa6\x17-G㙧\xad\xb7?\x14o\xde\x16?\\\x00H\xd6\xe1\n\xb4\xe2[\xd5\xf6\x1dnXy\xdfk[l\xb1E\xa3\n\xa1.\xacƒx\xd7F\xf5z\x05\x87\x89\xb06\xee\x1b0\xdf*\xfeųy\xef\xd9\xf8\x99VX\xf7\xaf\xdc\xecO\xc2:O\xa1\xdbްv\x0e\xc2OZ!\xeb\xbeef6}\x01`K\xa5q\x057\x04C\xb3\x12\xf9\x05@<\xa2\x87\xb5\x00ƹ\x17\x1ako\x8d\x90\x0e\xcd\x15qH\xc2Z\x00G[\x1a\xa1\x9d\x17ʭ\xe2\x10\x00B@\b\xd61\xd7[\xb0}\xd9\x00\xb3p\x83\x0f\xcbkykTm\xd0\x06x\x00\xbfY%o\x99kVP\x04\xf2B7\xccb\x9c\r\xe2]\xfb\x898\xe4v\x04\xda:#d\x9d\x83q':\x84\x87\x06%\xb8FX\b\xa7\x85\af\t\x8eq\xfe\x94\xf9\x8d\xfd<-\xb7\x8euz\x84\xe0\xca ;,\r\x108s\x98\x03\xb0\x97'\xa8\n\\\x83$y\xafXLH!k?\x14n\x02\x9c\x82\rz\x88ȡ\xd7\x19d\x1a\xcbB+^\xc8\xc4t\x04\xebf2zN6D\xff\xdfF5\x02t\xab\xf8\v\xa0\x98\x9d\xb8\x01\ng ,\xb0\xb84\x9c\xe2 \xe8\xe4\x8e>\xfd}}\aik\x7f\x19S\xe9{\xb9\x1f\x16\xda\xc3\x15\x90\xc0\x84\xacȬ\xe9\x12+\xa3:\xcf\x13%\xd7JH\xe7\x7f\x94\xad@9\x15\xbf\xed7\x9dpt\xef\xbf\xf7h\x1d\xddU\x01W>S \xf7\xd4k\xd2\\^\xc0\xb5\x84+\xd6a{\xc5,~\xf5\v I\xdb\x05\t\xf6iW0Lr\xa6\xc4Aj\x83\x89\x94\xa2\x1c\xb9\xafIޱ\xd6X\xd2\xed\x91\x00i\xa5\xa8D\xf4P\x952\xc0\xa6\xe4ňq\xdep\xe9\xcbz\xa7)\xd1\x04\xd9\xfbܚ\x84M\x0e|jr\x98\x81r\xc6\x14\xa0\x9dz\xd9\xfd\x1a\x83ZY\xe1\x94\xd9\x11\xe3\xe0`\x8b\x19\x87#\xd7@\x9fT\x1cϜ\xe3Fq\xcc\xc1\xa6\xa5\xe0\x1a\x16\xb4\x95\xf2+\xf2G\xbd\x94\xf3]\xe8S\xf2Y\xc0\xb4\xe2gp\xc5\x1d\x19\x18\xacР,19\xaeS\xc9C\x06\xd90\xac\xcf1\x1eW\n8\xe1ճ\x88\xdf\xdd^'O\x9e\x84\x18\xb1\xbb\xf9\xbeg\xe4C_%\xb0\xe5>Н\xdf\xfb\xf2\xba\n\x9by\x9f\xe6\x140\xd0\x02C\x1a\xb8\x0f\x12 \xa4u\xc88\xa8*ˑj\x12 \xc37\x18W\xbc\x0e\x1e,\xba\xcaCh!\xd9\x03#\xdf)8\xfcs\xfd\xf1f\xf9\x8f\x9c\xe8\xf7\xa7\x00V\x96h}\x16\xec\xb0C\xe9^\xef\x13s\x8eV\x18\xe4\x94fc\xd11)*\xb4\xae\x88{\xa0\xb1\xbf\xbc\xfd5/=\x80\x1f\x95\x01|d\x9dn\xf15\x88 \xf1\xbd[NJ#l\x10Ǟ#<\b\u05c8i0\xddK\x80\xd4+\x1e\xfb\xc1\x1fױ{\x04\x15\x8f\xdb#\xb4\xe2\x1eW\xf0ʧ5\a\x98\x7f\x90\xed\xfc\xf9\xea\b\xd7\xff\v\xa6\xfd\x8a\x88^\x05p\xfb8<4\xba\x03\xc8`yF\xd45\x1e\xb2\xaa\xe9\xe7\x83\n\xb9\xea\xefA\x19\x92\x80T\x03\x16\x9e1\xdd^p\x94\xc8g\xa0\x7fy\xfb\xebQ\xc4cy\x81\x90\x1c\x1f\xe1-\x88X\xdahſ/\xe0\xcek\xc7N:\xf6H;\x95\x8d\xb2xL\xb2J\xb6\xbb\x90\xe7n\x11\xac\xa2B\t\xdbv\x11\xf2 \x0e\x0flGRH\x17G\xfa\xc6@3\xe3Njk\xca~\xee>~\xf8\xb8\n\xc8H\xa1j\xef\x89)jV\x82\xb2\x19JcB,\xf6\xda8\v\xe6\xe9\xb3}P\x1f\xa7\xa0l\x98\xac1\x9c\x17\xa1\xea):\x16\x97/\xb1\xe3yJ\x92\xbeLj2u\x1c\xff\xb3\xe0\xfe\xc4\xc3\xf9\f\xfa\t\x87\x1bV\x19'\x0fw\xdfo\xd0Ht\xe8\xcf\xc7Ui\xe9h%jg\x97j\x8bf+\xf0a\xf9\xa0̽\x90\xf5\x82Ts\x11t\xc0.}\x99\xba\xfc\xce\xffy\xf1Y|E\xfb\xd4\x03\x8d*\xed\xafy*\xda\xc7._t\xa8\x94\xc3>=\x8e]\xaecf5]Kf\xf1Ј\xb2I\xc5I\xf4\xb1G\x8cIP&̃kfr\xf7\xd5U\x99\x04\xda\x1bB\xb4[\xc4^ڂIN\xff[a\x1d\x8d\xbfH\x82\xbdx\x92\xf9~\xbe\xfe\xf0m\x14\xbc\x17/\xb2\xd5#\tx\xf8\x1e\x17\aX\x8b\x8e\xe9E\xa0fNu\xa2\x9cPSVz\xcdI\xf0\x95@s&\x8d\xfb4\"N\x89f&\xbf\xdd\xd3<+\x8ft\xac\xce$n\xc3\xd6\xe1\xa9\xf4\ue93cƍ\x1bV[`\x06\x81A\xc74\xdd\xf3=\xee\x16!!\xd0LP4\xa7\x80\xbd\xef\x8a\x00Ӻ\x15\xd9\xc0\x1d\xc3~LY\xa3$\xa8,g\xb5=v\xf6쭥.\xd0\x1a\x1d\x95\xad\xdfD\x0e\x9f'{>Y&\xf9\xc4z$\x8a\xaa\x90\xbb\xaa\xbdoy\x96\xa9\x8e\x9f\xb4\xcfA\x1d\x11\x9f\x89B\xf11=\x17\x83֨\x99!K\xf7\xaf.W\xd3g\xc1\xd7`\x85o%Sf\x1aR\xd5\xd0\xe8\xb1\x14\x9c(\xb5R\x063.\x13\xe6ae\x14D\xc6\xf0\xbfe\xfc\xc8\xea\xc9l\xd0#\xe7\x03\xde\xf19b8\xd2o\xf6Om+\xf8\xe3ϋ\xff\x04\x00\x00\xff\xff{ŋW\xf4\"\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xc4YKs#\xb7\x11\xbe\xf3Wt\xad\x0f\x8a\xabv\x86\xdeM*\x95\xe2mW\x8aSJl\xadj\xa9\u074b\xcb\apМ\x819\x03\xc0x\x90b\\\xfe\xef\xa9\x06\x06\xe4\xbcHJ\xaaȞˮ\x80F\xe3Ç~\xa1\x99eٌi\xf1\x15\x8d\x15J.\x80i\x81\x8f\x0e%\xfde\xf3\xcd?l.\xd4|\xfbn\xb6\x11\x92/\xe0\xda[\xa7\x9a\xcfh\x957\x05\xde\xe0ZHᄒ\xb3\x06\x1d\xe3̱\xc5\f\x80I\xa9\x1c\xa3aK\x7f\x02\x14J:\xa3\xea\x1aMV\xa2\xcc7~\x85+/j\x8e&(O[o\xbf\xcb߽Ͽ\x9b\x01H\xd6\xe0\x02\xb4\xe2[U\xfb\x06\rZ\xa7\f\xda|\x8b5\x1a\x95\v5\xb3\x1a\vR^\x1a\xe5\xf5\x02\x8e\x13qq\xbbq\x04}\xaf\xf8נ\xe7s\xd4\x13\xa6ja\xdd\x7f&\xa7\x7f\x10\xd6\x05\x11]{\xc3\xea\t\x1ca\xd6\nY\xfa\x9a\x99\xf1\xfc\f\xc0\x16J\xe3\x02\xee\b\x8af\x05\xf2\x19@{\xce\x00-\x03\xc6y`\x8e\xd5\xf7FH\x87\xe6\x9aT$\xc62\xe0h\v#\xb4\v\xcc\x1c\xf4\x80Z\x83\xab\x90\xb6\f\xac2!\x85,\xc3P\x84\x00N\xc1\n\xa1E\u00832\x80_\xac\x92\xf7\xccU\vȉ\xb8\\+\x9eˤ\xb3\x95\x89\x9c\xdf\rFݞ\xcea\x9d\x11\xb2<\x85\xec\xff\f\xaa\x87\xe7^\xf1'\"y\xa80\xc8$4^\u05caq4\xb4y\xc5$\xaf\x11\xc8@\xc1\x19&\xed\x1a\xcd\t\x14i\xd9\xc3^\xf7\x91|I\xfa:3\xcfa\xe79TD\xd9\xde\xf6_\xbbC\x97\xf6\xbdW\xbc]\x00\xadQ\x83u\xccy\v\xd6\x17\x150\vw\xb8\x9b\xdf\xca{\xa3J\x83\xd6N\xc0\b\u2e6e\x98\xed\xe3X\x86\x89\xd7űV\xa6an\x01B\xba\xbf\xff\xed4\xb6vQ\xee\x94c\xf5ǽC\xdbC\xfa0\x1c\x8eh\xc9\xd9\xca\xf6\xfa\xff\x14\xb8+\x82t\xa3d\x9f\u05cf\x83\xd1)\xb0\x1d\xa5)\xde\xe6\x85\xc1\x10j\x1fD\x83ֱF\xf7\xb4~(\xfb\xfa8sq No\xdf\xc5PVTذE+\xa94\xca\x0f\xf7\xb7_\xff\xba\xec\r\x03h\xa34\x1a'Rt\x8d_'ytF\xa1\xcf\xec\x15)\x8cR\xc0)k\xa0\x8dN\x11ǐ\xb7\x18\xa2\xb3\b\v\x06\xb5A\x8b2摞b !&A\xad~\xc1\xc2\xe5\xb0DCj\xc0V\xca\xd7!\x02m\xd180X\xa8R\x8a\xff\x1et[\xf2=ڴf\x0e\xdb\x10\x7f\xfcB\f\x96\xac\x86-\xab=\xbe\x05&94l\x0f\x06i\x17\xf0\xb2\xa3/\x88\xd8\x1c~$\v\x11r\xad\x16P9\xa7\xedb>/\x85KI\xb3PM\xe3\xa5p\xfby\xc8\x7fb\xe5\x9d2v\xceq\x8b\xf5܊2c\xa6\xa8\x84\xc3\xc2y\x83s\xa6E\x16\xa0ː8\xf3\x86\x7fc\xda4k\xafzXGN\x17\xbf\x90\xeb\xce\xdc\x00%;\x10\x16X\xbb4\x9e\xe2Ht\nٟ\xff\xb9|\x80\xb4u\xb8\x8c!\xfb\x81\xf7\xe3B{\xbc\x02\"L\xc85\x05]\xbaĵQMЉ\x92k%\xa4\v\x7f\x14\xb5@9\xa4\xdf\xfaU#\x1c\xdd\xfb\xaf\x1e\xad\xa3\xbb\xca\xe1:T\x12\x14/\xbd&\xcb\xe59\xdcJ\xb8f\r\xd6\xd7\xcc\xe2\xab_\x001m3\"\xf6iW\xd0-\x82\x86\u0091\xb5\xceD\xaa`N\xdcװ*Yj,\xe8\xfa\x88AZ*֢\b\xbeA\xe1\a\xd8H>艹v]\xfaV\xac\xd8x\xbdtʰ\x12\x7fPQ\xe7Ph\x80\xed\xe3Ԛ\x04Nvr^T\x0e6J\x8e\x94\x02\xd4i\xf1\xaeB\x83\xdd5\x06\xb5\xb2\xc2)\xb3'\xc51[\xe6#\r'.\"\x1cY\xf1\vǠp\x1f\x1c\xc2\xe0\x1a\r\xca\x02S\x848W\xc9L\x9c\xa2\x93\xd0\xc7\x10OS\x0fg\xa2\xe7$\xe0\x0f\xf7\xb7)b&\x86[\xe8n\xbc\xef\x05z\xe8[\v\xacyH(\x97\xf7\xbe\xba]\xc7\xcdB\xecp\n\x18h\x81\xb1\"=\x04c\x10\xd2:d\x1c\xd4zR#\xbd\r\x80\x1c\xcc`\xbb\xe2m\x8c\x14mH:\x86p\xa2\x1e\x18\xc5(\xc1\xe1\xdf\xcbOw\xf3\x7fM1\x7f8\x05\xb0\xa2@kC\xbe\xc6\x06\xa5{{\xc8\xd9\x1c\xad0ȩp\xc1\xbcaR\xacѺ\xbc\xdd\x03\x8d\xfd\xe9\xfd\xcf\xd3\xec\x01|\xaf\f\xe0#kt\x8doAD\xc6\x0f\xe1/ٌ\xb0\x91\x8e\x83F\xd8\tW\x89a\xd2:0@\xd6\xd5\x1e{\x17\x8e\xeb\xd8\x06A\xb5\xc7\xf5\b\xb5\xd8\xe0\x02ބJ\xf0\b\xf37r\xac\xdfߜ\xd0\xfa\x97\xe8@oH\xe8M\x04w\xc8w]\x8f<\x82t\x15s\xe0\x8c(K<\x16\xa2\xc3/\x04o\n\x89߂2ĀT\x1d\x15A1\xdd^\x8cG\xc8G\xa0\x7fz\xff\xf3I\xc4}\xbe@H\x8e\x8f\xf0\x1e\x84\x8c\xdchſ\xcd\xe1!X\xc7^:\xf6H;\x15\x95\xb2x\x8aY%\xeb}\xac\xf6\xb7\bV5\b;\xac\xeb,\xd6\x1b\x1cvlO,\xa4\x8b#{c\xa0\x99qg\xad5U\x19\x0f\x9fn>-\"22\xa82\xc4;\xcaNkAU\x03\x95\v1\xe7\x05k\x1c%\xcd\xf4Y\x1f\xcd\xc7)(*&K\x8c\xe7EX{\xcaB\xf9\xd5K\xfcx\x9c\xfa\xd37Q\x02\f\x03ǟ\x96D\x9fx\xb8P\xa9>\xe1pݷ\xd6\xd9\xc3m\xfc\n\x8dD\x87\xe1|\\\x15\x96\x8eV\xa0vv\xae\xb6h\xb6\x02w\xf3\x9d2\x1b!ˌL3\x8b6`\xe7\xe1\xc9<\xff&\xfc\xf3Ⳅ\xd7\xf5S\x0f\xd4{\xf4\xbf\xe6\xa9h\x1f;\x7fѡR\xad\xf8\xf4\x8bE\x96f\x82*$*\x82b\xd59]\xd73\xadk*l\xdaR\xea\xd0T,\x94\\\x8bқ\xf0z\x19\x93\"}]\xb3U\x8d\vpƏ\xe9<\xe3)\xdd\xfe\xe3\x85\xcb\xfd\xd2\x11M7{\xa1\x03ꪩ\xbb\xed\xf5ELJA\xe9\x9b1\x94\f6J\v61Nv=\xf2i\x9ax3\xae\x05\xcf\\lt\x9a\v\x1c\xb4\xed\xba\x89\xb7g\xebs\xb1\x16\x0f#\xf4\xde\v\x9e7\x9dĞ\xeb\x8b\x06\x7f\xf5\xf4\xb0\xe8#̦_\xd4\x03\x19\xad\xf8lHZ7\x8c\r&\x8fAh8\xd1\xf7\xef\xc1l\xaf\x8d\xdc=\u0378\x19\x11z\x94\xcfiGľh\xcb{̊.uK\xe9I\xf8\xe2\x86D\xa1\xe8\xb9\xd5ki^\xb0\x81\xeb\xf1\x8a\xd0\xfd3\xbc\xf5\t\xd1`x\xe5ǖ\xee\x8eٴ\xc9\xd4}CG_\\\x1a*\x11R\x87<<\x86譶f\xa2F\x0e\x87_\xa6\xc2\xcf\x0f6\xb4\xc1\xae\xa6j\xff\xa4\xc8[\xe4!\xd6N\x80\x1e\xafK\x9de\xce\x1cf\xa4\xe2e\x81fҽ\x1a\xb4\x96\x95\x97\xfc\xeb\xc7(\x15\xfb$\xed\x12`+\xe5ݡQ\xd2:ZKŕm\xad\xe0y͚\x8a\xd9KP\xeeIf\xca\xe2\x0e.\x7f\xde\xe4\xe0L(\xbb\xc3\xdd\xc4\xe8\xa8\xd3ߝ\xbcN&41\xf7}\xb0\x8eg\x11\xd0nt\x89\x83V\f*U'\xebV\x8e\x12\xb9oVh\x88\x88\xf0\xf3Bb$\x05\x8e\xa9\xceSx\xb1\x1e\x99\x13R\x82.\x14\xab\r2\xc0\x8f\x8d0M(\xf9\x86s\xb3\x03@^\x13s\xa0\x86(\xa8\x15h\x10F\x13s\x00B뚳\x02Y\x1d)\x12\"w\xb1\x95&;%\xab\x96ږ\x16\x8fMM\x8c$\x94\x18\xaa\xf6`ȟ\x9b-(\x01\x064)x\xa3\r\xa8u\xa4U+Y\x832,0֕\x8e\xb8t\xbe\x0e\xe6\xf2\xd6N\xd7\xd5\"\xa5\x95\x13pC\xf6,\x83\xd2sȎ\xd6\x1c\x98n\xa76\x9c\x8e\x9f\x12\x15Dn\xff\n\x85Y\x93\aP\x96\f\xd1\a\xd9\xf0Ҋ\xd7\x11\x94eN!\xf7\x82\xfd-\xd2\xd6v\xa2\xb6SN\r\xf8\xf5n\v\x13\x06\x94\xa0\x9c\x1c)o\xe0\x9aPQ\x92\x8a\x9e\x88\x02\xdb\viD\x87\x1eV\xd1k\xf2\v.\x8f\xd8\xc9\x1br0\xa6\xd67\xef\xde\xed\x99\tۤ\x90U\xd5\bfN\xefP\xe2ٶ1R\xe9w%\x1c\x81\xbf\xd3l\xbf\xa2\xaa80\x03\x85i\x14\xbc\xa35[\xe1\xd0\x05n\x95uU\xfeS\\\xb6\xb7\xbd\xb1\x9a\x93\x95\xa0\xee [ M]R\x03\xe5\x9al\x04\xf9@+\xe0\x1f\xa8\x86W_\x00\xcbi\xbd\xb2\x8c\xcd[\x82\xae\xda\x1bVv\\\xeb\xfc\x10\x94\xd7\xc4z\xf9\xdd\xffPC\xd1\xdb1\xb6\x19\xdb\xf9mNvR\xf5\x94\x83m\xb2\xee\x11MoZ[\xdc\xee\xb7\x1al\xf8\xcb`(\xff\x19+Z\xf9\xb1\x83h\x04\xfb\xad\x01Tqn\xc7\xc2H\xa5\x8cH\x920>\x14\x8b\xf5\xe8\xf7\t\x9e\xda\x02\xdf\vޔPFm;\x9a\xcb`\xc4\x1fG\r\xf0ԡLX\xf9\xb7\xea\xdf\x0e[\xb4\xbfZu\x9a\x181U@\xac\x042\xe1\xe8\x11&p\xb2IN\xdb\xc2\fT\x89\xc1\xcdΎ\x10\xd1pN\xb7\x1cn\x88Q\rLp\x86*EO\x13\x8c\tGp._b}\xaf\x108+\xa0{P8ָC\x86\xaa\xf1\x88\xc8\x0f\xce\x15\xa6\xad:\v\xb3\xbc\x93\x9c\x15\xa7E֤\x1a\x85\xed\xe67_\x90\xe0-\x1c\xe8\x91I\x95\x98\x92ݑ\xb6\xeac{\x90\xb6\xcaTZ]扔\xa3\xc6 \x9aj<\xca\x15\x11R\x8c\xa7\xbf\xf2:1\xf1\x83\x82BA\xea\xa7,\x8e&W\xe3 \xe5\xe3\x92p\xfdl\xeb\xb4\xc7\x02)\xd0:\x8c\xbc\xf2\xe2\xe4O\xe9-\x10\xf8\x0eEc\x12| \xa4l\xf0\x84\x92\x8a\xd4R\x9bi\xc1\x9aVn\xc4雩]A\xe6\xa4r43\xaf\x8b\x83h؉\xf6\xf4\xb2\x14`\xc7ZY\xd1h\xeb*ٸ\xba\xc3\x03\xb4\xc3\xf14GȖj(\x89\xf4۪\xe1\xa0}_%\xcaW\xab\xb8\xae'I\xc7\xc9;S\x86\xd3-p\xa2\x81Ca\xa4\x1as2\x87\x9f\xae\xe4(\xe3\t>&\xd4r\x7f\x7f\xb5\x13\x9b!I\xec>z:\xb0\xe2\xe0\xac\f+\x9bH\x87\x94\x124j&k\t\x9f\xa6&I\x96\xd6\xdew2\xa7\x9bڲ\xb0\xa7\x86\xf4R\xfa\xaa-\x19\xfa\xbc-\v\x9a}\xa4\xb9\xfc\xf7\xe4\xd1ܖ\x7fLƆ\xa3\xea\x02\xa1\u074c\x9a\xbe\xacТ\xd7f\xbd\x89͎@U\x9b\xd35a&|]\xa2H9\xef\xf4\xff\a^\x98\xf3%~3l\xf9\xa2\x12?\xbb*K\x14\xed\xaa\xc4\xee\xff\x80\x8b\x82\x87Ń?+\xb2\x17\xe4/\xddVׄ\xedₔ\xd7dǸ\x015X\x99g헗`F\xceygKEMq\xf8\xf8\xddZ6\xba\rde\xf2e\xd8\xd8\xd9\xdc\xc1\t\xe9\x1f\xcc\vt\t\xfa\xc7LA\xe5\xfc\xee\xaf\xc8\xcd\xf6\v:,\xb7\x9f\x7f\x82r\x8e=$O\xf2F\x13\xb9\x1d\f\xb6۵w$r\xa7\xe1M\x9f蔹\x88\xca5\xa1\xe4\x11N\xceb\xa1\x82\xd8š\x06\r\xea\xa4{6f\x0e\x86v\x9c\xfd\r'$\xe3c5\x8b\xadsE\xc1\x95GH\xf8\x13\xa9\xd2c\xa0\x1d\x93\xf7\xa0\x1d'\xed\ad\x04z\xf6\xf9\xcc#\x18w\v\xbahyr$_\x91\x84\x12x\x7f\xc14\xe3\xb2u⓸\xb0o\xb5[\"\xbb\v\x0e\xacΜ(\x86'5\xe0n\t\x91\xb7o\x94\xb32v\xe4\xe4~#\xa6\xad\xe1~\xf9,\xcdF\\;\x97O\xa3\x94\xfc$A\x7f\x96\x06\xbf\xbc\n;\xdd\xc0/`\xa6k\x88\xdbK8\xb5m\xf9\xd0\r\xe1e\b\xb7+\x1b\x17\xa9\x89\xcb\xc34\xd9\b\xeb\xb8x~`@\xd6u7\x7f>\xf4K\xd5h\x8c\xd1\t)VxT\xaeS=9fg\x92\x94\xaa\xb7\"\xe3\xa1\xc5N]\x87\x99d\xbfړĵw!fN\v(\x83\xb7\x89\x81Qj`\xcf\nR\x81\xda\xcf\x1d\x1c\xddR[\xfd\x9e7\x84L\xad\xebʙ\x12\x96w\xb4\x87\xe2Uw\xb9<\x98\x95ݹ\x19\xb5\xc2b/V\x9d\x88\x87NW]\x9e\x11\x1e\xb1h\x7f,r\x97\x96%\xe6\xa8(\xbf;C㟱\x16\xe3\xb3\xdf\r̝\x90\x15\xad\xed\xfe\xfd_{̡@\xff\x1f\xa9)S\x19{\xf8\x16\xf3P\x1czm}\xe4\xadۍ\xed\x81ib\xd7\xf7H\xf98Ҟ\x98\x9c\xb4\xba\x05\xb8;\xc8\xe5nd\xb1\\\x93\xa7\x83\xd4\xeeL\xdd1\u0a50M\xbf0M\xde<\xc2\xe9\xcd\xf5H\x0f\xbcو7\xee\x80?[\xddDkA\n~\"o\xb0\xed\x9b\xe7\x18A\x99\x92\x98Y\xed\xfb\xaa\x8d\xf9\xad*Z\xaf\xbc\xf4\x1aY\xb1b\xb2\x9dH\xc6\xdf\xdb\xd2\x13\xa7n\f\xbe\r\xbe{\xf3xn\xb6Y\xf2[Km~N\a\xfa&\xc6s\x17Z\xf4m\xdaD\xbcl\xd1\xd6\xf7\xb1\xaf\xa8\x8c\xad\x05\xb83\xa0|\xf0\xcf)\xe8\xe09<ӧZ\n\xee\xc5\xc0\x1e\x8d\x11_\xcb\xe0\x05ir\xb9\x98\x9c!\x9ecmZ\xbe\x9ci\xa7\x7f\xfcމMڝm\xff\xeeN䥭\xe1BV\x15\x1df\x1f\xb3\x86\xfa\xc1\xb5\f2\xed\t\xb9\xd5W\xfb\x06\xf7s\xbe\x99\x18d\b\xf3\x8eO\xcc\x1c\x98 4\xa8\rP^\xa0(\xa9\xe5\xb2\x06s\xe5@5\xd9\x02\x88\x18\xb4\xff\x11\xce\xf9\x8a\x89\rv@\u07bf\xb8]@Zv]\xb4\x9c\x81\xd5qA\xe3\a<\xa9rM*Y\x92\xa7\x03(\xe8I\xc58Pn-\xcdL\x92B\x9an<\xc2ҭe\xf9V\x93\x1dS\xdat\a\x9a+p\x8d\xce\x15\x873W\xd8\xce\xee+\xab@6\xe6\x825\xf8ض\xee%\x8e+\xfa\x9dUMEh%\x9b\f\xa3\xc0\x15{\xbe\xb0*fw\xfd\n\x8bïM@\x15\x92\xb3;\xdfL\xccZ\xd9Pz\x1e)\x86b\xd5\x11V\x8dx\x14\xf2I\xacГ\xd7g+\x90\xfc\xd0\xe0\x8bvo.\xd6D\xbf\xa7\x16\xea\xcbk\xbeL\x05\xe3\xe9\x15\xb4L\xb6ܜ\x15\r\x99\x93\x82%\xbd\xe6\xb0\xd1\x13?.\x8eb\xae\xff\x99\xc6>\xd1\xfc\xc1\x81\x9as\x01s\x9bt\xab\x8e\xf1\xf7t\x00s\x00\x15\xd0\xd2+\x04\x86\xa7\xf4t\x9b\x8fn\xfd\x98\x88\xa0\xb3\xf2\x13La\x87\xec\x1c`\xeaҎ\x8e\xb5\x02\xae\xad`ӆ\x1b\x87oVMB\x88\xb2\x80_i\xcb \a9\xb1\x84\x97\xe8\x83\f#^!\xa0\fe\xe8$1C\xb7\x96\x0eJ\xdcM\xc6\xf7\x81\x0f\x18\xf2\v#\xfd\xbb\xe3\x0f30\r\vH\x86yT\xe6\x1c\xbf\xc6b\xd3\xe5X+\x83\xbe\x9e\x87\xeb\xfeX\xec3P}\xa9\xfd>\x984@\xfb\x1cL4\x19\xc0APs[\x97\x1d\x81\x05\x94\xa5\x94\x8b݅>\x1ch)\xde\x16\xb8\x13e \xac1\xd4\xecw\x9b\x87\xcf3M\xfe\x9d\x1cd\x93\x80\xd4\xcdpg\x01`1\r\xab\xf0I\x040\xf4\xf8~\xdd\xff\xc5H\x0f\xb2\xc0\xc8Wbv訴\xd1T&JvdeCyo\x93uĢ\x95\x1e\"\x15\x11\x8c\xa7\xf2\xabV\xacB\xfb\x9e\x18\x91/\xb5˳\x9c\xad\x8e\xe6M\xc4<,\xc6\xc5\b\x8c>\xc2b\xe2\x90:7\xe5\x90\x0f5\xcd\xc7X̃\"\xceAV\fq\x13\x93D\x97\xf1\x149\xd6\xfd\x02v\xe2\x02\xc4D&Z\xee\xd9\t\x92\x1cL\xc4EH\x88E@Y&\xfe\xa1\x8fl\x98'y\x06\xea!\x8b9\xcb\b\x87\xb3q\r\x1eG0;\x8fl4C\x02\xa70Kx\x12\xc30\x87N\x98gy\x02\xb9\x90\x8fI\x98%\x8dx\x85e$\xc2\xcb\xe1\r_\xc2\v\x98V5\x8bh\x82gy\t\x19x\x81sP\x02\x8b\x1c\xbb\x10\x11\x103\xfe\x13\xfd\x9e\x8b\x03\xe8\xe7\xf9'\x88\xe6d\xff'\xb2\xfb\x13\x14gs\xfe\xb99\xfd\t\xda\v\xc7\ueb14\xcc\xfexN.?\xba!\xbfкfb?\x96\x93\\i\x9a\x95\xa4\x11\x10\xa0\xdbgO\x94\xba\xdeB\xcf\xcfJu\xe9\xae\xfd&|\xb2\x10\xd6c\xc2\xc85\xb9\x15\xa7\x11]\xbc\x12\x90\xf4A\xfa\xf7\xc2찞\x18\xe7\xdd\xcbOH\xb6K\xca_#\xd4\xe9Ȁ\xad8ea'\x97P\xaa\x9eu\xbc\xe4\x82}\x19T\xef\x06\n\xe7\xad픡\xcd\xcc\xe1Bk\xbbj\xb8aur\xcb\xd7J\x1e\x19\x86\x1d\x0fp\x8a\xfc\xfc\xab\xc4[A\xdb\x13R\xfar\x1fw\xe3z\xe08\xd0\xd4\x1ez\x02\xce\t\xd5\xe3\xe9\x17\xee\xe6m!Wx\x99ήd\x90\a\x7fC\xf7\x1awl\xcac\x17\xe1Nhe\xc9\xe0\xed]\x9d\x88\x88L\x9eE\xf3\xf6\xb03\xdd\xf1\xdbo\r\xa8\x13\x91G\xcc\xe9{\x03i\x01v\xef\xf4\x8a\xb6\xfe[\xd0t^]\xba\xfb\xde\x03?\xa1\xd5/\xe4V\xb8\x13;Iv0F\xa4cU\\\xeb\x1bYmnݞ\x89\xaaI\xaaB\xc6\xd6iy\x98=\x98r1\xeb\xaf\xeb)\x9d\xef+-Z)\xaf\xe2/]\xee1͐\xccŠ\xe7\xe5D\x161\xe7\xaf\xe59-\xf9N\xd9Fc\x1e\xa6\xfc5\xb0\xe4g`\xc8\xcf\xf0\xa1\xce\xf3\xa2\xb2ٔ\x83\x15\x7f\x15_\xea\x15\xbd\xa9\xd7\xf0\xa7.\xf3\xa8\x16H\x0e0\xe09\xe8\xee\xac4^v\xce&'˶\x9c9\x9eGmg\xa0\xb53\xb2AK#\xcd@e\x9f\x87\xc6\xce\xe0\xe1+\xf9Z\xaf\xe4m\xbd\x86\xbf\xf5\xba\x1eעϵ(9\v?\x9f\x87\xa2\xbe8\xc9\x10\xd2џe\twR\x99%\a\xe1nX?\x91\x02\xec8M\x92\x97D\x84\xaa\xa9L\x83\xb5\xfd\xbd\xdd\x7f٤\xd2ٺ`\xfe\xfe\"K;\xb6\xa5\xdc\xc2\xfd\xa0\xfa\xe8\n\xed\x0e\x14\b\xf7r\xc5\x7f?|\xf9\x1c\xe9\xa7\xecQo\xf4\x0e\xde4p\x06F\xe9\x99\xe3\xb3O\x1ep㸅g\xf8\v'\th\xcd\xfe\v\x1f\x05[\x0e\xc8\xdc\xdem\xb0j\xb0\x96\xf01\xb1\x98Џ\xb9\xb7-\xd8\xd3#rdR\xfa7\xbb\x1e\xc5\x04\xec4\xfeI\xf0I\xa6pz\xb1)L\x96\x03!\xd9]w\xb7q\xa3[\x93O\xd6t\x13'\"\x9d\xe0\x1d\x98*W5U\xe6\x84ҡ\xaf\xe3\x18\xa6\x832\xe1\f\x99\v\x9dL\xaa\xda\xf1cSIކ7\xa70\x01w\xaa\xfb\xd9\xcc!G/\x19\xc7\xf4\xed\x89\xc5{\x13/8\x8e\xe9\xe3x\x85\x9cJ|N\" ^,$\xe5\xd5\xd0ݷ%\xb5v\x1f+\xce\xeb3\xebɆ\xb0N\x82?\xb6=\xaa4-h\xad\x0f\x89\xa8\xd0\xf3t\x1a\xbe\x84e\xa8i2\xe7\xe3\xea\xf6\xa6ĊCG\x01=APQ\xaa\xf3.\xe0`Lv\xaf:Bx\f\xa3\t-\x18\xbf\xee8\xe6\xbfO\xca3\xf3Y\x90\x8b\x1f\x04q\xec\x99P\x15\x18i\xb2j,\xc8B˗\v\x92\x9d\x8b&\\\x06\xb0u\xde\xee\xcc|Q\xe2\xe2\xb7$\x96\x99\x95`\xd4\xd43\x129OE\xfc]\xf99\xa3\x92tq\x80\xb2\xe1\x90\xf1\x82\xdcC\xa7\xea\xf2\x1br\x81pjO\xca\xfe+r\x96\xaf\x9d\xe3\xd5\x1a\xbc\xfd\xd7\xea<\xd3=\xe5\t\x88w\x97\xa4\xb3\xecݫS\x85\xb5\xe3uS\x14\xa0\xf5\xae\xe1\x01-\xe3^\xd7*C\xf5$2?\xcc\xe1,XHSsIKP\x1f\xa4رD\x1e\xa1\xc7\xd3\xff\xe9U\x1e\bl\x81\x1f\x1bվ\x128\xfb@۳\xb4ӓb\x06\x1ej\xaa4|b3Gx\xcak\x98h<\xc1\xffTL=6\xa1\xfa$\x8a\xf9\x9b\x12\xce\xe5d3\x17\"瘑\x9coT\xa5\x97\xcc76Οo\xd7\nh}\x92s&?\x1djx\x01vLY\x17˼\x98\xb74p~\x89\x91\x9f\xb5\xdc]K%\xd8$\xa9\xc0\xa6\xb5R\xce\xe3\x85\xeeykKq\xa7^\xe5\xe7y\xa5ر\xf5I\x7f\\o\xf2\x18\xed\xa1\x8f9~\xe5\xb7A\xf5\xc1\xb53\xeba\xb6\x14\xbd/\x98`\xce?\xb3]\xf8\xd73[\x0e\xff2\xaa\xf1;_\x1f{\xa2J0\xb1_\x9a\xfc\xaf\xbeZ\u00ad\xf6\x14\x12\x8eub\x12\xd1\xd5>˱\x0e\x83\x9c\xf8\xef\n\xd1\xd9~\x86k\x9d\xf8\x05\x92\x90l;\rn\x16\x81\x06\xd0\xdd\xe8o\xc0\xab\xd5\xea\x8a\xd6\xec+H\xc5\x04\xbf#\xb4f\xf0]\x037\x7f\xa9\xf5\xf3\xbf\xa95\x13\xb7\x87\x9f\xae\x9e\x19\xcf\xef\xc8\xfbFiQ=\x82\x12\x8d\xcc\xe0g\xd81\xce4\x13\xfc\xaa\x02Ms\xaa\xe9\xdd\x15!\x94s\xa1\xa9\xf9Y\x99?\t\xc9\x04\xd7R\x94%\xc8\xd5\x1e\xf8\xfa\xb9\xd9¶ae\x0e\x12\x81\xfb\xa9\x0f\x7fZ\xff\xf4\xcf\xeb?]\x11\xc2i\x05wD\x82\xd2B\x82Z\x1f\xa0\x04)\xd6L\\\xa9\x1a2\x03s/ESߑ\xf6\x83\x1d\xe3\xe6\xb3k}\xb4\xc3\xf1\x97\x92)\xfd\xe7\xee\xaf\x7faJ㗺l$-\xdb\xc9\xf0G\xc5\xf8\xbe)\xa9\f?_\x11\xa22Q\xc3\x1d\xf9d\xa6\xa9i\x06\xf9\x15!n\xe98\xedʭ\xfa\xf0\x93\x05\x91\x15PQ\xbb\x1eBD\r\xfc\xfea\xf3\xf5_\x9ez?\x13\x92\x83\xca$\xab5\"\xc0\xad\x8d0E(\xf9\x8a{3\v@\\\x13]PM$\xd4\x12\x14p\xad\x88.\x80к.Y\x86\xa8\x0e\x10\t\x11\xbb0J\x91\x9d\x14U\vmK\xb3\xe7\xa6&Z\x10J4\x95{\xd0\xe4\xcf\xcd\x16$\a\r\x8ade\xa34\xc8u\x80UKQ\x83\xd4\xcc#ֶ\x0e\xbbt~\x1d\xec\xe5\x9dٮ\xedEr\xc3'`\x97\xecP\x06\xb9ÐY\xad.\x98j\xb76\u070e\xdb\x12\xe5Dl\xff\n\x99^\x93'\x90\x06\fQ\x85h\xcaܰ\xd7\x01\xa4AN&\xf6\x9c\xfd-\xc0Vf\xa3fҒjp\xf4n\x1b\xe3\x1a$\xa7%9в\x81\x1bByN*z$\x12\xcc,\xa4\xe1\x1dx\xd8E\xadɯH\x1e\xbe\x13w\xa4кVw\xb7\xb7{\xa6\xfd1\xc9DU5\x9c\xe9\xe3-r<\xdb6ZHu\x9b\xc3\x01\xca[\xc5\xf6+*\xb3\x82i\xc8t#\xe1\x96\xd6l\x85K\xe7xT\xd6U\xfeO\x81l\xefzk\xd5G\xc3yJK\xc6\xf7\x9d\x0f\xc8\xe63\x140\foy\xc9\x0e\xb5\xbbh\x11m~2\xd8y\xfc\xf0\xf4\xa5\xcbgL\r\xb1\x8fx\xef0_K\x02\x830\xc6w -\x11\x91\xdb\fL\xe0y-\x18\xd7\xf8GV2\xe0C\xf4\xabf[1m\xe8\xfe[\x03\xca0\xb4X\x93\xf7(;\xc8\x16HS\xe7TC\xbe&\x1bN\xde\xd3\n\xca\xf7T\xc1\xc5\t`0\xadV\x06\xb1i$芽ag\x8b\xb5\xce\a/\xbc&\xe8\xe5N\xffS\rY\xefĘal\xe7\x8e9\xd9\t\xd9\x13\x0efȺ\a4~hM\xb3\xa7\xdfH\xb0\xe1\x97\xc1R\xfe#t4\xfcc\x16\xd1p\xf6[\x03(\xe2쉅\x91H\x19\x81$~}\xc8\x16\xeb\xd1\xf7\t\x9c\x9a\x06߳\xb2\xc9!\x0f\xd2v\xb4\x97\xc1\x8a?\x8c\x06\xa0֡\x8c\x1b\xfe7\xe2\xdf,\x9b\xb7_\x8d8\x8d\xac\x98J \x86\x03\x19\xb7\xf0\b\xe3\xb8\xd9(\xa6Mc\x1a\xaa\xc8\xe2fwG\boʒnK\xb8#Z60\x81\x19*%=N ƫ\xe0T\xbc\x84\xfeN \x94,\x83\xae\xa2\xb0\xa8\xb1J\x86\xca\xf1\x8a\xc8\xef\x1c+L\x19q\xe6w\xf9 J\x96\x1d\x17Q\x13\x1b䏛;|\x9e\x83\xb7P\xd0\x03\x132\xb2%s\"M\xd7\xe7V\x91\xb6\xc2T\x18Y\xe6\x80\xe4\xa3\xc1\xc0\x9bj\xbc\xca\x15ႏ\xb7\xbfr21\xf2AB&!\xf6)\t\xa3\x13'0\x86\x9dG7Q:\xfb%A\xe93e\\\x90t\xd9\xf4\xa5\x00\ta\xd7S\x94|ae\x89&\xd2q̠Ĉ[!\x9b\x002\xa3ܐ\xca1\xf6NȊ\xa2ȸFS\xd3\x1b\xa9\xb7~!\xd7\x11\x88B\x92\xeb\xf0\x9dlv\x04\xaaZ\x1fo\b5\xe2\x9c6\xa5\x0er\xa85\xcf\xfe\xf0 \xf2\x1b\xf2\xf0\xf5\x86<\x99\xdd\xe8\x9b\b\xdc\xf7\x82\xef\xd8\xfeWZ\xff\xd1n\xc9hGeTc\x8b\xbf\x17\xa6\v\xb2c\x9c\x96\xecoF-\x9b\xbfE\xa3[\x03\xf9\xd6#k%\xa1\x12\aX\x85\xce\xff\x1e匮\x15oguz\xd9\xc3\xc1\xe9\x1d\xfe\xc3\xf7@\x91\xb0\xc1\b`\\\xabx\xe1 U\xc1\xeaG\u0601\x04\x9e\x81\x1a\x13\t\xbeӪ.#\xcajEj\x91\x8fa\xafHmȤ4p}\x10eSE\xe6_\x11\x85\x88\x8e}\xc9\x10\xd1\x15\xad\xc7\x1f\x7f\xb0@+\x84x^:[\xbf\x98>\xadQF2\xf4͂\xa4r\xc2\xdc\xd9\xc8[ \xf0\x1d\xb2FG\xa4\x10!y\x83\xf6\xa1\x90\xa4\x16JO\x8b\xf5iӂt\x0ei\xf4\xe3\f\nG;s\x96\x90go\xb3ўU$8\x98\xb5VF0\xb7}\xa5hl\xdf\x18\xd39\x84\xc71B\xb6TAN\x84SjM\t\xca͕\xa3to͆\xd8\xf1\x1cl\xde:\x12%\xddBI\x14\x94\x90i!c\xf2g\x19\x9f\xb6\xa5\x98B\x13x\x8c\x18E}\xed\xd6nl\x06$1Z\xec\xa5`Yam|Û\b\x87\xe4\x02\x14\x9e\xfbI!\xeb\xdb,\xed\xdd$s\a\xa9m\vGj\b/v\xb8ږ`M\xb5m\xc1\xae\x1a\xd9\r\xee\xf7\xa8aܶ\xff\x9f\x88\xf5\x86\xe2\x19L\xbb\x19\r}[\xa6Ř\x89\xf1\xe5[\x05ʹ\xffu\t\"5\x8a.\xcc\xff\x0fL\x98\xd39~3\x1c\xf9\xa6\x1c?K\x95%\x88\x86*a\xfa\x7f@\xa2\xa0\xb2xr\xba\"\x99 \x7f鎺!l\x17\b\x92ߐ\x1d+5\xc8\x01e^u^\xde\x02\x19)\xfaδ\x8a\xea\xac\xf8\xf0\xddX6\xaa\r#'\xe2e8\xd8:\x17\xde\xf4\xee+\xe6\x05\xb8\x04\xa3SLBe\xa3^_\x10\x9b\xed/\x18.\xb8\xff\xf43\xe4s\xe8!i\x9c7\xda\xc8\xfd`\xb1ݩ\x9dǔ\xba\rg\xfa\x84\x90\x88\x8dg\x1a\xd7\xe4\x19\x8e\xd6b\xa1\x9c\x18\xe2P\x8d\xeel482F\x0e\x06V\xad\xf7\vG\x04\xe3\"\xa5\x8b\xa3SY\xc1\xb6g\x88x\xf3\xb1\xd6C\xa0Y\x93\x8b_YL\x9a\x1f\x10\x11\x18WKG\x1e\xc1\xa8\xb7\x97E˛#\xe9\x82\xc47\x8f\xfb3\xb6\x19\xc8\xd6\xc9\x0e a\xdf)K\"s\n\nV'n\x14\x93\x03\n\xf0\xb4\xf8\xb8\xf7WZ\xb20\x1db\xa7\x9b\xd7\x0f\xfdV5\n=q.\xf8\nU\xe5:6\x93Ev\"H!{\x14\x19/-Lj'L\x04\xfb\xc5h\x12;\xde&xJ\x9aA\xee\xbdMLKP\r{\x96\x91\n\xe4~Nqt[m\xe4{\xda\x12\x12\xa5\xaem'rX\x9aj\xf7͉\xee|y1+sr\x13zyb/v\x9d\xc8FLw]\xde\x11\xaaX\xb4?\x16\xb1K\xf3\x1c3Ĵ|8A\xe2\x9f@\x8b\xb1\xee\xb7\v\xb3\x1a\xb2\xa2\xb59\xbf\xffc\xd4\x1c2\xf4\xff\x92\x9a2\x99p\x86\xef1\v\\Bo\xac\v\x0fv\xa7130E\f}\x0f\xb4\x1c\xe7\xb9\"\x9b\x13F\xb6@i\x15\xb9؍,\x96\x1b\xf2R\beu\xea\x8eA\x19\v\xd9\xf4\x1bS\xe4\xfa\x19\x8e\xd77#9p\xbd\xe1\xd7V\xc1\x9f,n\x82\xb5 xy$\xd78\xf6\xfa5FP\"'&v\xfb\xbej#\ueaca\xd6+ǽZT,\x9b\x1cǣٯ\xb6\xf5ة\x9b\x01kS_\xce<\x9e\xdbm\x12\xff\xd6B\xe9_⁾\x89\xf5<\xf8\x11}\x9b6\x12/[\xb4\xf5]\xec+\bcc\x01\xee4H\x17\xfc\xb3\x02\xda{\x0e\xaf\xf4\xa9\x96\x82{!\xb0GC\xbe\xc5 x\x81\x9bl&4e\x89\xa7X\x9b\x06/'\xda\xe9\x1f\xbewb\x93\xe6d\x9b\xbf\xbb\x1bykk8\x13UE\x87\xb9\xff\xa4\xa5\xbe\xb7#=O;@\x96\xfar\xdf\xe0yN7\x13=\x0fa\xd6\xff\x85\xe9\x82qB\xbd\xd8\x00\xe9\x18\x8a\x92Z,K0\xdb\n\xaa\xc8\x16\x80\x87\x94\xd9\xefA\xcfW\x8cop\x02\xf2ӛ\xdb\x05\xa4E\xd7Y\xe4\xf4\xa8\x0e\x04\r?\xa0\xa6J5\xa9D\xeerj]\xae\x18\aʍ\xa5\x99\b\x92\vݍG\x18\xb8\xb5\xc8\xdf)\xb2cR\xe9\xeeBS\x19\x0es^\x97\xf0\x15\xcc\uefb0\nD\xa3Ϡ\xc1\x87vt\xafl\xa3\xa2\xdfY\xd5T\x84V\xa2I0\nl3\xfa\x85U\xa1\xb6\xc2Q\xe0\x852\x1d\xd2\xcc\x18\x99\xd1\xc2P\xa9.!\x92\xf3\x8d\xb7-\xec\x8c8\xca\x04W,\a\xe9k\x7f,e\x990\awGY\xd9\xc4\xd2>\xb1v\xaa{\xcb?Hy\x96w\xfbَ\xecD\x1b\v\xf1\xd2GP2\n\nz\x00\xc2v\x84i\x02<3t\x01iE6Nᐁ\xa8If\xcb4\x01O&\xb3\xfd\xb1\xb6\u0093\xcd\xf8l0\xad\xdb\xfd#e\xe5%\xc8f8\uf8d0\x8f@\xf3s\x020\xdf:\xc3\tp\xd5H\xac˱\xe2兕ik6\x94#%mxV\x00\xca)\xde\x13\x1fĂg\\i\xa0\xa9\xbc`\xac\xa6\x86s\xc6\xf7i\xb4K\x0eq\xb6͢z+D\ttX\xcf\x18k\x06\xd7狡o\xed\xe8\x1f\"\x86\x02\x05\xd2ͅ-8R9YD\xb5\x86\xaa\xb6\xe7M\x10\xd9\xf0\xae\xf6\xb9\x80\x14:\xc5\aw\xabxK\xe7\x9aq\x96@\xd8A΅\xe9\xaeei@\\Բ4\x13\x04\xa3\xe2\x9c\xf0٦\a\xc0\x9cN\xef\xa4\xe0\xda\x03ל`en\x81\xd0<\x87\xdc\x06&\x8d\xa9\xe2|\x16[=:Q\xaa\x10\xdd\xdd\xe9fb\x12e}\xeby\xa4\x18\x8a\x95\aX5\xfc\x99\x8b\x17\xbeBO^\x9d,@\xd2C\x83o:\xbd>[\x12\xfdH)\xd4\xe7\xd7t\x9e\xf2\xc6\xd3\x05\xa4L2ߜ\x14\r\x99\xe3\x82%\xb9fo&L|\\\\\xc5\xdc\xfc3\x83]\xa2\xf9\xbd\xbdR\x90Z/\xb8\x89\x8f\xea\x18\x7f/\x05\xe8\x02\xa4\xbf\xab\xb0\xc2k\x1919\xdd\xe6\xa3[?&ԯ\x1a\xfe\U00066c2dq\x1bT\xb4\xc6\x1d\x1dc\x05\xdc\xf8j>{\xbb@6\x11&J\xaa\xfb\x8a[\x06)\x95\x13K\xf5\x12\xfd\x12\xdfP\xaf\xe0k|\x85\x9f$\xb2CKK[\xc8\xdfM\xc6\xf7\v\x1f0\xe4\xe7W\xfaw\xaf\xfeM\xa8iX\xa8d\x98\xaf\x89\x9e\xc3טm\xba\x18ky\xd0\xf5s\xc5\xf2\xbf/\xf4i\xa8>\xd7\xee\x1cL\x1a\xa0}\fF\x86\f\xcaAPr\x1b\x97\x1d\v\v(\x8b\t\x17s\n]8\xd0@\xbc\xcf\xf0$\n\x0fXa\xa8\xd9\xd7\xce\xda\xcb+L\x91\x7f%\x85h\"%u3\xd8Y(\xb0\x98.\xabpI\x04\xd0\xf4\xf0Ӻ\xffE\vWd\x81\x91\xaf\xc8\xee\xd0Qi\xa3\xa9\x8c\xe7\xec\xc0\U000865bdC\xd6a\x8b\x96{\x88\x90\x84\xb32\x96_5l\xe5\xc7\xf7؈|\xaem\x9e\xe5dq4o\"\xa6\xd5b\x9c]\x81ѯ\xb0\x98PR\xa7\xa6\x1c\xd2KM\xd3k,\xe6\x8b\"N\xa9\xac\x18\xd6ML\x02]\xae\xa7H\xb1\xee\x17j'Ψ\x98H\xac\x96{u\x82$\xa5&\xe2\xacJ\x88ł\xb2\xc4\xfa\x87~e\xc3<\xc8\x13\xaa\x1e\x92\x90\xb3\\\xe1pr]\x83\xab#\x98\xddGr5C\xa4Na\x16\xf0d\r\xc3\\u\xc2<\xca#\x95\v\xe95\t\xb3\xa0\xb1^a\xb9\x12\xe1\xed\xea\r\xdf\xc2\v\x98\x165\x8b\xd5\x04\xaf\xf2\x12\x12\xea\x05N\xa9\x12X\xc4ؙ\x15\x01!\xe3?1\xef\xa9u\x00\xfd<\xff\x04Д\xec\xffDv\x7f\x02\xe2l\xce?5\xa7?\x01{A\xed\xcer\xc9\xec\xc7Sr\xf9\xc1\r\xf9\x95\xd65\xe3\xfb1\x9f\xa4r\xd3,'\x8d\n\x01\xbas\xf6X\xa9\xeb-\xf4\xfc\xacؔ\xf6\xd2}\xc4'\xf3a=ƵX\x93{~\x1c\xc1\xc5+\x01Q\x1f\xa4\x7f+\xd3,\xcb_\x14\xf3yT\x04\xdb\x05\xe5.\xf1\xaaxd\xc0t\x9c\xb2\xb0\xa3$\x14\xb2g\x1d/\xb9`\x9f\aݻ\x81\xc2yk;fh3]\x9cimWM\xa9Y\x1d=\xf2\xb5\x14\a\x86a\xc7\x02\x8e\x01\x9f\x7f\x15x+h{DH\x9f\x1f\xc3i\\\x0f\x1c\a\x1a\xbd\xfa\x06eI\xa8\x1ao?\xb3\xf7\xde3\xb1\xc2{\x97\x86\x92\x9e\x1f\xdc\xfd\xf8\x1b<\xb11\x8f\x9d\xfb\x1bٕ\xbf\xc4hܮt\xafr\xde\x1e\xb6\xa6;\xfe\xf6[\x03\xf2H\xc4\x01s\xfa\xce@Z(\xbb\xb7rE\x19\xff\xcdK:'.\xedk\v\x03?\xa1\x95/\xe4\x9e[\x8d\x1d\x05;X#\xc21\"\xae\xf5\x8d\x8c47n\xcfD\xd7(T.\xc2\xe88?\xcc*\xa6Ԛ\xf5\xcbzJ\xa7\xfbJ\x8bV\xcaE\xfc\xa5\xf3=\xa6\x19\x90\xa95\xe8i9\x91Ś\xf3KyNK\xbeS\xb2јVS~\x89Z\xf2\x13j\xc8O\xf0\xa1N\xf3\xa2\x92єR+~\x11_\xea\x82\xde\xd4%\xfc\xa9\xf3<\xaa\x05\x90\x83\x1a\xf0\x94\xea\xee\xa44^r\xce&%˶\x9c9\x9e\xaf\xdaN\xa8\xd6N\xc8\x06-\xad4\xa1*\xfb\xb4j\xec\x04\x1c^\xc8\u05fa\x90\xb7u\t\x7f\xeb\xb2\x1eעϵ\xc89\v\x9fO\xab\xa2>;\xc9\xe0\xd3џD\x0e\x0fB\xea%\a\xe1a\xd8?\x92\x02\xec8M\xa2\xcc\t\xf7]c\x99\x06c\xfb;\xbb\xff\xbcMųu\xde\xfc\xfdU\xe4fmK\xb9\x85\xc7A\xf7\xd1\x15Z\xf7\x16\x86\xd9\xda\x7f=}\xfe\x14\xe0\xc7\xecQg\xf4\x0e\xde4\xb0\x06F\xee\x90\xe3\xb2O\xae\xe0\xc6b\vu\xf8\x1b'\th\xcd\xfe\x13\x9f\xe4[\x0e\xc8\xdc?l\xb0\xab\xb7\x96\xf0}\x95\x90\xd0\x0f\xb9\xb7-\x18\xed\x1102\xc9\xfd\x9b]\x0fb\xa4\xec4\xfcI\xf0A4\xaf\xbd\xd8TM\x96-B2\xa7\xeeacW\xb7&\x1f\x8d\xe9ƏDX\xc6+\x98\xccW5\x95\xfa\x88ܡn\xc2\x1a\xa6\x832^\x87̅N&E\xed\xf8\xa9\xb7(n\xfd\x8bo\x98\x80;\xd6\xfdl\xe6\x10\xa3\xe7\xacc\xfa\xf6\xc4⽉7\\Ǵ:^!\xa6\"?G+ \xde,$\xe5\xc4\xd0\xc3\xd7%\xb1\xf6\x18:\xce\xcb3\xe3\xc9\xfa\xb0N\x04?f<\x8a4\xc5i\xad\x8aHT\xe8u2\rߡ\xd3T7\x89\xfb\xb1}{[bY\xd1\x11@/\xe0E\x94\xec\xbc\xca9X\x939\xab\x16\x10\xaaa4\xa19+o:\x8e\xf9\x8fIy&>\vr\xf6\x83 \x16=\x13\xa2\xa2\xf3\x98\x92\xe5\x85\x16/g$;\x17M\xb8\x84\xc2\xd6y\xbb3\xf1E\x89\xb3ߒXFV\x04QS\xcfH\xa4<\x15\xf1w\xc5\xe7\x8cHRY\x01ySB\xc2\xfb\x8dO\x9d\xae\xcb/8z\xc0\xb13)\xfao8\x1a\xbcvԫ1x\xfboE:\xa4;\xc8\x13%\xde]\x90ֲ\xb7\xafNeƎWM\x96\x81R\xbb\xa6\xf4\xd52\xee\xc11\xdf=Z\x99\xef\xf7pRYHS\x97\x82\xe6 \xed\x03k\v8\xfd\xef^\xe7\x01\xc3ڗ\xc3\x1aپ\xd19\xfb<⫤Ӌd\x1a\x9ej*\x15|de\xd2y\xfb6\x18b\xbd\xb3]I\xf7\xb6\xba)g\x19\xbe\xe3\xe6\x14\x11\xce0q\x00v8^!\xac\xd2\x16\xaa\x88\x890L\xf2Q\x98\xaa\x91\x9f<\fq\x03`\xd5y\xe0\xf4*\x01\x8e\x8ah\xb8\x19\xed\x96\xd1Z\xe3\x05\x06$x#%r\xab\xfd&v\xa3GY{`\xa7)\xea*Q]\x1d\x95Ҵ\x8a\x18\xd1\xc3;|\xc3\x11\xf8\xf4\xb1\xcc;\x95Wݷ+CAU\x8c\x99\xa8\nŰ\xf9\xba\x03ۂA\xbbՀ\x86\x9c\xc0\x0181\xdcMY\t\xf9\\\xe5\xf5\x17\x8cx\xca\x03\xc8w*\xc0\xc1Z0s2\x9e4\x95:,}|\x98\xedۋw$\xa7\x1aVf\xf4y\xc6M\xfcUK)\x97\x93Sx\xdfȝ\x11\xbc$\x84\xe4-KwK\xa8\x02\xa5\xe8\xde{^/ \x81\xec\x81\x1b\x14Ͻ\xad\xd7^\xb4r\xc27\x94\f\x1al\xd1L7\xd4M`\x8d\x9c\x90\xb6\x8b\x80t\xef1\xa33\xb7\x9f\x14y\x8ck؏\x12f\xee\x92\xd7#P5|\xbf{\x84\x88\x8fݾ.\xdciq`_\x93\xa1\xb6\xbe\x0f\x9f{\xd6,8\x98\x13\x8a\xc4\xcc|\x92x.\x84xN\xb2B\x7f\t\x1d\xdbh\v㖏\xf0j\xdbV4\xbak_\x8a\xa9\xd8,\xbe\xbb\xf8\xc6\xf2\x1aa\xdeۻ.S!\xc4\xf1Îa@\xf0焦%\xe1M\xb5\x05\x89\f\x19:\x143\xf7\xbd\x9f\xfc\xe3\xd1ey\xbc\x19B\x1e\xbc&\xdf\u009e\x83\x88\xa4w2\xa0s\a\xd8Ǿ\x06@l\xf7\x99\xa7'\t>\x05\xeeU\xfe\xd4cws\x1c\x1dp\xfc\x11\x17\x95\x8a`\xdb{\n\xbbv\xf1֍\x01\x1e\xf7\u0088\xcf=\xfbcq\xc6\xd2g콺\xa0j\xc9\xd0{0}\xc2\xe5ߎN\n6\xde\xe3đ\x9czz\xf8\x13\xbcD~\xb5\xc8\xc2\fN\\\x93\xacȆ?H\xb1\x97\xa0b/\xab~\xa3L3\xbe\xff(\xe4C\xd9\xec\x19\x0f\xc5çu~\xa0R3\xc3\xcav=\x91\xb1\xef\xbd.\x8b|[\x1e=\xfd\xc1\xbe\x96\x1b3\xfa\xbb\x1f\x97f\x98\x11v\xb5C\xdeb\\\xd4v[\x12tN\x12\xbfS\xad\xe2\x89\xc5\x10\x1d\xb45\xf9$4\xf8t%\xeb\x03e\x8alA\xe9\x15\xecvBj\x1b\xc6^\xad\b\xdb9\x83'\x16n\xa5\xacDw˾Xm|\xb0P`\x17\x8c\x7f\x17R\x93\xa8]\xd0O\xab\xe8\xd1F\xe6h\x96\x19[\x1an\x95\xa61\x9b\xfeU\xf2\x18\xfd;w,R\xa4Ŧ\xdb?D\xb5\x82\xa4@p\x16ux\xbdت\xf2h\xa9\x06\xc1\xab\xac\x9d\xd7\r\x882j\xf1\x1c\xb9A\xac\xc4\xdaL\xfb\xaa\xfd;Y\xa1\xf3\x94\xc0s\xdb\xe8\xbdW>]\x8e͔\x1fjh\x96\x15\x94\xef\r\xfbH\xd1\xec\vςS\x16\xcf\x04м\xc1\xb0w\x8dG^\xf9\xb4\xbfn$\xefd\xad\\!@\xde.w\x0e\xe8٢W\xb6\x97\x12Z\xe13\xa3\xc2c^\xc3\xc4\xe0\t\xfc\xc7b\xeaa\bUG\x9e\xcdߔ\xb0.'\x9b\xb9\x109\x87\x8c\xe8~\x83(=g\xbfap\xfa~\xbbV@드\xb2\xf9\xe9P\xc3\x1b\xa0cʺX\xc6ż\xa5\x81\xfb\x8b\xac\xfc$rw-\x15o\x93\xc4\x02\x9b\xc6J9\r\x17\xaa\xe7\xad-ŝz\x9d_\xe7\x95\xe2\xc4\xc6'\xfd\xfdz\x93\x87`\x0f}H\xf1+\xbf\x0e\xba\x0f\xae\x9d\x19\x0f\xb3\x85\xe8|\xc1\br\xfe\xc0v\xfe\x1f?mK\xf8\xe3\xa8\xc7\x0f\xbe>\xf6B%g|\xbf\xb4\xf9o\xae[ĭv\x10\"\x8eud\x13\xc1\xd5>ɱ\xf6\x8b\x9c\xf8\xdf&\xc1\xd9~\x85k\x1dU'\xa3\x1f\x91\x91\xf3\x0e\x92\xddL\xee\x97\xff\v\x00\x00\xff\xff\xc6\xfd\x13\xe8\x8em\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xec=Mw\xdc8rw\xfd\n<\xe5\xe0\xddaW\x15\xcf \xbf`\xcc\xe3O]\xaf\x18\xcfs\xa2\b/n\xb5\x90\x16\xf4\x8d*\xea2Pb\xc5r0\x99\x16\x95\xa5\x11\xdfYnk\xc3Ԏ\xd9=t\xfb\xc1\xf2\x8bQ\xf2\x96\xdb\xfd5[\x1b\xaa\xb7\xae\xf6܄_\x1d\x89\x1c\x00\xff\xc9\x1e\x117c\xb5\x90\x0fc\xbd\xbdg7ZI\x06\xdf*\r\x06Qf91P>\xb0\xa7=Hf\x15ӵ$T\xfe\x83g\x8fu5\x82H\x05\xd9z\x80\xa7Ǥ\xffq\x0e\x97\xfb=\xb0\x82\x1bˬ(\x81q\xdf!{\xe2\x86p\xd8)\xcd\xec^\x98y\x9a \x90\x1e\xb6\x0e\x9d\x9f\x86\x9f\x1dB9\xb7\xe0\xd1\xe9\x80\n»\xce4\x90\xdcދ\x12\x8c\xe5e\x1f\xe6\xfb\aH\x00F$\xaaxmH8\xdaַ\xddO\x0e\xc0V\xa9\x02\xb8\xbch+\x1d\xde9\xd9\xcb\xf6P\xf2k_YU \xdf\xdfn\xbe\xfe\xeb]\xef3\x1bȒ\xa7\x14\x13\x86q\xf6\x95&\x06\xd3~\xa62\xbb\xe7\x96i@\u0383\xb4X\xa3Ұ\n\xd4\xcd\x1b\x90\x8c)\xcd*\xd0B\xe5\"\v\\\xa1\xc6f\xaf\xea\"g[@\x06\xad\x9b\x06\x95V\x15h+\xc2\xd4s\xa5\xa3Q:_\a\x18\xbf\xc1A\xb9ZN\x12\xc1\x90\xf0\xf9\t\x05\xb9\xa7\x83\x9b\x1f´\xf8\x13\x93z\x80\x19V⒩\xed/\x90\xd95\xbb\x03\x8d`\x02֙\x92\a\xd0H\x81L=H\xf1?\rl\x83RoI\x18-x}\xd0\x16\x9a\xc0\x92\x17\xec\xc0\x8b\x1a\xae\x18\x979+\xf9\x91i\xc0^X-;\xf0\xa8\x8aY\xb3\x9f\x95\x06&\xe4N]\xb3\xbd\xb5\x95\xb9~\xfb\xf6AؠI3U\x96\xb5\x14\xf6\xf8\x96\x94\xa2\xd8\xd6Vi\xf36\x87\x03\x14o\x8dxXq\x9d텅\xcc\xd6\x1a\xde\xf2J\xac\buI\xdat]\xe6\xff\x148j\xde\xf4p=\x99o\xae\x90\"\x9c\xe0\x00jD'0\xae\xa9\x1bEKh\xfc\x84\xd4\xf9\xf2\xf1\xee\xbe+L\xc2\f\xa9Ot\xefHX\xcb\x02$\x98\x90;\xf03z\xa7UI0A\xe6\x95\x12\xd2\xd2\x1fY!@\x0e\xc9o\xeam),\xf2\xfd\xaf5\x18\x8b\xbcZ\xb3\x1b2/(\x87u\x8530_\xb3\x8dd7\xbc\x84\xe2\x86\x1bxq\x06 \xa5\xcd\n\t\x9bƂ\xaee\x1cVvT\xeb\xfc\x10\xcc[\x84_a\x8e\xdfU\x90\xf5\xa6\f\xb6\x13;\x91\xd1\xc4 \xed٨\x80\x81\x06ue|\xd6\xd2/\xa4\xa6\x86_\ax8]\x16z\x05\x83\xf6\xc3\xee\x89í\x19C\xb9r\xd0P\xa7H5\xe4\xee\x98\x16\xecP\xc2C\x99\xc1\xa4\xaf\xf5R\xed\xdb\tL\xe6U\xdd:\x82\xe3\tW\t\xc5GQm\xca\x12r\xc1-\x14\xc7\x19L\xdf\xdc\xf5\xab\x8fQO\x11L\xb6ujW\xecF\xf0\xecR7\xaf\x81\x89\x0eD\x9aZ\x7f\t5N-\xe4_\xc8\xdav\r[\xb7\x10\x8d\xba\xe0kٲO\xecz?IxZ\xb3͎Y\x8djq\xdb5\xb4=\x90\xa2(p\xa6\xe2\xa8*\xc8{\xc8ƻ\x13;&\xac\x1f\xdf\b\xd0-'\x9c$[;\xefg\xdd\xda\xfa\xc6n#\xca\x03|\x9d\xf6F\x8cF`\xa2\\p\xcb$|\xb3m;$\x16\x8dr\xc7\v\xd3\f\xd3\rʫ ?\xb0\x11\x88IC\xbdb\xdb\xda:\x80c\x18\x8c\x80mp\x82\xb2\xb2\xc7+\xd7v\xa7\x8aB=1C\n\x17m\xddN<\xd4\xda\xe9\x82?\xe4\xb0\xe3ua\xaf\xdd(\xfe\xb8~\xb3h\x1aZ(+4\x8d3\xc2}\xef\xab\xe1\xe0P\a\xe4Md\x10\x9c\xdb\xe0J(\xefA\xb0\x13\x03N\xdd\xed\x01u\xd3A\xe4\xdeB\x8f\x92!\xae\xbd\xb0dF\xdcI^\x99\xbd\xb2(\x0f\xaa\xb6c\xb5\x06\x03\xb8\xb9\xdb\f\x1au\xe6'bE~*\x89\xa7U쉋Sm\xe6\n\xeaޛ\xbb\r\xfb\x8an?\x04\x98\xcc\xcdEfk-\xc9\xe5\xf8\x02\xbe\xec\xd2\x16]\x17`<*\u0381m\xf5\xceU\xcb)\x17\xc6\x17|\v\x053P@f\x95\x8e\x93'E\b\\I՟\x11ʎh\xd2~\x104\xabDۂ\x01\xe6^d{\xe7n\xa2\x94\x11,\x96+0\xa41xU\x15\x11+ԖY\xc9\xf0\x9d\xcd)\x8d\xb6$\xa8\x8f!ܘ\"iK\xa2\x0enˌ6\xeeS\xbd\x11\x9bW\xa2\xf7Д\xdf%웓\xe6\xcf/\xecHn\x01\xa6\xbb\xd6%l\xf8\x9a\x02\xb5\xe7\a\x9a\x7f0Ɲ7[6\xc3\xd6\xcf>[\x9e\x85k\r\x1a\xff L#cu\xe7m\xd5\"\x86\xfd\xd4myE\x8b\xf0\x9ea\xf9\x15ۉ\xc2\x02\xf9Rs\x88v\x1c\x9dY\xce='\x81Rm/\x96\x92\xdbl\xff\xb1ٺIh1\xa0\xd5\x10\x80\xf3\xcbC\fC)\x8b\xff|\xfc&\f\xa2(s\xf6A\x81\xf9\xa4,}yQ\x12\xbbA\x9cI`ט\xa6\xa5tf\x01鲨\xff\x16\a\xb7\xbd\xba\x87\x96m°\x8d\xc4\xf8\xcc\xd1g\t\x9b\xf6\x10\x90sh\x95\xb5\xa1\xedK\xa9\xe4\xca-i\xf9\xde\x16\x00\xed\xe2\xe5Y\xa5t\x8fSW\v!\x8e\xa2\xe8ѻGk\xe5~9\xc9=\x99*\x1a\xaa\x82g\x90\x87]6Jt\xe1\x16\x1eD\xc6J\xd0\x0f\xc0*\xb4\x1b\xe9B\xb5@\x93\xbbr\x86\x14\xa6\xbb\x16\xa1x\xb30\x92\xb71VV8\xeb\x13k\x066'U\x8fd\xb5LWO\x1b%\x99w\U000874a8\xdfM\xc3\\fY\x16\xf2\xeb\xd4\aqH:\xf7\xa3\xe4\xb4\xf1\xf474\xaf$\xde\x7fO\xb3\x86\\h\xb3f\xef)\t\xb5\x80n\xfb\xb0J\xd8\xe9*\t$b\"\fC99\xf0\x02\xdd\aTޒA\xe1\x9c\t\xb5;\xf1\xa0\xd2T\xcc\xd3^\x19g\U000db371\xcbG8\xfa\xcdٮ\x96\xb8\xdc\xc8\xe8\xaa}\xbf\xa0\xce?QZ\x8dעdqd\x97\xf4\xdb%9fK\xa6\xc8\x19\xce\xdb\x02\xa9^P\xf5\xdb\xea\xb1ނ\x96`\xc1\xacJ^\xad\xfcl\xb0\xaa\x8c\xeeq\xbaB\xa9\xa2K\xc2\b\x8cӃǃ\x8d\x9b\x84Jt\xff\xe7(\x90<\x1f*e\"\x99\x16\x11\xb4n\x95\xb1n\xf1\xb0窏\xac.\xa6D\x8e~ő\xf1\x9d\x05͌U:$/\xa2\xca\x1e,\xae\xa3Ԙy\xb9q\xfbD~%\xd3\x01\xc6\x00\xf5\xb2\xd5.\xce\x1e\\\xba\xbd*\xfc\xff<̌\x1c-\x82]i\x95\x81\x89f#\xb4%\xd1\xea\xcc,\xf66\v\xbd\xdc\x05~\xbb$\xb5\x9e\xb2\f\x1d\xca27\x1eI{FP\xf4\xf1[g\xcd\x1aU\x18\xfe\x9d\"\xca\xe7\xe0\xc8\xe8\xfcBY\xf2a\"m2\xba7\xaeu\x98\x80\x1e\x98\v\xb6\xf4CM\ni\x99\xcf\xedE\xf2\xb7洔Bn\xa8#\xf6\xee\xc5\x1c\x1d\x16\xcc@,#i\xac\f\xd8\xe1۷\fi>\xa4ƾ,\xa4\xaa)\xda\xe7\xd1\xd0\xe3\xec\xe9.H:\xa7\x18:\xe2R\xd9\xeeB\x8f\xef\xe9\x8da;\xa1\x8dm\x11^\x00U\x98\x89\xac\xa7\xd1\xe1\x9d\x11\x9fʏZ\x9f\x1d\x9e~v\xad;K\x92{\xf5䓘\x97\x04\xe5\x81\xf8{~\x00\x9fJ\n2S\xb5\xa4\xc52T\x17\xd8\xcd\x02\x88\x8e\x89Θ$\xda\xccNcY\x97\xe9\x04Y\x91t\n9\xbb\xb2\xd6m\xf2#\x17i+[\xec<\xb6ک$ʱ\xd2\xcf\f\xf5ٔ\xddl\xf5\x92\x7f\x13e]2^\"[\x96Ĝ;\x97\x87\x19R\xdb\x1d\xaf\x9f\xb8\xb0\xfeĐ۔]\xa6M3UV\x05X\b\x19\x96\x99\x92F\xe4и\x0f\x9e\xff\xa3\xf9\xaa\xb1\xc2َ\x8b\xa2\xd6\vt\xf4b\xce,\x8d\xf9\xbczz\xfe@.\x1d\x91\x15\x113q\xc1~\x81\xc3=o?*\xbd\xcce\xbe\xd5\xf0\xfc\xaei\xa5\x85rY\xfe\xd3\xde\xe9,L\xf2^\xfbީ\x17^.\x8f1\xf7t\x16*a\xf2\xea\x9e6\xe5\xd5=}uO_\xdd\xd3AyuO_\xdd\xd3W\xf7t\xbc\xbc\xba\xa7\x9d\xf2\xea\x9e&ۏ\x14\fW\xb4r;Q!\t\xab\xc4\xf4\x8d9\xb4g\xfa\xf2YJ\xfe,Ȓ\xec\xea\xcdxˑ\xb3@\x8bΐ\x98\x8e\xd1kҭqJ\x86\xc9\xe4\xceJ&x\xe1\xcfp\xd6& p\xf6Y\x9b\xcd$\x80g\xf0\x9d\xdf\x19\xf9\xae\xec\xd4\xe7?\a\xf3\x9c\xeb\x16ӹ\xa6I\x19\xa6Ik\x1b\xf38'\xe5\x90.\xcd\x1cM\xa2\xea\xd2,\xd1&\x03t\xa2\xe3\xa4\xdc\xd0Ӽϩ\xa1\xccf\x84Ƴ=\xa7\xc0\x8e\xe5\x81&\xe4xN\x80\xecf\x7f.v\x03f\xa5i\xb6\xc2\xd2\xdc\xcd\xf1;\x00C\x99\xb7\xceů!\xb3\xdfK&\xa5{NsJp\xf7y\xd0\x04\xa5%\xf8\x89c\x8ex\xc5\xfb^r\xfc\xf1%\x82\xab\xe7\b\xaf\x92\x1c\x91\x97\b\xb1^*\xc8Z\x1af-I\xdeH:\xbe\xf8\x12\xc1֒pk\x91Ϙ~<\xf1\xa5\x8e%\xbe@\xd8uvൈt\xa9\xc7\x0e\x17\x87_\t\xe3\x9b9fx\xe2\xa3%\x80\x8c\x1e/\x1c\x0f\xc1\x12 \x9e\x1c+\x9c\r\xc2R\xe6\xc10L\xfb\xeeC\x82ɉL\x8bv\xd3S\x93\x90\xd26\xba\xe7\x0f\xff%\x1e\xfaK\xdc\x06O\xc1>\xf1p\xdf\xf2C}\x89t>3<\x9b\xec:\xf1\xf0ޢ\x00\xed\xcc\x10m\x12\xe2\xd4a\xbd\xe9 mz\x01nxH\xef\fw\"A\xc2\x12\xaa,?h\xf7ݛ1J\xe7\xa0g\xf7\xb5\x96\x88\xf3\xac \x0f\xe2\xa8~\xff\x83\x1d\x9dp#*\xd6\xea\xee\x99\xc58\xaa\x9a{G2\xf6'!\xfdn=\nn\xc7'\xe9m\xbc\xb5\x0eS|_\xa7\xf5R\xfd\xe3\x01n\xc7\xce@\xc55\xed\xe3o\x8f.)Ȭ\xd9G\x9e\xed\x9b\x1e\" \xa9\xdf=7l\xa7t\xc9-\xbbl\xb6Bߺ\x0e\xf0\xef\xcb5c?\xaa&}\xa4s\xafX\x04\xaa\x11eU\x1c1bb\x97]0\xdf'8Q\x81\r\xf8ܪBd\x11\x0fq\xf4J:\xd7\xe0\xe4B\x1f\xba4/\xebdA\xc4b\x14l.\xfc\x85\x85\x83K\x85\xdd\xf5\xe2g.]\xf0J\xfc'\xbdՓ\xb66\xf6\xfevCՃT\xd1;?M\xf6\\#c[\x98V\xe8\xed\xc0\xc9\xf5\xe8B\x1d\xc9^m\xfe\x9c\x80H/e\x04?ë\xf1L\xa1\x16\xbb\xdd8,\xd7$X\\\x1e\x99\xf2o!\b\x9d\xaf*\xae\xa3\x9bz\xcc˃\xb9\xeaa\x18\xec\xf8\xdc\n֤Y;}\xf9\xa3[z4\x0f\x8f\x80\xd0f\xef\xb1\xeao\xa3\x13\xa5;\xf4\xfc\x1e\x9c\xa6\x0f.\xcf\x1eY~\x01\x9c\xa6]\xa6\x15Q1\xf2S4\x1d\xef\xd9W\x0f\x8d\xbfD\xfegu\x80\x0f\xd1U\xc4\xfe\xb3\x18\x83&#\tt\x01\xeaԵ\xe9m\xd6\\\xfc:\xebgȈ\v\xa8\xf8\x8b\xaf\x17\x8cϷ\x18\x7fK\x83\xee\xff\x0e\xb0'l\x1bN\xd9ۯ\x14n6\xea\xd2\xcfp\x1fL\x86\xa5\xc2\xc1U\xad\x11\x90\xb1\xa7D\x9e\x8bZVi\xfe\x00?)\xf7\xdaK\n\xb5\xfa-z\x0f\xfexg.d\x13\xfb\xb9\x16S\xe6~lC\x80\xed!\x83\x93\xeb\xe8\x11\xdb3o۷\xb6H\x18\xdc\xfd\xfdOn@\xf44\xc6\a\xff\xee\x05\xea]\x03H\xe90P\xd7h\x1b\xd7N{\xf5D\xf7\xb9w\x9f\xab\xe83\x1a\xfe\xd0{\xfa#L\x92\x14\xb5\xf6u\xbce\xc7[\xeeLשdA\xb5\x8b\xc2\xe2ƨL\x90\x83M\xbb#tj\xe4\xe5\ue71e\n\x94&\xe8X\x1b\xf8\xfc$A\x7f\t*\xd9ld쭍\xfe\xac9i\x18}g\xc3*r\xeb\a\xd5\xc7\xc29\xe9\td\xdc+-a\x9bG\x98\xe6\xfd\xa9S\xd2\xcd̫\xb8\x96\x1f\xf7IV\xe3\xcfᬚ\x17z.\x12(\xeb^\xa1\xe9\x03\x1e\x7f`\xcc=W\x93\xf1\xca\xd6:\xa8\x9cZ\xd3\x05\xdc\b\x04\xdc\xfd\xd4\xe7=1\xd6>H5\xc3\xcb\xf6a\xa7v\xe1{\xf6\xc9\xc8\x11\xfe5\x8f\x84E_\x14r!\xa3{\xd2q\x85\xf0\xcfc\xe7\xe8<@\x9c\xef\xdc;Q\t\xe3\xbd\vOe\x9d\x0e\xb8\x19\x06\x0e9\xf6\xf2\xd4K\x8e\x84\xae^\x9f\x19\xc3-\xd6i\xce.z\x91\xa1\x86\xe1\xca\xf6\xbb\x18\x13\xc6\x0f\xa3\xad\xd8'8\r>W\xec\xa3\xc4A\x9c\x12\xc0\x9d8\x83\x9c\x16\xfe\xc7\x1e\x8a\x9c\x1c\xe2\xa1iE\xc7\xfdF\xf4^_a\x0f\xaa\x0f\x92\x91\xe9\t\x9e\xa6\x8a;\xda7&\xa0\x7f\x10;\xb7+\x93\xe1\x98\xfexR#\xaa\x82'\xd5oL\xf5\x8e*\x87\x93\x8f\xf4\x9aX\xde\x11\x12\xefwv\xbf\xd4\xdb\xf6\x06}\xf6\xb7\xbf_\xfco\x00\x00\x00\xff\xff}\xef\x8a\xf1Mx\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4V\xcfo\xeb6\f\xbe\xe7\xaf \xb0û\xcc\xce\xebv\x19r\x1b\xba\x1d\x8am\x0fE\xf3л\"\xd3\tWY\xf2H*]\xf6\xd7\x0f\x92\xec&\xb1\x9d\xb5\x1b0\xdd\"\xf1\xc7Ǐ\xe4\xe7TU\xb52==#\v\x05\xbf\x01\xd3\x13\xfe\xa9\xe8\xd3/\xa9_~\x90\x9a\xc2\xfax\xb7z!\xdfl\xe0>\x8a\x86\xee\t%D\xb6\xf8\x13\xb6\xe4I)\xf8U\x87j\x1a\xa3f\xb3\x020\xde\a5\xe9Z\xd2O\x00\x1b\xbcrp\x0e\xb9ڣ\xaf_\xe2\x0ew\x91\\\x83\x9c\x83\x8f\xa9\x8f\x9f\xeb\xbb\xef\xea\xcf+\x00o:܀ \xa775\x1a\x85\U0004f222R\x1f\xd1!\x87\x9a\xc2Jz\xb4)\xfe\x9eC\xec7p~(\xfeC\xee\x82{\x9bCms\xa8\xa7\x12*\xbf:\x12\xfd\xe5\x96ů4X\xf5.\xb2qˀ\xb2\x81\x1c\x02\xeb\x97s\xd2\nD\xb8\xbc\x90\xdfGgx\xd1y\x05 6\xf4\xb8\x81\xec\xdb\x1b\x8b\xcd\n` $Ǫ\x06.\x8ew%\x9c=`gJ\x12\x80У\xff\xf1\xf1\xe1\xf9\xfb\xed\xd55@\x83b\x99zʹ.T\x06$``@\x01\x1a\xc0X\x8b\"`#3z\x85\x82\x12ȷ\x81\xbb\xdcɷ\xd0\x00f\x17\xa2\x82\x1e\x10\x9e3\xe5Ce\xf5\x9bIϡGV\x1a\xd9\x18\xdc\xceCvq;\xc1\xfa)\x95S\xac\xa0IӅ\x923\r\x94`30\x00\xa1\x05=\x90\x00c\xcf(\xe8u\x8a2\xf3ӂ\xf1\x10v\xbf\xa3\xd5z\xe0AR\xb3\xa2k\xd2P\x1e\x91\x15\x18m\xd8{\xfa\xeb-\xb6$BRRgt\x9c\x93\xf3!\xaf\xc8\xde88\x1a\x17\xf1[0\xbe\x81Μ\x801e\x81\xe8/\xe2e\x13\xa9\xe1\xb7\xc0\x98\xc9\xdc\xc0A\xb5\x97\xcdz\xbd'\x1d\x97ˆ\xae\x8b\x9e\xf4\xb4\xce{B\xbb\xa8\x81e\xdd\xe0\x11\xddZh_\x19\xb6\aR\xb4\x1a\x19צ\xa7*C\xf7y\xc1\xea\xae\xf9\x86\x87u\x94OWX\xf5\x94&K\x94\xc9\xef/\x1e\xf2B\xfcC\a\xd2:\x94\xf9(\xae\xa5\x8a3\xd1\xe9*\xb1\xf3\xf4\xf3\xf6+\x8c\xa9s3\xa6\xecg\xdeώrnA\"\x8c|\x8b\\\x9a\xd8r\xe8rL\xf4M\x1fȗ鲎\xd0O闸\xebHe\x9c\xddԫ\x1a\xee\xb3\xe2\xc0\x0e!\xf6\x8dQljx\xf0po:t\xf7F\xf0\x7fo@bZ\xaaD\xec\xc7Zp)\x96S\xe3\xc2\xda\xc5\xc3(s7\xfa\xb5\xb0\xdd\xdb\x1em\xea`\"1ySK6\xaf\a\xb4\x81\xc1,\xb9\xd4\x1fB\x92=\xfe%\x96AI\n\x9a\x89\xbe\xa4\xfd|\x1fͲ\x9c䗃\x11\x9c^N0=&\x9bi~G-ړuXB\x145\xc1\xf7\xa1\xa4\x83>v\xf3\x9c\x15|\xc1ׅ\xdbG\x0eIY\xb3\xae_\x9f\x1b\xb3\x01\xe5{\xb3'?+wZY\xb1\xca߰K\xa9\xbe\x10\xe8!\x10p\xf4>\xed\xedL!3\x90\xa9\x92\xcflH\xb1[@\xb3\x88\xe7\xc1\xb7!\x7f\xf0MJl\xb4\xec\x13\x0e\xcd\x1e\xf2\x14\\\v\x01o\xf7\xba\x9c\xb9x}\x88\xd0r\xf2\x97\xf4\xbf9'\xb9!\xc6\xc5\xdcUF\xb5\xf8\x902.1\xbe\xbc_\x03\xca\xe8\x9c\xd99܀r\x9c{\x17_\xc3lNө\x19G\xed+u(j\xba\xfe\xbd\x01\x9a9\xa4=y=\xa0\xbf\xb5\r\xf0j\xa6*\x7f\x95\x19v\xa7[\xae\xf7o\xff\x01\xe7+UFw\x03I\xbb+\xa5\x05\xce>D\xcab\xf7\xcaH/\xfe\xf3\x98\x11\xb2\xbd\xb4\x1d5\xe3j5\xc6?\"\xf3\x1anBXl\xf6\xec2\x87o.\xca\x13\rl\xf6c\xc1\x7f\a\x00\x00\xff\xff\xb1J-\xe7\xa6\v\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4VA\x93\xdb6\x0f\xbd\xfbW`&\x87\xbdDr\xf2}\x97\x8e/\x9d̦\x87L\x93f'N\xf7N\x8b\x90\x8d\x9a\"U\x10\xd4\xc6\xfd\xf5\x1d\x90\xd2\xdak\xcb\xc9n\xa7\xd5\xc5c\n\x04\x1f\xde\xc3\x03UU\xd5\xc2\xf4t\x8f\x1c)\xf8\x15\x98\x9e\xf0\x9b\xa0\xd7\x7f\xb1\xde\xff\x14k\n\xcb\xe1\xedbOޮ\xe06E\t\xdd\x17\x8c!q\x83\xef\xb1%OB\xc1/:\x14c\x8d\x98\xd5\x02\xc0x\x1f\xc4\xe8rԿ\x00M\xf0\xc2\xc19\xe4j\x8b\xbeާ\rn\x129\x8b\x9c\x93OG\x0fo\xea\xb7\xff\xab\xdf,\x00\xbc\xe9p\x05Cp\xa9\xc3\xe8M\x1fwA\\hJ\xcez@\x87\x1cj\n\x8b\xd8c\xa3Gl9\xa4~\x05\xc7\x17%\xc5x|\x81~\x9f\xb3\xad\xc7l\x1f\xc7l9\xc0Q\x94_\xbf\x13\xf4\x91\xa2\xe4\xc0\xde%6\xee*\xb2\x1c\x13w\x81\xe5\xb7\xe3\xe9\x15\fѕ7\xe4\xb7\xc9\x19\xbe\xb6\x7f\x01\x10\x9b\xd0\xe3\n\xf2\xf6\xde4h\x17\x00#?9]5Q\xf3\xb6dlvؙr\x0e@\xe8ѿ\xbb\xfbp\xff\xff\xf5\x93e\x00\x8b\xb1a\xea%\xb3<_\"P\x04\x03\x13\x12x\xd8!#\xdcg>!J`\x8c#\xe8Ǥ\x00\x13\xfeX?.\xf6\x1czd\xa1\xa9\xf8\xf2\x9c\xf4\xd7\xc9\xea\x19\xae\x1b\x85^\xa2\xc0jca\x04\xd9\xe1T>ڱZ\b-Ȏ\"0\xf6\x8c\x11\xbd\x1c\x85<>\xa1\x05\xe3!l\xfe\xc0FjX#k\x1a\xd5&9\xab\xfd8 \v06a\xeb\xe9\xaf\xc7\xdc\x11$\xe4C\x9d\x11\x1c5?>\xe4\x05\xd9\x1b\a\x83q\t_\x83\xf1\x16:s\x00F=\x05\x92?ɗCb\r\x9f\x02#\x90o\xc3\nv\"}\\-\x97[\x92\xc9WM\xe8\xba\xe4I\x0e\xcbl\x11\xda$\t\x1c\x97\x16\at\xcbH\xdb\xcap\xb3#\xc1F\x12\xe3\xd2\xf4Te\xe8\xbe\xf8\xa0\xb3\xafxtb\xbcy\x82U\x0e\xdaEQ\x98\xfc\xf6\xe4E6\xc2w\x14P\x0f\x94F([K\x15G\xa2uI\xd9\xf9\xf2\xcb\xfa+LGg1\xce\xd9ϼ\x1f7ƣ\x04J\x18\xf9\x16\xb9\x88\xd8r\xe8rN\xf4\xb6\x0f\xe4%\xffi\x1c\xa1?\xa7?\xa6MG\xa2\xba\xff\x990\x8ajU\xc3m\x1e6\xb0AH\xbd5\x82\xb6\x86\x0f\x1enM\x87\xee\xd6D\xfc\xcf\x05P\xa6c\xa5\xc4>O\x82\xd39y\x1e\\X;5\xd88ޮ\xe85\xef\xe4u\x8f\xcd\x13\x03i\x16jitv\x1b\xf8\x8cW3\xf9|>_\xfd$|\xde\xe0P\x86|K\xdb\xf3U\x00cm\xbe\"\x8c\xbb\xbb\xba\xf7;\x84\xcd\xd4}\x9bO\xd2Fm\x03+\xa2\x81,r5\xd59\"I<\x16L\xe8l\xac/R^\xe1<\x97\xc2hUc\xe3.\x81>E\xf2\x18\x98\xef8C\xbeP~L\x90[\x8f\xbbq\xc6zAo\xf3P\xbf@\x13r\x0fG\xb4\xf0@\xb2+\xe6p\xa7\x97\xd4\xf3T\xd0g\x8f\x87\xb9\xe53\xec_w\xa8\x91e\x9c\"Dl\x18EqDtj^uf\r\xf0)\xc5l/3\x9b\x11tD\x90\x9dv\xef\xf1pI4\xfcH\xdc\xf1\xbe\xff1\xe4\x1b\xbd\x17'\xc0\x8c-2z\x99\xb5\xb8~b\xb0G\xc1\xecr\x1b\x9a\xa8\x06o\xb0\x97\xb8\f\x03\xf2@\xf8\xb0|\b\xbc'\xbf\xad\x94\xf0\xaa4B\\\xe6\xef\x86\xe5\xab\xfcs\xa5䯟\xdf\x7f^\xc1;k!\xc8\x0eYUk\x93\x9b\x1a\xed\xe4\xb6{\x9d'\xeekHd\x7f\xbe\xf9'\xbc\x84\xbe8\xe7\x19ܬs\xf7\x1f\xf4\xe6Π\x94\xa2uQ%0\xe8\xdcT\xb1\xbbQ\xcd2\x1f\xe6\x1aq´\t\xc1\xa1\xb9l=\x9d\xbe\xc4h/!Uz\xc2Kl\x06\xf0\xad:\nUu\xa6\xafJ\xb4\x91\xd0Qs\x16=\xf9\xfc\a\x96\xbc\x1b\xc3t<(\aӶ\xa9m\xcaWL\xfe\xa61[\xbc6\x16f\x14\x99/\xbcz<\xe0Y\x03]\x8c\xa4\xf8\U000917b7\x8d\x91\x9bq\xac7\x89\xb5\xfdǜ3\x9f?\xff\xceX\xefw&\xcex\xf3\x19\xa8\xeft\xe7$\x83\xa3\x16\x9bC\xe3\xb0$\x84\xd0\xce\xf4ދ \xeb\x83>us\x8d\xf8n0\xe4\xcc\xc6\xe1̻߽\xb9\xfa\xf6\xaa\xf8\xb3z^,F\xfdƱ+\x10N%\xf7\xd8e\xe3\xca\xdf\x01\x00\x00\xff\xff\xec\xa0\xe0\xa1k\r\x00\x00"), diff --git a/design/Implemented/existing-resource-policy_design.md b/design/Implemented/existing-resource-policy_design.md index bed627c219..602ff346fd 100644 --- a/design/Implemented/existing-resource-policy_design.md +++ b/design/Implemented/existing-resource-policy_design.md @@ -20,7 +20,6 @@ Related issue: https://github.com/vmware-tanzu/velero/issues/4066 ## Non Goals - Change existing restore workflow for `ServiceAccount` objects -- Add support for `ExistingResourcePolicy` as `recreate` for Kubernetes resources. (Future scope feature) ## Unrelated Proposals (Completely different functionalities than the one proposed in the design) - Add support for `ExistingResourcePolicy` to restore API for Non-Kubernetes resources. @@ -55,11 +54,9 @@ skip restoration. - Changed resources: Velero will first try to patch the changed resource, Now if the patch: - succeeds: Then the in-cluster resource gets updated with the labels as well as the resource diff - fails: Velero adds a restore warning and tries to just update the backup/restore labels on the resource, if the labels patch also fails then we add restore error. -3. `recreate`: Similar to `update` but if resource already exists and is immutable (such as Pods), then Velero attempt to recreate the resource by deleting it first. +3. `recreate`: Similar to `update` but if resource already exists and is immutable (such as Pods), then Velero attempt to recreate the resource by deleting it first. More details below. -*Note:* The `recreate` option is being implemented in [#6354](https://github.com/vmware-tanzu/velero/pull/6354) separate from original proposal. - -Velero will not be deleting any resources for policy `update` and `none` proposed in +Velero will not be deleting any resources for `update` and `none` policy proposed in this design but Velero will patch the resources in `update` policy option. Example: @@ -141,22 +138,38 @@ existingResourcePolicyOverrides: The `existingResourcePolicy` spec field will be an `PolicyType` type field. Restore API: -``` +```go type RestoreSpec struct { . . . // ExistingResourcePolicy specifies the restore behaviour for the Kubernetes resource to be restored +// +kubebuilder:validation:Enum=none;update;recreate // +optional +// +nullable ExistingResourcePolicy PolicyType } ``` PolicyType: -``` +```go type PolicyType string const PolicyTypeNone PolicyType = "none" const PolicyTypePatch PolicyType = "update" +const PolicyTypePatch PolicyType = "recreate" +``` + +existingResourcePolicyRecreateResources will be a new field in the Restore API which will be a slice of resource names where recreate ExistingResourcePolicy will apply. Resoruce names can be in the format of "group/version/resource" or "resource". If empty, a default list of resources (Pod, PV, Secret, ConfigMap) will be used. Recreate will not recreate resources with ownershipReferences or finalizers. +```go +// ExistingResourcePolicyRecreateResources is a slice of resource names where recreate ExistingResourcePolicy will apply. +// Resoruce names can be in the format of "group/version/resource" or "resource" +// If empty, a default list of resources (Pod, PV, Secret, ConfigMap) will be used. +// Resources with finalizers without velero.io/recreate-remove-finalizer=true annotation will not be recreated. +// Recreate will not recreate resources with ownershipReferences. +// +kubebuilder:example:={"pods", "persistentvolumes", "secrets", "configmaps"} +// +optional +// +nullable +ExistingResourcePolicyRecreateResources []string `json:"existingResourcePolicyRecreateResources,omitempty"` ``` ### Approach 2: Add a new spec field `existingResourcePolicyConfig` to the Restore API @@ -260,4 +273,20 @@ Restore describer will also be updated to reflect the policy `pkg/cmd/util/outpu We have decided to go ahead with the implementation of Approach 1 as: - It is easier to implement - It is also easier to scale and leaves room for improvement and the door open to expanding to approach 3 -- It also provides an option to preserve the existing velero restore workflow \ No newline at end of file +- It also provides an option to preserve the existing velero restore workflow + +### Recreate policy details +Existing resource restore policy *Recreate* purpose is to help users restore existing resources that exists in cluster but differ from backup resouce, are immutable and failed to be updated due to immutability. + +The policy will be used to delete the existing resource and recreate it with the backup resource. + +The policy will be used for resources that are immutable and cannot first be updated. + +#### Restrictions and Limitations +Resources with OwnerReferences will not be supported by the recreate policy, at least for the initial implementation. +The policy will only be used on resources specified at Restore.Spec. like Pods, PVCs, PVs, etc. + +If an existing resource have finalizers, it would need to have annotations `velero.io/recreate-remove-finalizer=true` to be considered for recreation. + + +*Note:* The `recreate` option is implemented in [#6354](https://github.com/vmware-tanzu/velero/pull/6354) separate from original update policy proposal. \ No newline at end of file diff --git a/pkg/apis/velero/v1/restore_types.go b/pkg/apis/velero/v1/restore_types.go index 03ec3f10e4..37feda9830 100644 --- a/pkg/apis/velero/v1/restore_types.go +++ b/pkg/apis/velero/v1/restore_types.go @@ -115,6 +115,16 @@ type RestoreSpec struct { // +nullable ExistingResourcePolicy PolicyType `json:"existingResourcePolicy,omitempty"` + // ExistingResourcePolicyRecreateResources is a slice of resource names where recreate ExistingResourcePolicy will apply. + // Resoruce names can be in the format of "group/version/resource" or "resource" + // If empty, a default list of resources (Pod, PV, Secret, ConfigMap) will be used. + // Resources with finalizers without velero.io/recreate-remove-finalizer=true annotation will not be recreated. + // Recreate will not recreate resources with ownershipReferences. + // +kubebuilder:example:={"pods", "persistentvolumes", "secrets", "configmaps"} + // +optional + // +nullable + ExistingResourcePolicyRecreateResources []string `json:"existingResourcePolicyRecreateResources,omitempty"` + // ItemOperationTimeout specifies the time used to wait for RestoreItemAction operations // The default value is 4 hour. // +optional diff --git a/pkg/apis/velero/v1/zz_generated.deepcopy.go b/pkg/apis/velero/v1/zz_generated.deepcopy.go index 18d881959e..d1034ee837 100644 --- a/pkg/apis/velero/v1/zz_generated.deepcopy.go +++ b/pkg/apis/velero/v1/zz_generated.deepcopy.go @@ -1360,6 +1360,11 @@ func (in *RestoreSpec) DeepCopyInto(out *RestoreSpec) { **out = **in } in.Hooks.DeepCopyInto(&out.Hooks) + if in.ExistingResourcePolicyRecreateResources != nil { + in, out := &in.ExistingResourcePolicyRecreateResources, &out.ExistingResourcePolicyRecreateResources + *out = make([]string, len(*in)) + copy(*out, *in) + } out.ItemOperationTimeout = in.ItemOperationTimeout if in.ResourceModifier != nil { in, out := &in.ResourceModifier, &out.ResourceModifier diff --git a/pkg/controller/restore_controller.go b/pkg/controller/restore_controller.go index a15db454b9..b785d3d9ad 100644 --- a/pkg/controller/restore_controller.go +++ b/pkg/controller/restore_controller.go @@ -90,7 +90,10 @@ var nonRestorableResources = []string{ "backuprepositories.velero.io", } -var ExternalResourcesFinalizer = "restores.velero.io/external-resources-finalizer" +const ( + ExternalResourcesFinalizer = "restores.velero.io/external-resources-finalizer" + RecreateRemoveFinalizerAnnotation = "velero.io/recreate-remove-finalizer" +) type restoreReconciler struct { ctx context.Context diff --git a/pkg/restore/restore.go b/pkg/restore/restore.go index 5dae238634..07378746f3 100644 --- a/pkg/restore/restore.go +++ b/pkg/restore/restore.go @@ -2540,15 +2540,15 @@ func (ctx *restoreContext) processRecreateResourcePolicy(fromCluster, fromCluste } } // wait up to 2 minutes until object does not exists in cluster - for timeStarted := time.Now(); apierrors.IsNotFound(err) || time.Now().After(timeStarted.Add(2*time.Minute)); { + wait.PollImmediate(5*time.Second, 2*time.Minute, func() (bool, error) { _, err = resourceClient.Get(obj.GetName(), metav1.GetOptions{}) if !apierrors.IsNotFound(err) { - ctx.log.Warnf("get attempt to check object is gone failed for %s %s: %v", fromCluster.GroupVersionKind(), kube.NamespaceAndName(fromCluster), err) - time.Sleep(10 * time.Second) - continue + ctx.log.Infof("waiting until %s %s IsNotFound for recreate existingResourcePolicy. current err from get: %v", fromCluster.GroupVersionKind(), kube.NamespaceAndName(fromCluster), err) + return false, nil } - break - } + return true, nil + }) + // Create object from latest backup/restore) obj.SetNamespace(namespace) _, err = resourceClient.Create(obj)