From 64979308ac3239e95d7323eb68bcd2ab4d38fed5 Mon Sep 17 00:00:00 2001 From: westmakaha Date: Tue, 1 Sep 2015 00:05:26 -0400 Subject: [PATCH 001/114] initial sandstorm port --- .meteor/packages | 8 +- .meteor/platforms | 2 - .meteor/versions | 4 +- .../default/virtualbox/action_provision | 1 + .../default/virtualbox/action_set_name | 1 + .../machines/default/virtualbox/creator_uid | 1 + .../.vagrant/machines/default/virtualbox/id | 1 + .../machines/default/virtualbox/index_uuid | 1 + .../machines/default/virtualbox/private_key | 27 ++++++ .../default/virtualbox/synced_folders | 1 + .sandstorm/Vagrantfile | 83 +++++++++++++++++++ .sandstorm/build.sh | 15 ++++ .sandstorm/global-setup.sh | 30 +++++++ .sandstorm/launcher.sh | 16 ++++ .sandstorm/sandstorm-pkgdef.capnp | 66 +++++++++++++++ .sandstorm/setup.sh | 47 +++++++++++ .sandstorm/stack | 1 + client/lib/avatar.coffee | 3 +- client/views/account/avatar/prompt.html | 3 +- client/views/app/sideNav/userStatus.html | 3 + client/views/main.html | 12 ++- client/views/username/sandstormshare.html | 7 ++ packages/rocketchat-hubot/hubot.coffee | 4 +- .../settings/server/updateServices.coffee | 1 + .../client/oembedImageWidget.coffee | 3 +- server/configuration/accounts_meld.coffee | 3 +- server/lib/accounts.coffee | 12 +-- server/startup/avatar.coffee | 12 ++- server/startup/initialData.coffee | 1 + 29 files changed, 346 insertions(+), 23 deletions(-) create mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/action_provision create mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/action_set_name create mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/creator_uid create mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/id create mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/index_uuid create mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/private_key create mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/synced_folders create mode 100644 .sandstorm/Vagrantfile create mode 100755 .sandstorm/build.sh create mode 100755 .sandstorm/global-setup.sh create mode 100755 .sandstorm/launcher.sh create mode 100644 .sandstorm/sandstorm-pkgdef.capnp create mode 100755 .sandstorm/setup.sh create mode 100644 .sandstorm/stack create mode 100644 client/views/username/sandstormshare.html diff --git a/.meteor/packages b/.meteor/packages index a23bfb4c45a..f6ee307e1ed 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -34,10 +34,10 @@ rocketchat:markdown rocketchat:me #rocketchat:slashcommands-invite rocketchat:mentions -rocketchat:oembed -rocketchat:webrtc -#rocketchat:external #rocketchat:hubot +#rocketchat:oembed +rocketchat:webrtc-ib +#rocketchat:external #rocketchat:irc konecty:change-case @@ -82,3 +82,5 @@ monbro:mongodb-mapreduce-aggregation rocketchat:custom-oauth rocketchat:gitlab rocketchat:statistics +kenton:accounts-sandstorm + diff --git a/.meteor/platforms b/.meteor/platforms index 2d49a856332..8a3a35f9f62 100644 --- a/.meteor/platforms +++ b/.meteor/platforms @@ -1,4 +1,2 @@ -android browser -ios server diff --git a/.meteor/versions b/.meteor/versions index 6d51817b864..f0c9af8cfc7 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -46,6 +46,7 @@ jquery@1.11.3_2 json@1.0.3 kadira:blaze-layout@2.0.1 kadira:flow-router@2.4.0 +kenton:accounts-sandstorm@0.1.4 kevohagan:sweetalert@1.0.0 konecty:autolinker@1.0.2 konecty:change-case@2.3.0 @@ -114,9 +115,8 @@ rocketchat:logger@0.0.1 rocketchat:markdown@0.0.1 rocketchat:me@0.0.1 rocketchat:mentions@0.0.1 -rocketchat:oembed@0.0.1 rocketchat:statistics@0.0.1 -rocketchat:webrtc@0.0.1 +rocketchat:webrtc-ib@0.0.1 routepolicy@1.0.5 service-configuration@1.0.4 session@1.1.0 diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/action_provision b/.sandstorm/.vagrant/machines/default/virtualbox/action_provision new file mode 100644 index 00000000000..4f8991f5fe2 --- /dev/null +++ b/.sandstorm/.vagrant/machines/default/virtualbox/action_provision @@ -0,0 +1 @@ +1.5:c17761bf-b2f4-49da-87b9-79a95da91252 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name b/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name new file mode 100644 index 00000000000..9a8930725a3 --- /dev/null +++ b/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name @@ -0,0 +1 @@ +1440583526 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid b/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid new file mode 100644 index 00000000000..e37d32abba4 --- /dev/null +++ b/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid @@ -0,0 +1 @@ +1000 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/id b/.sandstorm/.vagrant/machines/default/virtualbox/id new file mode 100644 index 00000000000..eb9637c6cf2 --- /dev/null +++ b/.sandstorm/.vagrant/machines/default/virtualbox/id @@ -0,0 +1 @@ +c17761bf-b2f4-49da-87b9-79a95da91252 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid b/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid new file mode 100644 index 00000000000..fb8410bdfa9 --- /dev/null +++ b/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid @@ -0,0 +1 @@ +0d8eab53d7a1444288ff01aef6a03573 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/private_key b/.sandstorm/.vagrant/machines/default/virtualbox/private_key new file mode 100644 index 00000000000..d30d91db6e7 --- /dev/null +++ b/.sandstorm/.vagrant/machines/default/virtualbox/private_key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAk1hkJc1e5h4yDnnOCJ29YUf0x1DhgSkGY0hcfWAubSEGS1HX +bxLIE+Al44jENNPrrdddtCKY+onxeefQo7FUFxVMEOM5JqFzpyq1Sliw9w7QmJef +DImS0z54ezqQ952W7BQc/XOndVpzvRPVREcRccOdGk5P60zoWZP/Oy4tviHcH7RM +faeBrs7ykD6RJKAjKwuMF3p/+FlPCPwql8cTifYZspFwFTja/XStk3PX4eLle5si +ZFN7SjsDa+FflUenmgkpW04E6TUaQHVhapHJCCbYRqwCrUX/5Yf2PakFPqfnRBaE +KKkGLRnVc7UrCDk21m/IZRmTHgSLAyDEGkFOIwIDAQABAoIBAHCJBAQzNJXA3i5c +LVY7U5bnJDbOuUyyjqRpcep3+T10CaChI088Iv+7JHUB0gkfClO9t12LRxejH4Eh +4iIDn9v5ch07zjyI9xHn9oqP7qji8cJ5mwoyUKdygQZtFqdn/wrT2chh+rYQnXD9 +otcBCHvBEU40HanzFUrFVBxZCqq5fP69ujsOVghykyzI5mWIRNGFXyvN8HxjXMr6 +mSiCvzEMscTZzdoCvy18lvDTWg5GyPLq9EM+4xQoEqlQv2RQEUmC2wC4JK09bJ8T +d19RGax1Nvbvw0ywWTgG/blGS0h7Q4aJziIL1Bv1IoIonn69wjL/qaWh+vqhL6QV +m87qh7ECgYEAwzy0kwO5Xo1mWZN4lJ8WrU7xh5TtsSJkfMlEQNsmhHAFN9B7p7MX +CrIAMd+U9z8ptxgFZwfoff4Qcb9QkHo8wZLj9vYWTAoJ0VyvVwUTwi4D5lHvFDe/ +IX2N4pJv5AB3+xValyg+z6ShGKmWJuLhCYtcYFxdr8tZ45RlHYzv0V0CgYEAwTP1 +F3dURItjPVQ7BSHXmPoSTSuhAjbQp+jWOIEa+wnM3K3OncfbICFqSwFsz1cjKDjz +fAMXw9is7s/T8CEm6u4DFKbZ2qlAcvq02oqZu1/6UZXxTXFdjfQaKpSQ4ZWMxVBE +nKIs/e/416zCH6zd1Xauus92xI+zse5iSn++JX8CgYBGu/ewS+kdGJ28VnGZZwoQ +QEnBlXOIea1uiHzyAnQyB2PclOw4FeqDNXpcl2ShL4EtlMZgTb0t6J6Ml4PY1HCu +sUlmcEIjyn9EGxBrtqsx7vn6uDSmXowg1hxRujxPntvZXCM2IJ6hHERBay+7Zveh +PZx6TPykdEhc66a2zhkVAQKBgAOwHTaUdYxVaNCL4hCIA9iMtXq5oXosV7FM1YIA +nOY72qg/vRjv7rPfT2sdHNmcXTRwWd19JZ/8a9inKPGFgHutjWuAf9oXrv5C4N7n +FGYqP9n81b1Xs6R5C2LSsS1NMIG3tYeT5O33/bUIPDBkmVtwx4cTXL4FzDVSSpgH +dja7AoGAMAXuTIrq1+L6sMQYgwx/9loN4KkdYAP7ZDlX+2uROzk2u/aCw9dGIJMs +R5JSS5+5oG2MRNTAnz/35qge5M9ucRdiNKdxO4jLK9e009m+wl4AxVFFRz0Bz8Nf +QYlzA2d5S3I1EJSUNjjDkEq9szaVeRmVKt40n3X/JKjTggX6Ibg= +-----END RSA PRIVATE KEY----- diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders b/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders new file mode 100644 index 00000000000..a01b299f5db --- /dev/null +++ b/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders @@ -0,0 +1 @@ +{"virtualbox":{"/opt/app":{"guestpath":"/opt/app","hostpath":"/home/sam/projects/Rocket.Chat/Rocket.Chat","disabled":false},"/host-dot-sandstorm":{"guestpath":"/host-dot-sandstorm","hostpath":"/home/sam/.sandstorm","disabled":false},"/vagrant":{"guestpath":"/vagrant","hostpath":"/home/sam/projects/Rocket.Chat/Rocket.Chat","disabled":false}}} \ No newline at end of file diff --git a/.sandstorm/Vagrantfile b/.sandstorm/Vagrantfile new file mode 100644 index 00000000000..c8421bb9861 --- /dev/null +++ b/.sandstorm/Vagrantfile @@ -0,0 +1,83 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! +VAGRANTFILE_API_VERSION = "2" + +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| + # We base ourselves off Debian Jessie + config.vm.box = "debian/jessie64" + + if Vagrant.has_plugin?("vagrant-vbguest") then + # vagrant-vbguest is a Vagrant plugin that upgrades + # the version of VirtualBox Guest Additions within each + # guest. If you have the vagrant-vbguest plugin, then it + # needs to know how to compile kernel modules, etc., and so + # we give it this hint about operating system type. + config.vm.guest = "debian" + end + + # We forward port 6080, the Sandstorm web port, so that developers can + # visit their sandstorm app from their browser as local.sandstorm.io:6080 + # (aka 127.0.0.1:6080). + config.vm.network :forwarded_port, guest: 6080, host: 6080 + + # Use a shell script to "provision" the box. This installs Sandstorm using + # the bundled installer. + config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/global-setup.sh" + # Then, do stack-specific and app-specific setup. + config.vm.provision "shell", inline: "sudo bash /opt/app/.sandstorm/setup.sh" + + # Shared folders are configured per-provider since vboxsf can't handle >4096 open files, + # NFS requires privilege escalation every time you bring a VM up, + # and 9p is only available on libvirt. + + # Calculate the number of CPUs and the amount of RAM the system has, + # in a platform-dependent way; further logic below. + cpus = nil + total_kB_ram = nil + + host = RbConfig::CONFIG['host_os'] + if host =~ /darwin/ + cpus = `sysctl -n hw.ncpu`.to_i + total_kB_ram = `sysctl -n hw.memsize`.to_i / 1024 + elsif host =~ /linux/ + cpus = `nproc`.to_i + total_kB_ram = `grep MemTotal /proc/meminfo | awk '{print $2}'`.to_i + end + # Use the same number of CPUs within Vagrant as the system, with 1 + # as a default. + # + # Use at least 512MB of RAM, and if the system has more than 2GB of + # RAM, use 1/4 of the system RAM. This seems a reasonable compromise + # between having the Vagrant guest operating system not run out of + # RAM entirely (which it basically would if we went much lower than + # 512MB) and also allowing it to use up a healthily large amount of + # RAM so it can run faster on systems that can afford it. + if cpus.nil? + cpus = 1 + end + if total_kB_ram.nil? or total_kB_ram < 2048000 + assign_ram_mb = 512 + else + assign_ram_mb = (total_kB_ram / 1024 / 4) + end + # Actually apply these CPU/memory values to the providers. + config.vm.provider :virtualbox do |vb, override| + vb.cpus = cpus + vb.memory = assign_ram_mb + + override.vm.synced_folder "..", "/opt/app" + override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm" + override.vm.synced_folder "..", "/vagrant" + end + config.vm.provider :libvirt do |libvirt, override| + libvirt.cpus = cpus + libvirt.memory = assign_ram_mb + libvirt.random_hostname = true + + override.vm.synced_folder "..", "/opt/app", type: "9p", accessmode: "passthrough" + override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm", type: "9p", accessmode: "passthrough" + override.vm.synced_folder "..", "/vagrant", type: "9p", accessmode: "passthrough" + end +end diff --git a/.sandstorm/build.sh b/.sandstorm/build.sh new file mode 100755 index 00000000000..50a730f64f8 --- /dev/null +++ b/.sandstorm/build.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail + +# Make meteor bundle + +METEOR_WAREHOUSE_DIR="${METEOR_WAREHOUSE_DIR:-$HOME/.meteor}" +METEOR_DEV_BUNDLE=$(dirname $(readlink -f "$METEOR_WAREHOUSE_DIR/meteor"))/dev_bundle + +cd /opt/app +meteor build --directory /home/vagrant/ +(cd /home/vagrant/bundle/programs/server && "$METEOR_DEV_BUNDLE/bin/npm" install) + +# Copy our launcher script into the bundle so the grain can start up. +mkdir -p /home/vagrant/bundle/opt/app/.sandstorm/ +cp /opt/app/.sandstorm/launcher.sh /home/vagrant/bundle/opt/app/.sandstorm/ diff --git a/.sandstorm/global-setup.sh b/.sandstorm/global-setup.sh new file mode 100755 index 00000000000..303c9d22c1d --- /dev/null +++ b/.sandstorm/global-setup.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -euo pipefail +echo localhost > /etc/hostname +hostname localhost +curl https://install.sandstorm.io/ > /host-dot-sandstorm/caches/install.sh +SANDSTORM_CURRENT_VERSION=$(curl -fs "https://install.sandstorm.io/dev?from=0&type=install") +SANDSTORM_PACKAGE="sandstorm-$SANDSTORM_CURRENT_VERSION.tar.xz" +if [[ ! -f /host-dot-sandstorm/caches/$SANDSTORM_PACKAGE ]] ; then + curl --output "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" "https://dl.sandstorm.io/$SANDSTORM_PACKAGE" +fi +bash /host-dot-sandstorm/caches/install.sh -d -e "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" +modprobe ip_tables +# Make the vagrant user part of the sandstorm group so that commands like +# `spk dev` work. +usermod -a -G 'sandstorm' 'vagrant' +# Bind to all addresses, so the vagrant port-forward works. +sudo sed --in-place='' \ + --expression='s/^BIND_IP=.*/BIND_IP=0.0.0.0/' \ + /opt/sandstorm/sandstorm.conf +# TODO: update sandstorm installer script to ask about dev accounts, and +# specify a value for this option in the default config? +if ! grep --quiet --no-messages ALLOW_DEV_ACCOUNTS=true /opt/sandstorm/sandstorm.conf ; then + echo "ALLOW_DEV_ACCOUNTS=true" | sudo tee -a /opt/sandstorm/sandstorm.conf + sudo service sandstorm restart +fi +# Enable apt-cacher-ng proxy to make things faster if one appears to be running on the gateway IP +GATEWAY_IP=$(ip route | grep ^default | cut -d ' ' -f 3) +if nc -z "$GATEWAY_IP" 3142 ; then + echo "Acquire::http::Proxy \"http://$GATEWAY_IP:3142\";" > /etc/apt/apt.conf.d/80httpproxy +fi diff --git a/.sandstorm/launcher.sh b/.sandstorm/launcher.sh new file mode 100755 index 00000000000..4a7ab020aaa --- /dev/null +++ b/.sandstorm/launcher.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +echo '** Starting mongo...' +/bin/niscud \ + --fork --port 4002 --dbpath /var --noauth --bind_ip 127.0.0.1 \ + --nohttpinterface --noprealloc --logpath /var/mongo.log & + +# TODO: wait for niscu to be up +echo '** Starting Meteor...' + +export MONGO_URL="mongodb://127.0.0.1:4002/meteor"; +export ROOT_URL="http://127.0.0.1:8000"; +export PORT="8000"; + +node /main.js diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp new file mode 100644 index 00000000000..0921cfcd7d5 --- /dev/null +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -0,0 +1,66 @@ +@0xdb0b8a1059adf258; + +using Spk = import "/sandstorm/package.capnp"; +# This imports: +# $SANDSTORM_HOME/latest/usr/include/sandstorm/package.capnp +# Check out that file to see the full, documented package definition format. + +const pkgdef :Spk.PackageDefinition = ( + # The package definition. Note that the spk tool looks specifically for the + # "pkgdef" constant. + + id = "1yqjjc9yru8e577pm95peu7t32ccf1xf0mepkvxj9ezch9amj82h", + # Your app ID is actually its public key. The private key was placed in + # your keyring. All updates must be signed with the same key. + + manifest = ( + # This manifest is included in your app package to tell Sandstorm + # about your app. + + appTitle = (defaultText = "Rocket.Chat"), + + appVersion = 0, # Increment this for every release. + + appMarketingVersion = (defaultText = "0.6"), + # Human-readable representation of appVersion. Should match the way you + # identify versions of your app in documentation and marketing. + + actions = [ + # Define your "new document" handlers here. + ( title = (defaultText = "New Rocket.Chat"), + command = .myCommand + # The command to run when starting for the first time. (".myCommand" + # is just a constant defined at the bottom of the file.) + ) + ], + + continueCommand = .myCommand + # This is the command called to start your app back up after it has been + # shut down for inactivity. Here we're using the same command as for + # starting a new instance, but you could use different commands for each + # case. + ), + + sourceMap = ( + # The following directories will be copied into your package. + searchPath = [ + ( sourcePath = "/home/vagrant/bundle" ), + ( sourcePath = "/opt/meteor-spk/meteor-spk.deps" ) + ] + ), + + alwaysInclude = [ "." ] + # This says that we always want to include all files from the source map. + # (An alternative is to automatically detect dependencies by watching what + # the app opens while running in dev mode. To see what that looks like, + # run `spk init` without the -A option.) +); + +const myCommand :Spk.Manifest.Command = ( + # Here we define the command used to start up your server. + argv = ["/sandstorm-http-bridge", "8000", "--", "/opt/app/.sandstorm/launcher.sh"], + environ = [ + # Note that this defines the *entire* environment seen by your app. + (key = "PATH", value = "/usr/local/bin:/usr/bin:/bin") + ] +); diff --git a/.sandstorm/setup.sh b/.sandstorm/setup.sh new file mode 100755 index 00000000000..7f2b3609ddb --- /dev/null +++ b/.sandstorm/setup.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail + +cd /opt/ + +PACKAGE=meteor-spk-0.1.4 +PACKAGE_FILENAME="$PACKAGE.tar.xz" +CACHE_TARGET="/host-dot-sandstorm/caches/${PACKAGE_FILENAME}" + +# Fetch meteor-spk tarball if not cached +if [ ! -f "$CACHE_TARGET" ] ; then + curl https://dl.sandstorm.io/${PACKAGE_FILENAME} > "$CACHE_TARGET" +fi + +# Extract to /opt +tar xf "$CACHE_TARGET" + +# Create symlink so we can rely on the path /opt/meteor-spk +ln -s "${PACKAGE}" meteor-spk + +# Add bash, and its dependencies, so they get mapped into the image. +# Bash runs the launcher script. +cp -a /bin/bash /opt/meteor-spk/meteor-spk.deps/bin/ +cp -a /lib/x86_64-linux-gnu/libncurses.so.* /opt/meteor-spk/meteor-spk.deps/lib/x86_64-linux-gnu/ +cp -a /lib/x86_64-linux-gnu/libtinfo.so.* /opt/meteor-spk/meteor-spk.deps/lib/x86_64-linux-gnu/ + +# Unfortunately, Meteor does not explicitly make it easy to cache packages, but +# we know experimentally that the package is mostly directly extractable to a +# user's $HOME/.meteor directory. +METEOR_RELEASE=1.1.0.2 +METEOR_PLATFORM=os.linux.x86_64 +METEOR_TARBALL_FILENAME="meteor-bootstrap-${METEOR_PLATFORM}.tar.gz" +METEOR_TARBALL_URL="https://d3sqy0vbqsdhku.cloudfront.net/packages-bootstrap/${METEOR_RELEASE}/${METEOR_TARBALL_FILENAME}" +METEOR_CACHE_TARGET="/host-dot-sandstorm/caches/${METEOR_TARBALL_FILENAME}" + +# Fetch meteor tarball if not cached +if [ ! -f "$METEOR_CACHE_TARGET" ] ; then + curl "$METEOR_TARBALL_URL" > "${METEOR_CACHE_TARGET}.partial" + mv "${METEOR_CACHE_TARGET}"{.partial,} +fi + +# Extract as unprivileged user, which is the usual meteor setup +cd /home/vagrant/ +su -c "tar xf '${METEOR_CACHE_TARGET}'" vagrant +# Link into global PATH +ln -s /home/vagrant/.meteor/meteor /usr/bin/meteor + diff --git a/.sandstorm/stack b/.sandstorm/stack new file mode 100644 index 00000000000..f148e1141a4 --- /dev/null +++ b/.sandstorm/stack @@ -0,0 +1 @@ +meteor diff --git a/client/lib/avatar.coffee b/client/lib/avatar.coffee index 8864fa52beb..e16a8559e19 100644 --- a/client/lib/avatar.coffee +++ b/client/lib/avatar.coffee @@ -4,7 +4,8 @@ if not username? return - return "#{Meteor.absoluteUrl()}avatar/#{username}.jpg?_dc=#{random}" + # return "#{Meteor.absoluteUrl()}avatar/#{username}.jpg?_dc=#{random}" + return "/avatar/#{username}.jpg?_dc=#{random}" Blaze.registerHelper 'avatarUrlFromUsername', getAvatarUrlFromUsername diff --git a/client/views/account/avatar/prompt.html b/client/views/account/avatar/prompt.html index e41996ffb02..f219f53c28b 100644 --- a/client/views/account/avatar/prompt.html +++ b/client/views/account/avatar/prompt.html @@ -58,7 +58,7 @@ {{/unless}} - + diff --git a/client/views/app/sideNav/userStatus.html b/client/views/app/sideNav/userStatus.html index 97e782c1e44..b0ea4b3488c 100644 --- a/client/views/app/sideNav/userStatus.html +++ b/client/views/app/sideNav/userStatus.html @@ -18,10 +18,13 @@ {{_ "Busy" context="male"}} {{_ "Invisible"}} {{_ "My_Account"}} + {{/with}} diff --git a/client/views/main.html b/client/views/main.html index 02ebe6cce1c..4dd6fd5622a 100644 --- a/client/views/main.html +++ b/client/views/main.html @@ -44,11 +44,18 @@ diff --git a/client/views/username/sandstormshare.html b/client/views/username/sandstormshare.html new file mode 100644 index 00000000000..090a89d8a45 --- /dev/null +++ b/client/views/username/sandstormshare.html @@ -0,0 +1,7 @@ + diff --git a/packages/rocketchat-hubot/hubot.coffee b/packages/rocketchat-hubot/hubot.coffee index fa2ee105b7d..35d2cbb94d9 100644 --- a/packages/rocketchat-hubot/hubot.coffee +++ b/packages/rocketchat-hubot/hubot.coffee @@ -55,8 +55,8 @@ class RocketChatAdapter extends Hubot.Adapter console.log 'ROCKETCHATADAPTER -> send'.blue # console.log envelope, strings sendHelper @robot, envelope, strings, (string) => - console.log "send #{envelope.room}: #{string} (#{envelope.user.id})" if DEBUG - RocketChat.sendMessage RocketBot.user, { msg: string }, { _id: envelope.room } + # console.log "send #{envelope.room}: #{string} (#{envelope.user.id})" if DEBUG + RocketChat.sendMessage RocketBot.user, { msg: string }, { _id: envelope.room } # Public: Raw method for sending emote data back to the chat source. # diff --git a/packages/rocketchat-lib/settings/server/updateServices.coffee b/packages/rocketchat-lib/settings/server/updateServices.coffee index 42c0098b7aa..6d8af700197 100644 --- a/packages/rocketchat-lib/settings/server/updateServices.coffee +++ b/packages/rocketchat-lib/settings/server/updateServices.coffee @@ -10,6 +10,7 @@ updateServices = -> serviceName = service._id.replace('Accounts_OAuth_', '') + if serviceName is 'Meteor' serviceName = 'meteor-developer' diff --git a/packages/rocketchat-oembed/client/oembedImageWidget.coffee b/packages/rocketchat-oembed/client/oembedImageWidget.coffee index 4a4089af0fb..f801b22c6fe 100644 --- a/packages/rocketchat-oembed/client/oembedImageWidget.coffee +++ b/packages/rocketchat-oembed/client/oembedImageWidget.coffee @@ -1,3 +1,4 @@ Template.oembedImageWidget.helpers showImage: -> - return @downloadImages is true or not Meteor.Device.isPhone() \ No newline at end of file + return true + # @downloadImages is true or not Meteor.Device.isPhone() \ No newline at end of file diff --git a/server/configuration/accounts_meld.coffee b/server/configuration/accounts_meld.coffee index 11c5206caf4..e6e4a89fe00 100644 --- a/server/configuration/accounts_meld.coffee +++ b/server/configuration/accounts_meld.coffee @@ -1,6 +1,7 @@ orig_updateOrCreateUserFromExternalService = Accounts.updateOrCreateUserFromExternalService Accounts.updateOrCreateUserFromExternalService = (serviceName, serviceData, options) -> - if serviceName not in ['facebook', 'github', 'google', 'meteor-developer', 'linkedin', 'twitter'] and serviceData._oAuthCustom isnt true + + if serviceName not in ['facebook', 'github', 'gitlab', 'google', 'meteor-developer', 'linkedin', 'twitter', 'sandstorm'] and serviceData._oAuthCustom isnt true return if serviceName is 'meteor-developer' diff --git a/server/lib/accounts.coffee b/server/lib/accounts.coffee index 5c565cb516c..e5fe2398cec 100644 --- a/server/lib/accounts.coffee +++ b/server/lib/accounts.coffee @@ -15,16 +15,18 @@ Accounts.emailTemplates.resetPassword.text = (user, url) -> verifyEmailText user, url Accounts.onCreateUser (options, user) -> - # console.log 'onCreateUser ->',JSON.stringify arguments, null, ' ' - # console.log 'options ->',JSON.stringify options, null, ' ' - # console.log 'user ->',JSON.stringify user, null, ' ' + console.log 'onCreateUser ->',JSON.stringify arguments, null, ' ' + console.log 'options ->',JSON.stringify options, null, ' ' + console.log 'user ->',JSON.stringify user, null, ' ' user.status = 'offline' user.active = not RocketChat.settings.get 'Accounts_ManuallyApproveNewUsers' + # disable admin for sandstorm # when inserting first user, set admin: true - unless Meteor.users.findOne() - user.admin = true + # unless Meteor.users.findOne() + # user.admin = true + if not user?.name? or user.name is '' if options.profile?.name? diff --git a/server/startup/avatar.coffee b/server/startup/avatar.coffee index 770f371e92c..2a03c5be8a1 100644 --- a/server/startup/avatar.coffee +++ b/server/startup/avatar.coffee @@ -1,8 +1,11 @@ Meteor.startup -> - storeType = 'GridFS' + storeType = 'FileSystem' + + + # Sandstorm must store avatar in mongo + #if RocketChat.settings.get 'avatarStore_type' + # storeType = RocketChat.settings.get 'avatarStore_type' - if RocketChat.settings.get 'Accounts_AvatarStoreType' - storeType = RocketChat.settings.get 'Accounts_AvatarStoreType' RocketChatStore = RocketChatFile[storeType] @@ -18,7 +21,7 @@ Meteor.startup -> transformWrite = (file, readStream, writeStream) -> RocketChatFile.gm(readStream, file.fileName).background('#ffffff').resize(width, height+'^>').gravity('Center').extent(width, height).stream('jpeg').pipe(writeStream) - path = "~/uploads" + path = "/var" if RocketChat.settings.get('Accounts_AvatarStorePath')?.trim() isnt '' path = RocketChat.settings.get 'Accounts_AvatarStorePath' @@ -29,6 +32,7 @@ Meteor.startup -> transformWrite: transformWrite WebApp.connectHandlers.use '/avatar/', (req, res, next) -> + console.log 'avatar called!' this.params = username: req.url.replace(/^\//, '').replace(/\?.*$/, '') diff --git a/server/startup/initialData.coffee b/server/startup/initialData.coffee index 9af24b91b5b..d82f4eb7763 100644 --- a/server/startup/initialData.coffee +++ b/server/startup/initialData.coffee @@ -16,6 +16,7 @@ Meteor.startup -> name: 'general' msgs: 0 + if process.env.ADMIN_EMAIL? and process.env.ADMIN_PASS? re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i if re.test process.env.ADMIN_EMAIL From 0aa955f459240047879ab78865c5b859da21aa69 Mon Sep 17 00:00:00 2001 From: westmakaha Date: Thu, 24 Sep 2015 21:45:27 -0400 Subject: [PATCH 002/114] update for app store --- .../default/virtualbox/action_provision | 2 +- .../default/virtualbox/action_set_name | 2 +- .../.vagrant/machines/default/virtualbox/id | 2 +- .../machines/default/virtualbox/index_uuid | 2 +- .../machines/default/virtualbox/private_key | 50 +++++++++---------- .sandstorm/Vagrantfile | 17 ++++++- .sandstorm/global-setup.sh | 3 +- .sandstorm/launcher.sh | 14 +----- .sandstorm/sandstorm-pkgdef.capnp | 4 +- .sandstorm/setup.sh | 2 +- 10 files changed, 50 insertions(+), 48 deletions(-) diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/action_provision b/.sandstorm/.vagrant/machines/default/virtualbox/action_provision index 4f8991f5fe2..6aad4c25eaf 100644 --- a/.sandstorm/.vagrant/machines/default/virtualbox/action_provision +++ b/.sandstorm/.vagrant/machines/default/virtualbox/action_provision @@ -1 +1 @@ -1.5:c17761bf-b2f4-49da-87b9-79a95da91252 \ No newline at end of file +1.5:1345ca5b-3c86-44b9-98c3-6a6f3a6574c6 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name b/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name index 9a8930725a3..991fdfbedb0 100644 --- a/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name +++ b/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name @@ -1 +1 @@ -1440583526 \ No newline at end of file +1443070908 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/id b/.sandstorm/.vagrant/machines/default/virtualbox/id index eb9637c6cf2..fa709b2a089 100644 --- a/.sandstorm/.vagrant/machines/default/virtualbox/id +++ b/.sandstorm/.vagrant/machines/default/virtualbox/id @@ -1 +1 @@ -c17761bf-b2f4-49da-87b9-79a95da91252 \ No newline at end of file +1345ca5b-3c86-44b9-98c3-6a6f3a6574c6 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid b/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid index fb8410bdfa9..df17d5233f0 100644 --- a/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid +++ b/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid @@ -1 +1 @@ -0d8eab53d7a1444288ff01aef6a03573 \ No newline at end of file +7506910154f049b6bfaf858c95fbda9c \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/private_key b/.sandstorm/.vagrant/machines/default/virtualbox/private_key index d30d91db6e7..ef084242f4a 100644 --- a/.sandstorm/.vagrant/machines/default/virtualbox/private_key +++ b/.sandstorm/.vagrant/machines/default/virtualbox/private_key @@ -1,27 +1,27 @@ -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/.sandstorm/Vagrantfile b/.sandstorm/Vagrantfile index c8421bb9861..579a4395c10 100644 --- a/.sandstorm/Vagrantfile +++ b/.sandstorm/Vagrantfile @@ -1,6 +1,11 @@ # -*- mode: ruby -*- # vi: set ft=ruby : +# Guess at a reasonable name for the VM based on the folder vagrant-spk is +# run from. The timestamp is there to avoid conflicts if you have multiple +# folders with the same name. +VM_NAME = File.basename(File.dirname(File.dirname(__FILE__))) + "_sandstorm_#{Time.now.utc.to_i}" + # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" @@ -44,6 +49,13 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| elsif host =~ /linux/ cpus = `nproc`.to_i total_kB_ram = `grep MemTotal /proc/meminfo | awk '{print $2}'`.to_i + elsif host =~ /mingw/ + # powershell may not be available on Windows XP and Vista, so wrap this in a rescue block + begin + cpus = `powershell -Command "(Get-WmiObject Win32_Processor -Property NumberOfLogicalProcessors | Select-Object -Property NumberOfLogicalProcessors | Measure-Object NumberOfLogicalProcessors -Sum).Sum"`.to_i + total_kB_ram = `powershell -Command "Get-CimInstance -class cim_physicalmemory | % $_.Capacity}"`.to_i / 1024 + rescue + end end # Use the same number of CPUs within Vagrant as the system, with 1 # as a default. @@ -54,7 +66,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # RAM entirely (which it basically would if we went much lower than # 512MB) and also allowing it to use up a healthily large amount of # RAM so it can run faster on systems that can afford it. - if cpus.nil? + if cpus.nil? or cpus.zero? cpus = 1 end if total_kB_ram.nil? or total_kB_ram < 2048000 @@ -66,6 +78,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.provider :virtualbox do |vb, override| vb.cpus = cpus vb.memory = assign_ram_mb + vb.name = VM_NAME override.vm.synced_folder "..", "/opt/app" override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm" @@ -74,7 +87,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.provider :libvirt do |libvirt, override| libvirt.cpus = cpus libvirt.memory = assign_ram_mb - libvirt.random_hostname = true + libvirt.default_prefix = VM_NAME override.vm.synced_folder "..", "/opt/app", type: "9p", accessmode: "passthrough" override.vm.synced_folder ENV["HOME"] + "/.sandstorm", "/host-dot-sandstorm", type: "9p", accessmode: "passthrough" diff --git a/.sandstorm/global-setup.sh b/.sandstorm/global-setup.sh index 303c9d22c1d..3984f4445d2 100755 --- a/.sandstorm/global-setup.sh +++ b/.sandstorm/global-setup.sh @@ -6,7 +6,8 @@ curl https://install.sandstorm.io/ > /host-dot-sandstorm/caches/install.sh SANDSTORM_CURRENT_VERSION=$(curl -fs "https://install.sandstorm.io/dev?from=0&type=install") SANDSTORM_PACKAGE="sandstorm-$SANDSTORM_CURRENT_VERSION.tar.xz" if [[ ! -f /host-dot-sandstorm/caches/$SANDSTORM_PACKAGE ]] ; then - curl --output "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" "https://dl.sandstorm.io/$SANDSTORM_PACKAGE" + curl --output "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "https://dl.sandstorm.io/$SANDSTORM_PACKAGE" + mv "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE.partial" "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" fi bash /host-dot-sandstorm/caches/install.sh -d -e "/host-dot-sandstorm/caches/$SANDSTORM_PACKAGE" modprobe ip_tables diff --git a/.sandstorm/launcher.sh b/.sandstorm/launcher.sh index 4a7ab020aaa..9f62691ffee 100755 --- a/.sandstorm/launcher.sh +++ b/.sandstorm/launcher.sh @@ -1,16 +1,4 @@ #!/bin/bash set -euo pipefail -echo '** Starting mongo...' -/bin/niscud \ - --fork --port 4002 --dbpath /var --noauth --bind_ip 127.0.0.1 \ - --nohttpinterface --noprealloc --logpath /var/mongo.log & - -# TODO: wait for niscu to be up -echo '** Starting Meteor...' - -export MONGO_URL="mongodb://127.0.0.1:4002/meteor"; -export ROOT_URL="http://127.0.0.1:8000"; -export PORT="8000"; - -node /main.js +exec node /start.js -p 8000 diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 0921cfcd7d5..d00edc85568 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -1,4 +1,4 @@ -@0xdb0b8a1059adf258; +@0xbbbe049af795122e; using Spk = import "/sandstorm/package.capnp"; # This imports: @@ -9,7 +9,7 @@ const pkgdef :Spk.PackageDefinition = ( # The package definition. Note that the spk tool looks specifically for the # "pkgdef" constant. - id = "1yqjjc9yru8e577pm95peu7t32ccf1xf0mepkvxj9ezch9amj82h", + id = "vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0", # Your app ID is actually its public key. The private key was placed in # your keyring. All updates must be signed with the same key. diff --git a/.sandstorm/setup.sh b/.sandstorm/setup.sh index 7f2b3609ddb..49d12a211ea 100755 --- a/.sandstorm/setup.sh +++ b/.sandstorm/setup.sh @@ -3,7 +3,7 @@ set -euo pipefail cd /opt/ -PACKAGE=meteor-spk-0.1.4 +PACKAGE=meteor-spk-0.1.7 PACKAGE_FILENAME="$PACKAGE.tar.xz" CACHE_TARGET="/host-dot-sandstorm/caches/${PACKAGE_FILENAME}" From 154226c06b21b455b39e7678cdcaed9934ee7c7f Mon Sep 17 00:00:00 2001 From: westmakaha Date: Fri, 25 Sep 2015 19:47:10 -0400 Subject: [PATCH 003/114] add market info --- .sandstorm/appGrid.svg | 52 ++++++++++++++++++++++++++++++ .sandstorm/grain.svg | 32 ++++++++++++++++++ .sandstorm/market.svg | 37 +++++++++++++++++++++ .sandstorm/sandstorm-pkgdef.capnp | 32 +++++++++++++++++- .sandstorm/screenshot.png | Bin 0 -> 47452 bytes 5 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 .sandstorm/appGrid.svg create mode 100644 .sandstorm/grain.svg create mode 100644 .sandstorm/market.svg create mode 100644 .sandstorm/screenshot.png diff --git a/.sandstorm/appGrid.svg b/.sandstorm/appGrid.svg new file mode 100644 index 00000000000..ed0ba57a158 --- /dev/null +++ b/.sandstorm/appGrid.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.sandstorm/grain.svg b/.sandstorm/grain.svg new file mode 100644 index 00000000000..31c37372652 --- /dev/null +++ b/.sandstorm/grain.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/.sandstorm/market.svg b/.sandstorm/market.svg new file mode 100644 index 00000000000..557c398ab35 --- /dev/null +++ b/.sandstorm/market.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index d00edc85568..5e409d6a103 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -19,7 +19,7 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Rocket.Chat"), - appVersion = 0, # Increment this for every release. + appVersion = 1, # Increment this for every release. appMarketingVersion = (defaultText = "0.6"), # Human-readable representation of appVersion. Should match the way you @@ -39,6 +39,36 @@ const pkgdef :Spk.PackageDefinition = ( # shut down for inactivity. Here we're using the same command as for # starting a new instance, but you could use different commands for each # case. + + metadata = ( + icons = ( + appGrid = (svg = embed "rocket.chat-128.svg"), + grain = (svg = embed "rocket.chat-24.svg"), + market = (svg = embed "rocket.chat-150.svg"), + ), + + website = "https://rocket.chat", + codeUrl = "https://github.com/RocketChat/Rocket.Chat", + license = (openSource = MIT), + categories = [office, productivity], + + author = ( + contactEmail = "team@rocket.chat", + pgpSignature = embed "pgp-signature", + upstreamAuthor = "Rocket.Chat", + ), + pgpKeyring = embed "pgp-keyring", + + description = (defaultText = embed "README.md"), + shortDescription = (defaultText = "Messaging App"), + + screenshots = [ + (width = 448, height = 343, png = embed "screenshot.png") + ], + + changeLog = (defaultText = embed "CHANGELOG.md"), + ), + ), sourceMap = ( diff --git a/.sandstorm/screenshot.png b/.sandstorm/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2a1c10943cc35f37c91548c0fa9f9593dfaee0b1 GIT binary patch literal 47452 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 MNlUR-!Rqz@0LOf80ssI2 literal 0 HcmV?d00001 From d0b156d0e70485da72e7c91d8e4c4d5d667a3313 Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Fri, 25 Sep 2015 17:04:41 -0700 Subject: [PATCH 004/114] addd pgp-signature --- .sandstorm/pgp-signature | Bin 0 -> 688 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .sandstorm/pgp-signature diff --git a/.sandstorm/pgp-signature b/.sandstorm/pgp-signature new file mode 100644 index 0000000000000000000000000000000000000000..8d8e2bbe62f431cbfff59c76168afdd865332396 GIT binary patch literal 688 zcmV;h0#E&;0RgE3R{f9-0{{vEss9Ss-sA#U0n2$}09FOyP)Q(RZ6I`LWgua7bZBpK zAa7MmANklpzc4lsO zaCByFFfw#`GBI~IF*S2;d3j@ccQ9^ocx!euYIb3FV_|49Fk?1)H)v`xXl`{di2@u1 z009aB1_c6E1>jHs3JDOY{|eXMjIZ4{SQhWpcq@>*A~cKt&7*dvU^OKPAsoC9PNOeQcG zk05~>KShhZ7*vUnqds44vZvVDwqy3W7BEZUg(u|EAT99u~N^76f{nh`9{&iRwHA-Edjt7TTa>d zJL4Q!uKKX6>&qY%b_4trx8vYt(8sqKo7a2{SyjKVX8o|?RMiSDnz5yygs~QzPS2HC z93D^)^pL%T;y{+jjm7P>w$j3m>1&_vr$oeMydbYw(~BlZU%Bf-#Pz`=kO1t6A{$uqfi@vpqK+cUZ>wceNiJkRnvKMX_S2(hYCszBslx{%XZ zuQ%iHF+DL;&tmzrO^qRY1vB;ILLv^35S7xCV;l`DDkl{8NP&`eYMF@xmyv*WU!0~e WWdt-6h8J9bb7{6cta5wCYuC4+1~o?j literal 0 HcmV?d00001 From 8c8e73e0714cdd68e0c59814133de0d558827db0 Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Fri, 25 Sep 2015 17:16:18 -0700 Subject: [PATCH 005/114] added pgp-keyring --- .sandstorm/pgp-keyring | Bin 0 -> 8435 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .sandstorm/pgp-keyring diff --git a/.sandstorm/pgp-keyring b/.sandstorm/pgp-keyring new file mode 100644 index 0000000000000000000000000000000000000000..ad9fabd672857d763016de2cb5db5a4c4a322507 GIT binary patch literal 8435 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 Date: Fri, 25 Sep 2015 20:17:24 -0400 Subject: [PATCH 006/114] fix capnp --- .sandstorm/CHANGELOG.md | 1 + .sandstorm/{grain.svg => rocet.chat-24.svg} | 0 .sandstorm/{appGrid.svg => rocket.chat-128.svg} | 0 .sandstorm/{market.svg => rocket.chat-150.svg} | 0 .sandstorm/sandstorm-pkgdef.capnp | 4 ++-- 5 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .sandstorm/CHANGELOG.md rename .sandstorm/{grain.svg => rocet.chat-24.svg} (100%) rename .sandstorm/{appGrid.svg => rocket.chat-128.svg} (100%) rename .sandstorm/{market.svg => rocket.chat-150.svg} (100%) diff --git a/.sandstorm/CHANGELOG.md b/.sandstorm/CHANGELOG.md new file mode 100644 index 00000000000..8d14253d53f --- /dev/null +++ b/.sandstorm/CHANGELOG.md @@ -0,0 +1 @@ +### FIRST Sandstorm VERSION of Rocket.Chat diff --git a/.sandstorm/grain.svg b/.sandstorm/rocet.chat-24.svg similarity index 100% rename from .sandstorm/grain.svg rename to .sandstorm/rocet.chat-24.svg diff --git a/.sandstorm/appGrid.svg b/.sandstorm/rocket.chat-128.svg similarity index 100% rename from .sandstorm/appGrid.svg rename to .sandstorm/rocket.chat-128.svg diff --git a/.sandstorm/market.svg b/.sandstorm/rocket.chat-150.svg similarity index 100% rename from .sandstorm/market.svg rename to .sandstorm/rocket.chat-150.svg diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 5e409d6a103..50c67b607cf 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -59,11 +59,11 @@ const pkgdef :Spk.PackageDefinition = ( ), pgpKeyring = embed "pgp-keyring", - description = (defaultText = embed "README.md"), + description = (defaultText = embed "../README.md"), shortDescription = (defaultText = "Messaging App"), screenshots = [ - (width = 448, height = 343, png = embed "screenshot.png") + (width = 1024, height = 733, png = embed "screenshot.png") ], changeLog = (defaultText = embed "CHANGELOG.md"), From df18ffbd8434b2152cf14fd0c0fe936d9cf84066 Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Fri, 25 Sep 2015 17:22:16 -0700 Subject: [PATCH 007/114] copied README.md into sandstorm-description.md --- .sandstorm/sandstorm-description.md | 213 ++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 .sandstorm/sandstorm-description.md diff --git a/.sandstorm/sandstorm-description.md b/.sandstorm/sandstorm-description.md new file mode 100644 index 00000000000..c7cccf624a5 --- /dev/null +++ b/.sandstorm/sandstorm-description.md @@ -0,0 +1,213 @@ +![Rocket.Chat logo](https://rocket.chat/images/logo/logo-dark.svg?v3) + +The Complete Open Source Chat Solution + +## Demo + +Checkout the latest version at [https://demo.rocket.chat](https://demo.rocket.chat) + +Get the app for your Android phone: + +[![Rocket.Chat on Google Play](https://developer.android.com/images/brand/en_app_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat) + +Try it on Ubuntu: + +[Deploy on VPS or standalone server](https://github.com/RocketChat/Rocket.Chat/wiki/Deploy-Rocket.Chat-without-docker) + +Try it with docker: + +``` +docker-compose up +``` + +and check it out at http://localhost:80 + +Download the Native Cross-Platform Desktop Application at [Rocket.Chat.Electron](https://github.com/RocketChat/Rocket.Chat.Electron/releases) + +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=49QX7TYCVZK8L) + +## About + +[![Build Status](https://img.shields.io/travis/RocketChat/Rocket.Chat/master.svg)](https://travis-ci.org/RocketChat/Rocket.Chat) +[![Coverage Status](https://coveralls.io/repos/RocketChat/Rocket.Chat/badge.svg)](https://coveralls.io/r/RocketChat/Rocket.Chat) +[![Code Climate](https://codeclimate.com/github/RocketChat/Rocket.Chat/badges/gpa.svg)](https://codeclimate.com/github/RocketChat/Rocket.Chat) +[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/RocketChat/Rocket.Chat/raw/master/LICENSE) + +Rocket.Chat is a Web Chat Server, developed in JavaScript, using the [Meteor](https://www.meteor.com/install) fullstack framework. + +It is a great solution for communities and companies wanting to privately host their own chat service or for developers looking forward to build and evolve their own chat platforms. + +### On the News + +##### [Hacker News](https://news.ycombinator.com/item?id=9624737) +> Yes, we made it to the #1 + +##### [Product Hunt](http://www.producthunt.com/posts/rocket-chat) +> Your own open source Slack-like chat + +##### [JavaScript Weekly](http://javascriptweekly.com/issues/234) +> An open source Web based, channel based chat system (a la Slack) built using Meteor, the full stack JavaScript development platform. + +##### [wwwhatsnew.com](http://wwwhatsnew.com/2015/05/30/rocket-chat-para-los-programadores-que-quieran-ofrecer-un-chat-en-su-web/) +> Para los programadores que quieran ofrecer un chat en su web + +##### [clasesdeperiodismo.com](http://www.clasesdeperiodismo.com/2015/05/30/un-chat-de-codigo-abierto-que-puedes-anadir-a-la-web/) +> Un chat de código abierto que puedes añadir a la web + +## Features + +- BYOS (bring your own server) +- Multiple Rooms +- Direct Messages +- Private Groups +- Public Channels +- Desktop Notifications +- Mentions +- Avatars +- Markdown +- Emojis +- Sent Message Edit and Deletion +- Transcripts / History +- File Upload / Sharing +- I18n - Supports 22 Languages [Internationalization with Lingohub](https://translate.lingohub.com/engelgabriel/rocket-dot-chat/dashboard) +- Hubot Friendly - [Hubot Integration Project](https://github.com/RocketChat/hubot-rocketchat) +- Media Embeds +- Link Previews +- LDAP Authentication - [LDAP Authentication on Rocket.Chat Wiki](https://github.com/RocketChat/Rocket.Chat/wiki/LDAP-Authentication) +- Face to Face Video Conferencing aka WebRTC (Alpha) - [How to video chat](https://github.com/RocketChat/Rocket.Chat/wiki/Using-Face-to-face-video-conference-%28aka-webrtc%29) +- REST APIs - [Ready for testing ...](https://github.com/RocketChat/Rocket.Chat/wiki/REST-APIs) +- Remote Locations Video Monitoring - [Early access ...](https://github.com/RocketChat/Rocket.Chat/wiki/Remote-Video-Monitoring) +- Native Cross-Platform Desktop Application [Rocket.Chat.Electron - HELP WANTED](https://github.com/RocketChat/Rocket.Chat.Electron/releases) +- Mobile app for iPhone, iPad, and iPod touch [Available now! - help us test](https://github.com/RocketChat/Rocket.Chat/wiki/Mobile-app-for-iPhones,-iPads,-iPod-Touch) +- Mobile app for Android phone, tablet, and TV stick [Available now on Google Play!](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat) + +### Roadmap + +#### In Progress + +- Full text search +- Support for Okta SSO through SAML v2 [Issue #322](https://github.com/RocketChat/Rocket.Chat/issues/322) +- Native iOS Application [Rocket.Chat.iOS - HELP WANTED](https://github.com/RocketChat/Rocket.Chat.iOS) +- Native Android Application [Issue #271 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/271) +- External popout window for chat with website visitor, like Zopim, Olark, LiveChat, SnapEngage [Issue #519](https://github.com/RocketChat/Rocket.Chat/issues/519) + +#### Planned + +- Off-the-Record (OTR) Messaging [Issue #36 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/36) +- Kerberos Authentication +- XMPP Multi-user chat (MUC) + +### Issues + +[Github Issues](https://github.com/RocketChat/Rocket.Chat/issues) are used to track todos, bugs, feature requests, and more. + +### Integrations + +#### Hubot + +The docker image is ready. +Everyone can start hacking the adapter code, or launch his/her own bot within a few minutes now. +Please head over to the [Hubot Integration Project](https://github.com/RocketChat/hubot-rocketchat) for more information. + +#### Many, many, many more to come! + +We are developing the APIs based on the competition, so stay tunned and you will see a lot happening here. + +### Documentation + +Checkout [Github Wiki](https://github.com/RocketChat/Rocket.Chat/wiki) (coming soon) + +## Production Deployment + +### Unbuntu VPS or server + +Follow these [deployment instructions](https://github.com/RocketChat/Rocket.Chat/wiki/Deploy-Rocket.Chat-without-docker). + +### Docker + +Use the automated build at our [Official Docker Registry](https://registry.hub.docker.com/u/rocketchat/rocket.chat/) + +[![Rocket.Chat logo](https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png)](https://registry.hub.docker.com/u/rocketchat/rocket.chat/) + +``` +docker pull rocketchat/rocket.chat +``` + +### sloppy.io + +Host your docker container at [sloppy.io](http://sloppy.io). Get an account and use the [quickstarter](https://github.com/sloppyio/quickstarters/tree/master/rocketchat) + +### Heroku + +Host your own Rocket.Chat server for **FREE** with [One-Click Deploy](https://heroku.com/deploy?template=https://github.com/RocketChat/Rocket.Chat/tree/master) + +[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/RocketChat/Rocket.Chat/tree/master) + + + +## Development Installation + +Prerequisites: + +* [Git](http://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +* [Meteor](https://www.meteor.com/install) + +Now just clone and start the app: + +```sh +git clone https://github.com/RocketChat/Rocket.Chat.git +cd Rocket.Chat +meteor +``` + +or use docker: + +``` +git clone https://github.com/RocketChat/Rocket.Chat.git +cd Rocket.Chat +docker run -it -p 3000:3000 -v "$(pwd)":/app danieldent/meteor +``` + +## Credits + +Thanks to +[Diego Sampaio](https://github.com/sampaiodiego), +[Gabriel Engel](https://github.com/engelgabriel), +[Marcelo Schmidt](https://github.com/marceloschmidt), +[Rafael Caferati](https://github.com/rcaferati), +[Rodrigo Nascimento](https://github.com/rodrigok), +[Sing Li](https://github.com/Sing-Li), +[Aaron Ogle](https://github.com/geekgonecrazy), +[Graywolf336](https://github.com/Graywolf336) + + +Emoji provided free by [Emoji One](http://emojione.com) + +Performance monitoring provided by [Kadira](https://kadira.io/) + +### Contributions + +#### We Need Your Help! + +A lot of work has already gone into Rocket.Chat, but we have much bigger plans for it! + +So if you'd like to be part of the project, please check out the [roadmap](https://github.com/RocketChat/Rocket.Chat/milestones) and [issues](https://github.com/RocketChat/Rocket.Chat/issues) to see if there's anything you can help with. + +### Translations + +We are experimenting [Lingohub](https://translate.lingohub.com/engelgabriel/rocket-dot-chat/dashboard). +If you want to help, send an email to support at rocket.chat to be invited to the translation project. + +### Community + +Join the the conversation at [Twitter](http://twitter.com/RocketChatApp), [Facebook](https://www.facebook.com/RocketChatApp) or [Google Plus](https://plus.google.com/+RocketChatApp) + +### License + +Note that Rocket.Chat is distributed under the [MIT License](http://opensource.org/licenses/MIT). + +### Donate + +Rocket.Chat will be free forever, but you can help us speed-up the development! + +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=49QX7TYCVZK8L) From a0b138ef4b89be17875805a53c7ac341a980e0bb Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Fri, 25 Sep 2015 17:24:59 -0700 Subject: [PATCH 008/114] summarize --- .sandstorm/sandstorm-description.md | 214 +--------------------------- 1 file changed, 1 insertion(+), 213 deletions(-) diff --git a/.sandstorm/sandstorm-description.md b/.sandstorm/sandstorm-description.md index c7cccf624a5..7001f7c09a4 100644 --- a/.sandstorm/sandstorm-description.md +++ b/.sandstorm/sandstorm-description.md @@ -1,213 +1 @@ -![Rocket.Chat logo](https://rocket.chat/images/logo/logo-dark.svg?v3) - -The Complete Open Source Chat Solution - -## Demo - -Checkout the latest version at [https://demo.rocket.chat](https://demo.rocket.chat) - -Get the app for your Android phone: - -[![Rocket.Chat on Google Play](https://developer.android.com/images/brand/en_app_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat) - -Try it on Ubuntu: - -[Deploy on VPS or standalone server](https://github.com/RocketChat/Rocket.Chat/wiki/Deploy-Rocket.Chat-without-docker) - -Try it with docker: - -``` -docker-compose up -``` - -and check it out at http://localhost:80 - -Download the Native Cross-Platform Desktop Application at [Rocket.Chat.Electron](https://github.com/RocketChat/Rocket.Chat.Electron/releases) - -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=49QX7TYCVZK8L) - -## About - -[![Build Status](https://img.shields.io/travis/RocketChat/Rocket.Chat/master.svg)](https://travis-ci.org/RocketChat/Rocket.Chat) -[![Coverage Status](https://coveralls.io/repos/RocketChat/Rocket.Chat/badge.svg)](https://coveralls.io/r/RocketChat/Rocket.Chat) -[![Code Climate](https://codeclimate.com/github/RocketChat/Rocket.Chat/badges/gpa.svg)](https://codeclimate.com/github/RocketChat/Rocket.Chat) -[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/RocketChat/Rocket.Chat/raw/master/LICENSE) - -Rocket.Chat is a Web Chat Server, developed in JavaScript, using the [Meteor](https://www.meteor.com/install) fullstack framework. - -It is a great solution for communities and companies wanting to privately host their own chat service or for developers looking forward to build and evolve their own chat platforms. - -### On the News - -##### [Hacker News](https://news.ycombinator.com/item?id=9624737) -> Yes, we made it to the #1 - -##### [Product Hunt](http://www.producthunt.com/posts/rocket-chat) -> Your own open source Slack-like chat - -##### [JavaScript Weekly](http://javascriptweekly.com/issues/234) -> An open source Web based, channel based chat system (a la Slack) built using Meteor, the full stack JavaScript development platform. - -##### [wwwhatsnew.com](http://wwwhatsnew.com/2015/05/30/rocket-chat-para-los-programadores-que-quieran-ofrecer-un-chat-en-su-web/) -> Para los programadores que quieran ofrecer un chat en su web - -##### [clasesdeperiodismo.com](http://www.clasesdeperiodismo.com/2015/05/30/un-chat-de-codigo-abierto-que-puedes-anadir-a-la-web/) -> Un chat de código abierto que puedes añadir a la web - -## Features - -- BYOS (bring your own server) -- Multiple Rooms -- Direct Messages -- Private Groups -- Public Channels -- Desktop Notifications -- Mentions -- Avatars -- Markdown -- Emojis -- Sent Message Edit and Deletion -- Transcripts / History -- File Upload / Sharing -- I18n - Supports 22 Languages [Internationalization with Lingohub](https://translate.lingohub.com/engelgabriel/rocket-dot-chat/dashboard) -- Hubot Friendly - [Hubot Integration Project](https://github.com/RocketChat/hubot-rocketchat) -- Media Embeds -- Link Previews -- LDAP Authentication - [LDAP Authentication on Rocket.Chat Wiki](https://github.com/RocketChat/Rocket.Chat/wiki/LDAP-Authentication) -- Face to Face Video Conferencing aka WebRTC (Alpha) - [How to video chat](https://github.com/RocketChat/Rocket.Chat/wiki/Using-Face-to-face-video-conference-%28aka-webrtc%29) -- REST APIs - [Ready for testing ...](https://github.com/RocketChat/Rocket.Chat/wiki/REST-APIs) -- Remote Locations Video Monitoring - [Early access ...](https://github.com/RocketChat/Rocket.Chat/wiki/Remote-Video-Monitoring) -- Native Cross-Platform Desktop Application [Rocket.Chat.Electron - HELP WANTED](https://github.com/RocketChat/Rocket.Chat.Electron/releases) -- Mobile app for iPhone, iPad, and iPod touch [Available now! - help us test](https://github.com/RocketChat/Rocket.Chat/wiki/Mobile-app-for-iPhones,-iPads,-iPod-Touch) -- Mobile app for Android phone, tablet, and TV stick [Available now on Google Play!](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat) - -### Roadmap - -#### In Progress - -- Full text search -- Support for Okta SSO through SAML v2 [Issue #322](https://github.com/RocketChat/Rocket.Chat/issues/322) -- Native iOS Application [Rocket.Chat.iOS - HELP WANTED](https://github.com/RocketChat/Rocket.Chat.iOS) -- Native Android Application [Issue #271 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/271) -- External popout window for chat with website visitor, like Zopim, Olark, LiveChat, SnapEngage [Issue #519](https://github.com/RocketChat/Rocket.Chat/issues/519) - -#### Planned - -- Off-the-Record (OTR) Messaging [Issue #36 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/36) -- Kerberos Authentication -- XMPP Multi-user chat (MUC) - -### Issues - -[Github Issues](https://github.com/RocketChat/Rocket.Chat/issues) are used to track todos, bugs, feature requests, and more. - -### Integrations - -#### Hubot - -The docker image is ready. -Everyone can start hacking the adapter code, or launch his/her own bot within a few minutes now. -Please head over to the [Hubot Integration Project](https://github.com/RocketChat/hubot-rocketchat) for more information. - -#### Many, many, many more to come! - -We are developing the APIs based on the competition, so stay tunned and you will see a lot happening here. - -### Documentation - -Checkout [Github Wiki](https://github.com/RocketChat/Rocket.Chat/wiki) (coming soon) - -## Production Deployment - -### Unbuntu VPS or server - -Follow these [deployment instructions](https://github.com/RocketChat/Rocket.Chat/wiki/Deploy-Rocket.Chat-without-docker). - -### Docker - -Use the automated build at our [Official Docker Registry](https://registry.hub.docker.com/u/rocketchat/rocket.chat/) - -[![Rocket.Chat logo](https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png)](https://registry.hub.docker.com/u/rocketchat/rocket.chat/) - -``` -docker pull rocketchat/rocket.chat -``` - -### sloppy.io - -Host your docker container at [sloppy.io](http://sloppy.io). Get an account and use the [quickstarter](https://github.com/sloppyio/quickstarters/tree/master/rocketchat) - -### Heroku - -Host your own Rocket.Chat server for **FREE** with [One-Click Deploy](https://heroku.com/deploy?template=https://github.com/RocketChat/Rocket.Chat/tree/master) - -[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/RocketChat/Rocket.Chat/tree/master) - - - -## Development Installation - -Prerequisites: - -* [Git](http://git-scm.com/book/en/v2/Getting-Started-Installing-Git) -* [Meteor](https://www.meteor.com/install) - -Now just clone and start the app: - -```sh -git clone https://github.com/RocketChat/Rocket.Chat.git -cd Rocket.Chat -meteor -``` - -or use docker: - -``` -git clone https://github.com/RocketChat/Rocket.Chat.git -cd Rocket.Chat -docker run -it -p 3000:3000 -v "$(pwd)":/app danieldent/meteor -``` - -## Credits - -Thanks to -[Diego Sampaio](https://github.com/sampaiodiego), -[Gabriel Engel](https://github.com/engelgabriel), -[Marcelo Schmidt](https://github.com/marceloschmidt), -[Rafael Caferati](https://github.com/rcaferati), -[Rodrigo Nascimento](https://github.com/rodrigok), -[Sing Li](https://github.com/Sing-Li), -[Aaron Ogle](https://github.com/geekgonecrazy), -[Graywolf336](https://github.com/Graywolf336) - - -Emoji provided free by [Emoji One](http://emojione.com) - -Performance monitoring provided by [Kadira](https://kadira.io/) - -### Contributions - -#### We Need Your Help! - -A lot of work has already gone into Rocket.Chat, but we have much bigger plans for it! - -So if you'd like to be part of the project, please check out the [roadmap](https://github.com/RocketChat/Rocket.Chat/milestones) and [issues](https://github.com/RocketChat/Rocket.Chat/issues) to see if there's anything you can help with. - -### Translations - -We are experimenting [Lingohub](https://translate.lingohub.com/engelgabriel/rocket-dot-chat/dashboard). -If you want to help, send an email to support at rocket.chat to be invited to the translation project. - -### Community - -Join the the conversation at [Twitter](http://twitter.com/RocketChatApp), [Facebook](https://www.facebook.com/RocketChatApp) or [Google Plus](https://plus.google.com/+RocketChatApp) - -### License - -Note that Rocket.Chat is distributed under the [MIT License](http://opensource.org/licenses/MIT). - -### Donate - -Rocket.Chat will be free forever, but you can help us speed-up the development! - -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=49QX7TYCVZK8L) +The Complete Open Source Chat Solution. Rocket.Chat is a Web Chat Server, developed in JavaScript. It is a great solution for communities and companies wanting to privately host their own chat service or for developers looking forward to build and evolve their own chat platforms. From 53536950adc691cf2c1b59c29ddad85e131558cc Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Fri, 25 Sep 2015 17:26:08 -0700 Subject: [PATCH 009/114] rename --- .sandstorm/{sandstorm-description.md => description.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .sandstorm/{sandstorm-description.md => description.md} (100%) diff --git a/.sandstorm/sandstorm-description.md b/.sandstorm/description.md similarity index 100% rename from .sandstorm/sandstorm-description.md rename to .sandstorm/description.md From 4a2fa1f13f4d9fcc616ea36438189b20ed3e2987 Mon Sep 17 00:00:00 2001 From: westmakaha Date: Fri, 25 Sep 2015 20:28:49 -0400 Subject: [PATCH 010/114] smaller description --- .sandstorm/sandstorm-pkgdef.capnp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 50c67b607cf..93e7d2b689b 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -59,7 +59,7 @@ const pkgdef :Spk.PackageDefinition = ( ), pgpKeyring = embed "pgp-keyring", - description = (defaultText = embed "../README.md"), + description = (defaultText = embed "description.md"), shortDescription = (defaultText = "Messaging App"), screenshots = [ From f0e78ea5b19a23584be801fd52c24b57381677a6 Mon Sep 17 00:00:00 2001 From: westmakaha Date: Fri, 25 Sep 2015 23:00:02 -0400 Subject: [PATCH 011/114] sync with appstore version --- .../{rocet.chat-24.svg => rocket.chat-24.svg} | 0 .sandstorm/sandstorm-pkgdef.capnp | 10 +++++----- .sandstorm/screenshot.png | Bin 47452 -> 154050 bytes 3 files changed, 5 insertions(+), 5 deletions(-) rename .sandstorm/{rocet.chat-24.svg => rocket.chat-24.svg} (100%) diff --git a/.sandstorm/rocet.chat-24.svg b/.sandstorm/rocket.chat-24.svg similarity index 100% rename from .sandstorm/rocet.chat-24.svg rename to .sandstorm/rocket.chat-24.svg diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 93e7d2b689b..0041c47145b 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -34,7 +34,7 @@ const pkgdef :Spk.PackageDefinition = ( ) ], - continueCommand = .myCommand + continueCommand = .myCommand, # This is the command called to start your app back up after it has been # shut down for inactivity. Here we're using the same command as for # starting a new instance, but you could use different commands for each @@ -49,8 +49,8 @@ const pkgdef :Spk.PackageDefinition = ( website = "https://rocket.chat", codeUrl = "https://github.com/RocketChat/Rocket.Chat", - license = (openSource = MIT), - categories = [office, productivity], + license = (openSource = mit), + categories = [productivity], author = ( contactEmail = "team@rocket.chat", @@ -60,10 +60,10 @@ const pkgdef :Spk.PackageDefinition = ( pgpKeyring = embed "pgp-keyring", description = (defaultText = embed "description.md"), - shortDescription = (defaultText = "Messaging App"), + shortDescription = (defaultText = "Chat app"), screenshots = [ - (width = 1024, height = 733, png = embed "screenshot.png") + (width = 1203, height = 760, png = embed "screenshot.png") ], changeLog = (defaultText = embed "CHANGELOG.md"), diff --git a/.sandstorm/screenshot.png b/.sandstorm/screenshot.png index 2a1c10943cc35f37c91548c0fa9f9593dfaee0b1..49a876189745434222bee390e4456073ce054117 100644 GIT binary patch literal 154050 zcma&Obx@nz7dFbN(3WBWic3kc;zf!>fgr)%i@Uo^3&pK?akpT_9ZGR1?(Q1gE%3ec z{LcO7&Nuh&nNEhCH_4W@*Iw&+*3)1)88I{zLKGwa5)wd3eshPao9z9fH}5kY@A zwe}9`@5nO#z-kH!^8efa#n6>q zOsGTv7nWn@cSB$fL1w`hXN?wohc*%L_W@gfiuQ4exz>4kmbET<0>;KXGt~A1SRZp3 zeLoDQK_CB4EP{=LLoylyfx!rGKv8*S5Vk8-L_M;fAm+2sPWyH=j`ht=7E}W^LQ1H< zx{C4yhd|-OLSBQdR@3NHeI0t<>_NE)Jg0wu?g+v9)8%gOiNVTowPa9`9)3ydL8#sj zaSHv9$!N&!Tj@UcvleAucgNjHdFAx|6~*-Z0rxOwz86?gSv1IgU-j?<^dRL-CnDJ+ zJ`a~ZKF6JSZ$!w!i29owNUZ%5Q)!Par<`6vVNM~U)g0oEmiZMGm~pQz#nW>H%7fbI z=7Z4Rh5yA~P*l{vc8scRpXn5E>dh=)cC4rjwCs@{W+{5yH8+0J$TE%U-ICfxb1N(M zL@AXbd_Q@WFc9=(osNx z?s%i@k?FZPxGm@E@l{b-OM}@MRcNO^GrplZ6`1eSqIOE;<-ZoYd@CE^r}=%iRU*2B zS<1=j9C$iOoFYXgKZ_9vK?-lftkZ6h>;jpBE&5>-egt)jj zxVU+FdEBXkv9UOnGsK~tXX*2RliM%1aa?A|D+c zEgC^wSXQViUO`_JsRM)UDl7a65PTYgjw&0X<|_S?!&CmU z^DB1wSpPT0z{`mVFS}u;jJ?03(3A~$`o`sH2{c^PKtdvf^ff^M=-F4jA9r_mpm(C% zWAn)a#?8TI;3!~;REpw)&Ug!_xOdy4^?o!p@p}DI@VdS641Q{*QWk=o>vuxVvQiD< zJ)T%$j*6nOUH(*ivTv=mZO!*aQ9Ss0`_m81n>H9I5Q!@#sTQfw9KBw|SiWpJKcbfb zl=Aj*M^rUfh%=~#`I>-9N31CU-a#Ixb9{U}EDV+J7U<)f+OdMH9oO-*KL_m;%HoK4 zNoS9^E;vmAt_mZ}Dw~65!UU2-*UbK2YfMP2)m$}vCs#2vMx670qgKm`=G)n)9$VZN zn<(PYoqkukA#J`5nveALw=igoea?PQc}AG*<29wV(rcShl)1R47-!o&3!&IAV*YJK&bP5&eq(C{E~Hykv;gT&==MC3=u#?JrrGUJy&EtLzw-#5Lh_{@?QLA0+QBuS(i z3;8|5l`VYEg2_)L%7J=URIKR zXAC$hZGX6iaGhHl_F|BGkC)poRYR&<)jaC(s6m*)ZP@#%3kz+wY{Y0{?H@92jwtwj z=3lacKr<&)h8&YsA3ZPRpMnxy11HR!G*VR(=osGdw7UuF_;$z;^G=hJYU~%Jn3wXf z8zwFb$ZZ|+JexXy&XIE@98qi3PeivkGrJ6r3X-bX`>kor_tD2V)9Z+kXY#?$%jvVC zg%X&hzBxBeAo1adfxt^SN`Jv;zV)Xz_>!-z$zHO(FAnZ<aL@W6W6O1BAX&2AjeihYYm-l#Ot4f8F5`(xnVQaF!aPQ?tH)#uwRc5UT+i)U zNd8Xq)TA}nc0!QlOpNiM&qcX{M|T8Ad|7d+O}N66WRieG4k9`4cg?;#VBUVQD$Fqk`UT24;R!2z)AXEoWG za@)Z6v9q%SQK8F%ld7Gaow0G=j3v6iP;+y0cO;pOwY3Zd*4Iy;?ni zfa~DlrtE>+`|e7OJ`ckgw$(1_?IzgTI@Cc_Vz)^+5Kkul$4jJr&*E zQ(wL1Pgb8B(~zZ`+M{;uxlaUud5e>bn^uQ{@9 z7tl(!d@;r6Ucu1uv``|Se>Y6f%RKsXFZekbdJaQ$R>>_aL7>{8+gF)s@CXwmvK!A= zZaYj!aen38a$1y%cBOX^p#t)tD^H_M4kh3!?l8w3PP6u8#+?PN9S6?0S8Da^OsE~9hqoNROZ z1+&i|eF75!Ix4ONL^Qj+vQiQAS>pm@2pF{UG@P3_BJ6L2m$mZq@Z16$lgweW*x+Qr zjGw}3rw?4q1_o0_8LrOyP3a!~}KQ`6+Hww(|P4 zUnCH=gxbdt!34~H?VK(&S}AqOT9aP;*j$~sULFZYu2aoDm`r>VIN&|06((6)(z7Sn zQ0%r^xKaM(G;e#lk3AZ2xYk|Ia-xMe2HWXh=JP~$OYLCWw0^k$og}R}rdYh9_+dkT zl)SxBG|V=wyufHplI$k9ht2ywG}IV(?wvG|&P`{C`+JR6eUbJmk_=M+k}a{0LOi%$<};yo6{b!Q>k9^(Yp_I)dsW0sNmh{ zx+*4IV^w}WpS*56*=W_^yRVJhKy@Rku<_R29MC38h-n*Xxo_X<5;!_bG2^=U z)IPgG=W>C0U8`~{z373<%l)pK)Ksn6)5r@0dV612ZPb;LVuSVC&n-q28Gh+v>EkgL zOZIRjqtUqFxn;mw`Ta5cTDFG<48mn|!Y|dMh3T36=VEwvQQqwrZn^pLCuZiEm8%s4 zLBHk4#s%x<%Z$1Gni%B3Ol9KGw z@V!0M!1iE>Z;%w#*naJjb+yKMK_Lfs^YE0OgwIjn#+wd0kUpX}2M)qg+@|e0)q07p>>pLoTrcP3M`v*D10VCxywxDoD?6blj~xPPyoa zNH7LlTUi?RmsH5wi|v*QfB&H%8oD2Xy=o5-=EI$Jtzl-}@sJLHNS$mKx(rXswsLEo zCfdXIIgC?Wkbam-?&mjZJXdtzInz9`{PWyL!=X!RPm;Pk-s{EP6Oeit6G2Q?cj)j6 zQ<5JFh)Xm+%sHLTKIlFG2^3X$wvyOM8quT33E#<2)}Eavx7T_rw7$Yy`$tEP1}j04 zyJT1x!e&34E#Q{#UKmNSG^lbM|67oW@peR2d-9#4-b$7!Lb%@xLgG}iT8tW@@v-z0 z1WKf0(7Gws4pmdrGKIUE?zDw+rLE|QiJkYQ%7a&jtCyz+6&$IT?zH*yP=d#DL?qKk)@)Y5E)oA>QbP^Nmy4Z~Hj`WtBXa!`X@w za`X2sZVDSIeal2-%9knCS^3*`r6um&HRyc}HnZm#s@Fs+WCxTry2cx8{*!Cc=ZClJ zVZXCpye^?wov)+6v$kLbDdT9lICByQ`LhpDpHH-ygjt-8?{rzEvlA~|1lymI7`+=D z@u7FO?9O-Ef0FJtMpC;z&1j_~RA+NVz~4DS#-!iYQZ7-FpMd5k$uyX8qY~}hQf0WG z?U1*q@T1M>kJ{NuhI4Y-s2OVzSj^ed%RoJ*l^PQSJ*(a3k|91Bu{BATvA%Gu4HgH# z2ZunkG78&dA%?VR%G{>8VW>nTVcLI=QK?6(L}XJt9gwY3h`20NE4Q!Vmi2y4Ob7N{WmBtQ`Y51S!9# zTKW#)%6Z<F6OJs954O|0!){*#HATWrCdr*f^5DdO-hwjMF4mlPaAQk_0t zE$Mk79k;=izB*W z)9m6P2BHLdwU)}QoSWC#L+qiB-{ zP80g3hu|4(tt;K9K+3j}j>_;pQ%{wI1wRZ}Iw{o>uKkxFR0$SOt*e{8_oz7Pr=3&SYmmHXAq7-0kSqOnT0b~Hp>gm3a zhsZ0Ft_@=J;BEUbf5ghL=Et_$OhziSB@#IR87$6RhpTE%!R{E;?=+xDU^ zhv9bj428cdiNE4)H`kfsV0g;;Nn_0J$5I`g=E}CIcOr<}nwCl%_|17_%gISf6mhWF zqFO<>&>`RJ^fX0{AA0#c@zi9lE6bGe!HBz^U3kQnzC)^`bJJ~L%-qL^mGFJ5i>U0t zQ2zo(0Jr->2PVKWYw!9^-l|bD3B+%Ui`vlWtPxXL*`XlNI~)=6EctBF9V=;eX&$@P zZ&@_N-A*npnk6a$dMqp~(J?V-$WMn(4Z6bg)N5*MFUJcN-QNO;1&&C(5fd9O7RbNo zp%ufdE1XrrrnxYdX0+L2t7Zai<@Me_Ju$sf3e3JSD}65mLl09wL2wT$!u;JYLY=#U ziVNEZA#Gf|D!U;8*m$Z0l!2PF?RX3M%E76-5gVMT?IdC{JH;jvCVav;oE6#b8z*t+ ze4}k~l12IV&UyJpYbpXD`HMRpKGuCA)Sexv3-)y|xTWCAiRqHJoAnOl+H}+Pw8T3K zIh=h=Ct-WgS?4CoXG|%Pv+e?84m;+6{%~4rE0RqFFIi;wyQm;=8$|nBU=d)ek&e zB{G?9uFb&)i4gH$q{H5>P{tEhjAS!8Wsz*u@PR6QLjbM`)4ny3!s#_r(c zRZ(b9#pA-GO6PaiH%tG3*n*wkMBf`dXXN8#DfJ!w2U{#(GtfGyKP{FKsxYpD7`4!h zfCP!7vYmyKOAvHgN7S9^dm$+;g(OT)k(hCf9vxdelxO(VT!%udxD-v?f`i=owJJO% zL&YIc?}&8V3$+^x*2uvX=ZLwA@`lpF9q~Z%*bnC;P%3cru1~e?Og9<>34@q(F=9gq z!C7g7$T^DkTd5sGKOfIqx_3T(KQ#??qfZoDeCQzV5CW{VuDHBK+Q@9pGd@;3KB1jD znrAmKy;>;UR$uoSp*&7m>-`PSVUxo~UtFeK&yFLox@lPAHwR+G`loqvq=3;X`Fh7qtlvu5up6JaL5)E1ikl8XZyO`Kn<(@15uV zLH{jMuC5&Tos*Y3LfN7WVkpgozvbjivglG(otbx@LCq5$r2qA&_@HDzqfoI=0YPB3 zfW^y|7CWdL^#i-?C2*aeO;X2CiD?RW>fHx2p}JGte$CG}#*`P`xbv7~x*C=pxq0(C zPzrqwPW+u&~Djtwcg>Sk3EO0%Ute_8n(VY(%6 z`fi8*EWATE^R~c}^;_E=Ukq7+A-4M+9ljI?f~qG$<5}(mR{@XabL<@)d?XBq!TKsZ0U!^9|LQFtUvpEF zR@sdMC-I1BRdX`}2*t6fWdIL~`K(zi3qUtzWyw-dUnp!ppAWh9X?0F!Uh4|!o1+T` zTxpT}+^)*C?`uKp(o*l#Mj+URV&Ey*z%zGMOpKPMb8r)=xu#+*sVIc&m?aA6L~|}` zYOvCibh!1j(n8;5rGVTF8oX{VJe``VGr50&wlDh=tY%tUzII< z>iUDXbYbmjaNd=Q)KhB-fu z>j9hp(l7fK6aTL0Yx9~3-boeW;e7mjN{0*;`CZh@Zaa5GTCbr70OKdyv?NAFwb^Nz zoA07=%ronEybNq_JN0~vIbCC=>EPhNj8DvN4iExyBc`a&o&X?ml(-=PNo0#f0-JX1 zdN*BeF!kAG;oB?hvw%W?LikMJ1OWE$lUny0WqNpf5o;ctv}DZ>f-s$`ir&c64H%Wx zeVL6}0@TXvB;`@{Sr~4!0nuo0nYYMwP&mX>eF?;}5Y=#}$ zsB$wOBHXs>{*q$De>pW1wr7pQ9z6g@Rjg4B%gv?4N8Obcc1x>Oqrbg8oPuMyrQtox ztgW2_{3pq4K2ljDBO@7^!8AUP2ofHZ&!1D%(+?fFD=R7h(&X#Y7x)3agM;YEe#n00 z92}~Lngx-zta2i5dImAxV`^%=78fzrK2C_GWD#1Lrt(qY0isB9+~2v&qVpO~WG4Ko zPHzqR@xA&}IVi9~66>o-j!JR5gX8hjqZ4`M_)Mkk)Mc-q^Ye{;{d;{PC18ax+BORZ zqL*klYv70!O~7bEW{38j8y5~t+01L_2m;DAN@iweUZ4|CS6is+>8$`qAT%`8rg8sc zb71Cxv80R)?z7D7>~`x%2p<3kZ8=jC6BA=&b6~r_Tv?xfJ@VCv@m92N4`4V{S>Vh* znY`~R&{W~*w6p(3saIDv6_C4#20%%1TNG`uhP!giyfS)7{!r~R;5Ni zIX=E_%Sn$LI%C;_xR?W|Bfqu`nh?eWy7%v)WlH07QKa0Crk4i`j0y1aZc^Z4%%bV5 z_`{6aZFdtJ;78r^FJb-Vkc(h6BOujXaj4CpYg+(rB?zpb%i$tmPc}`*q5xf(kg(<4 zs2o>hpd7) z{>Nih$Pl$H{Z|Vh9`H0={DuAUGTE700Swk_xXM}D*yu4;`uTAa&CUCUhJbw0o;$U- zw->b?z*KWGGgkn|6&@ZA-1Te6&z^i$)ppy6^toFjahX3JOTTxVue0-gYnqhjVhRxu z{<~&h`e_JuvGGT3*Zg-uGGlDbTr@+cmh<>YjjvcX_CW_}ol*nem6%O&u`W`cH)JGDDDl}`-mE&zSJ zeF*`$YWn_=tey&bfR$NaJ+7ngcSmF{cEkpqfs6opn*zFGtM*9Uojt&dg0l+p2gE5x z=jWT8;FG|Z0Is%Z;$}EnAgIE(7Nx~0l&s~&zvTy08EW*#+W?|HR3-nhGSgK)X87>X^>a6Py_yZ_X?v%0>R$Ys=o2@^4`TlK8(Y zDbg3i$D{>l|KA-`U={2&n&)*jrnK*)^LhX;M1%VGqhNhBDprYqO3QT%zPIVVjV|e> zL3@0o4%b1q*kc<@h~=9_I1CG9Mkw*Onj=GifRG^eiIzhcDgi3Z-=TeJAu`1I*D)bQ zlmDs~eJA~njq2~2{KWFF9UxKsYi&sXuMS;#;0ar&5uvt@07N??(Q^u$h&P zlXRhSO8r5D1goq@GE<$dN0ti3;vk>mN>aL;J0W!@AM=KAX1_J!Obn_WPlM~FD{WfV zU2l_j+&j^h)aG$Io$xbCBz3RIL9wXV+^X7V(9ZZcW!w$jeEy)dF?e$^xrO3$I+d9A zrS+7rHaN2KAh2eDXWJJjG?iiH5vs_~zF)z85;Qf!3lq+@K*G${(qEX$}d9 z_PmWo@c_LFoqRU={W`mzv8D7h0%1Ohb|9OdWr^dg5+Us^vBv zN`QxjwY|T#xzOG*d-DW}TQ`*tcVhb%$}-9syXr!2q9_AF57hgNmTKWjJbOqDfU$mQ@U+#nqFayOD!8NHo=2O&A-i=@1ecyI2kLpfhxHVw&1 zb$kCYc71nh!a;{uKfX&!c4NW=afl5Hszx>F0?hz$5Jw(&mwx z36~p6;fDVFVZ5Zf$Nk>20KT)TFcqQTed>J(5kys2-H)>+DJ{Z>rx;4jkpo>@h0Vs@wjk2qfmLtrX* zpO3NhiemXre)sOHDhO4e<$X=Uk3P>BR&X&7VcI*ExqJ*O-*IQoDsy510kASAS|oWcITCd6RT|^FqaHD7IZ*y>>h`m?hp;c}&M(UW&^vz!sd^nwxYh+ono$jDz9cH>=l3O=BD;GYc_`$F+)yEpfYN4xG^1;M! zc)BE77#55PVy}@9Vw?~S+S3C0TzsIl(Aby}q3>Ny`WTL%CHNvf$xPF;p;UI^wvhh2 z-o<_zV81A0cuHb(Pb%KhdaOZ6x8N=_3eZ%9+w!&Z0N#`YG4gIiS+JaWbY_vN+E`({ zAz^S;jqr%Me~3iPQnD^sfv9!Q?Y?djf21!ss33>a47&NL3R~3?JIZWFO7^*I=44v8 zOMgp-5Mxd2e1|C5rW}6G5@A@r9<%5aGEJ2{ zlQbE4d4Bf0(&}Uualfzaog=BcWvxF+8>dWcZ&^r^r7(#{)Z1eZvE12GLw(4LJOuVV zmkWNDYI=zZxSb`}^A^R#&LXnDL}LF^UgcH&jA*x}*B_rP!}^@PS18PcV}ITF`L(-$ zGdS*yPq?t~RcVOgh}zWZUS$8FJJ+&=9X{+3~CC0NKnQ|-Tj2}=Lt5$tJYuPSFs zAsn3Az};C|H%b%D8cuW*$6x@f7+cJP;6)7+6oCrC@Gyfn&vJd%LOzKe(lEwVIi;W9 zZOUa0=xg4zS5+(iX^Jb70Hb^(ePB}>D~XemaXSo5n?ZjXH8~w?`p) z6b8SSkzcJJsAZcbd8qDsu*M9QDxbTf3YlzkbjN`64fsJL-XIUIl@Oi{Wq zRCCVQZDPKfpz=CI)M_d<;GmEk5o!0UMp~#{KC#@77XwC-nT8HSKPz$l6tNB zNz~h7E~vV?7B0U6l4`@Lj*~$!J9Td&TrI^W<5MwraVi3#B%KnZ_abfFso=7AjWB)F z)r-Yv(nZ$ZDMkplf3-J75j0iR3xRAk>8DG>cX4KedS;g#SNAN|rbw7Unja=RVpKft z;K_W?2ERQ94yt@^?H50odK+A0kI!`MikzSyguhOwV7O0p6xxSW-W9v9{c)skiI_zX zRB=kb{zUO{YbZbO?s`17`YXF&IA=|VP-e!os}{Q5e3MXsduMa1Z)5>YG9SF9O-;T> z?yU;83Sn{wV?>#K>ap$A$Rf{Kco_zJ-})ctW|zj?l#Vy-e2R-_0u?+XA`rtQmvj$1 z#xYm6o1UA&<3r?0ry>ZXqVC{_1az~H&AT*E$f~^g3CN86YY?hT1PyU=WnPh^mFmuH zsYt5Vf`+;I6UBQ^^S*T1h2zAx-^)!UPBc4HDp^}}#|n>aocIo7hQw7==HQoHTkhj% zXw5EVJ9TSina%Cb%d%b#&JbHolUn1vSgj%i+oxGin@KtSR99I$5^-OweLn%8;b*cs zu5Wp5@&o2sS}}ZV?qAZEH8Fl(ih|zkU~Ykeb9ZmJxclq$AA4<+^rqZpaTAO(4~`qEC2)H)_O>@fOGj_Z}olrxPunaki)P1R>ie2 z-l(@Qow=hn2dXL{?D|rqwXL>&Edy)n{L{S(7#6LS?`HV7G)p9xQjKGT}QPjb!1e5((Q6Ku@8gQqY>TcBu ze--vKUTdhEO-iuqX_Lfh(+@c>nww;9y|ymhNn%+ja}Bvnhd5nLpfE}lxR|>zc8ef| z7i4AymXCJpbzED_TilwHIV?9UcF+a_0-F!V5QwFS`bj?aMzdHpopZN}*W^IsXd2PD z!FSmjhU?7pdR_hYgq1A}u`SQvmaV77bFW@M%o|z@OMA9?8!VN)GH}H5kNx^R@0Bm@ z_Yp43DD>@?@3m$Tla6bs_~Zu5`()n)@W^Vy9cM zP^#}@gT&G0VtIpugtU+1P^QRiKK#j2URy2Xev$ftP;I0XGwQ8rdua?1CGbu(y8>Uu zBtUa&L9S2N9A?W>wN2snxZ4}lmoKAk81ZSbKXU?`&+gDT_dH zlq$mp2Szcgz~AiU4tMojhySEUG~QBzh20n($|?Q1fjp_Mfj~kcMmy5<38?eimW4lK zq*L!RMcA*rXob(%YOy9~Bnm-4PF6g;@Ixh1E4|vBRx^x1dNY$5iib=IhHl2h=}E>C zl)0g(lv5u%2x((Xg}?L+dIUbO_N#;$6pB)Xx>;95B@Mb37xCTPU2rZX%vipe2^)UP zd+)95oJT&M1{kD-L27S27S>0$XPe&!L?~2iK_JCJXiy{WGPwN{cy@01_HLwQM6N%yM41t`gE}xnqf%ETnl5EX zBS9)2jcileTQ5*p};Uxkn!5F2DCZ>p%NcwrtErL7MP&105w5qs!1Yb8px ztmzXGY(;FiB0`TVLzI~QF*#wjQQTHrJ|L{$9gN)yu#oH1OsuJy4jBBxlyFR<93U>`T$_pQ@ir_SGzzO zZ=w@NEo{nPEse!nzxXS{Oee(J^GZsZ6c)~9!y~#Zf)!%wwy3D%UI@R& zkr*H>a4?`d!8accWUpmR&CRurEVjTV1fG#PrQ%HQXR9Hh2Af+*7Vk0@$+Z~lq>|q7 zR;`-qPe50>jGf&^SI6EZV5RT4+qj#K9JrqAslPqZHt{O`9WSzaM451)7M<+6UYAxD zMyVLBW8&A!MNtZ;%wJ$D`*W^k>=Rm88CqrI(%vMUX)TReJzU?VVmqy!UP^z(TXXR9 zkEYZqotDnnjpNG%Cu@a0Hx|_fRGhBv7t6FC=9N`Ttrdc%XAnBp$7b>Nq6Pf80!cjE z-0_w^UD!I9LB&U!o2lBC^dqfomM9E#>uHi7vCLZXAVl&TG>SSzGIRoS!qs0PPV?oC z@eVz28tt#((d0$L^4B6i-Fz59S4>A9&5T#g_Zjk6PbGZadQ9I6`4u!Kg7*~3WdQi(FDQfb|G(o` zb$|%y7kfYcjsyVFXJyble!((f8#7Q9L6r^a#mtCYu;xe}fWfl<_m&LxI_B8=Xv;9 z{oY}<>m2YLSzCE9l>=BeB9`NRGC6%OVz;QC>@LCVjl$`v1^SiQFjnbl2}kW={7wA) zEz_9sbURt=ZSRZJ8(-fCc9*d0<#>_g_P?J`;8Qv6mDKSMv}FDvu>a6J=hY>64fna< zItuei{J0jzhXsmaI9;6UQgS6R&VtCw3VR`V2K4^f`uzqj`=B8TdAQrO#`z0L{kn`p zomp+n<2%STc#*th7T#FV%t{q!G93T#ndpAj%(U4k1Iu9Mh=aiAOoL+&vq`uFEp#3F~F54(Se zw;5fpy5bWqQ1O_!E`@71*jkrHJtp6^)m$u?JZoBs&g_kXQ=O2heV${)+~-eXUefuM z&$Vre@xPy|`{*_19ni$X>Q|6mU)joTT<1RULcpi;-c<)K$KpV5vwJ(ldzD!8M}jHY z)arh@h`HW@b`+Tp$LzXJc`%u`aMbGpy`608@<$~#ubOU4M+V(<=W9cW^s{k{lh6fv z=zh^d)5c}>|KwP<`!`)q0RV^XXF?zS+-%vTTiD^y%k;<(0ix$yN)|gw&~YM-lTw0KXW{Q*|?G+P|Midmwr1i2&Vr97r*#evcv`jIi;Si z*bY#?Ak4x7fwt=QUtm+6QFkSGH9{?y7KEFoXNFmgMO$2|3X3uY6sX)aRHoMH)A%n| zeAk3I-Uk$Ma4fOaF0Y)}wkJjs7nLD0q`_dUjfm5UCjms}7DVPVXT^U)h^UpM(&N8* z|BJ%{g0$XmX@ltYChLvY+3w-#+4cu#x0VcLO*2zNM{1fL4gf!EUq1a%Rdts<4~f0L zYF*^{xn1K~qbJ9pYva&LW#47c8SHge9LjYqHhVP4*`M{;3*U$4-L{Uqef!V zvo@0^T}7P*{gb&bu9GNfIWJ{icWpJ$+;32$`GiV93^zv)nj3Y`u2Rl6+t|HUTCEm+ z#^ztSwOg&aS|Pd@%~%Kbg0?04>GSRlX#$95gMxZCX&8IXE+<60FlsKYte$fyOLq1 zk%P}ccL&}&S8+2`-FEWfO$_w{1fqYn+%oHO`OS{@@2>+6@z-KCQZABeRj8FTtdJ%6 zRW#N~4Trq@m`u-x` zfH##6xDg=k&!GSN-AJW7hNf(UazNny*rpu+Zy5I%3#?EuQXN|by^D)W_nMtNPH+!E zgC-fX5k43EsYVZ!#sdTr`m-mZ+49QDUe6K1NqL~CHeG-*yeWgh0GSUoT1k1}&mW*{ zJ8Qz+2wybb$O~YX;**m4nDO5~icSG0@E^u}wE{B@d;1E~m*>m*G$C(aeoWrq9?1rX zOdo)2@@;$DZHL;vy)vxJ3@|@0#K8*66M#C+O&0T6#2PqC+}iqJ&Zd>me!T~%4LNPf zq5+08^gSf&E%D>@f4Tevu#Su(E-tlc2Y`wMN8~~9k=bo9>W{xZ-Fi51X$6QoKx|@O zZBM*q%SntL*qlCKTsgN7)Q$k$ks%A9m;tzVJ1u}n1xPR^@8i&?FVK&8$wE5;F$hhF z`xQ_r(URk5rGC4RhvHo+#+wxLNkY0CaF^uB)#AVI@_}B1pb0rO8xlh1I5&m0Ex3$WyayPWuM#vh?bE zw}HTthD4RoPy|!NrG#NsUgUcwveZ8yP;gs(_6rQMP~#={ZkjoD*&SZztBf+gWaehx zZ~`^g)uINbNT<%?T;(`7;}qw|MFMX31WgtSFyFZyajnDFU_(R0`nsWd{Q3P?V6buC z0Il2J`$H-(Ha2#C9yq(cfQ+khh8`LX$UNLm*7Ky3XJ==#MhZIhK_bTk97|0AciOC7 zMgau`hPOA|`u*`6OeF>U)55^Tzy{wjA)`AFl4jz&QgUMRxF=H`utY@O;!TcS1sdCF zPEFlXCSRtR=(uj;Vnj`!980!plvlHx_ocB7EGRWIao_u2YBQ4X-vm3gy6Ud*6C#Q( zwVO9mR+t@KH9x;yi-+~0?%vs3NLv|nrDAK1_$BjmnMyf#{*HE6iQc=K3n0-GW5JeT z&L_j++2t=m3#UnSKYfW8C=>tRN|>>X2VzXH4Q!ou>I0=Zd8)6_a|D~yzHeOvlmGqu zH&E*g2;Bh1#NviMB^IDo1hkH2d1k;7!g%)NajB-8P6v4e9dro z`J1=)dN>$48+K3LxZpCL-5uAm29{Fodzg4NaCGlqo?r2Mnr(!Qnl!ge;nFY63LEwh zViLhFp-WAcv5;|I{rPQFR#5JSiH6tLZ$gIs>Fy7vmG=7ZfHGv2y~Rp1O~>C0wc+9n zjkkfuR972$B_m%4Ad&lU+xSH{1N2>#$MEdY18}&H4S#)LMa7Qn2IzTZ<%zij7S#5N zV*dQ+{S}3Ug+OrwpukF=f&<>ex$!gElu~-(Z(Zh`++682UN=CDnlFBSF(Ve9*&oP-Cy$JpULgF)B365US^CrPWIbWY-T)a4e%v>JN;J~XsIgsE6~vsKn|m=NL;lh? ziv}RO>+9=*BGg1SGX-t!G$6Vq3-f?G4-hij8ad}`zUM75I-Wj~QM;ajxmPf66tW8=q z^9Oq7^K2>$Vuv#u%5s`CPc66lz7K-l4W6$fF*)<*OiR;bYfCHgy#Ndv|a zYiEL{XJ5_L;z?MIfl3iT>q`IHxUuiQT7dq(isB&?S5V+a;_>QS8NI9SuB(Uc(&S}4 z)77z$W&Mvr+7`c_IL>kt&3ECAZdxa~=OCOniZ@qTs6_4cO=~RSZPwb~l4~uqZY=`rMLdX2yY77Vy!CZijISENh*$_&;skt@Z>o<>?(lhlbn7u7IAc z41;yekvmwNEHPk>6F7JIfdQ?;wpcDl<|_JdE))UVSTmB0w+U0> zzdeCHc$>7jf(yM3#-2+ttn?0k1nO05t{`BncYX~7Az$O;BP3G~gkF)}X@1u2DB?rt z;6;*!Gs){T62&)hN{Kj8$V<)^wC`EokNT4}<;~dKZrvs2cHWV ziRXD;m|P0*^ksY=9b3_a20X2l+Xl&$p^oR51$D2%V8$jU`8hc+eSxAIKuMlw2B_Qt z`7s#eGiK2UaT}QIS+Z>s#ak+bK-IVl6Tju zK|DE8T}hGPkRS4pMYt|vpKdacY#ZViYM!i#ks*2&iFg<@!?L=~A2uE0Wm3O;-ZzL- zI<7)4xqjz!wI>tvA1O;J$qRL(R~7Ygp@+#nh6}bcRKn6@uAu|DeZg|#!)z7PZlYNb zm!rlWh9uD>A-onNzs$?S7yO*lbi*^XQ?zD;g(y)M;m#uos=1-PMYO#r@39I`a&d%o z^4`4cJ@P;cWHZ%O2+#v23X~r`140)=L&Grq4?@vEnbhd$=-C%Q)7)zq(y4#!s)Z4M z& z|4wK4%*;L~%2&dm&5pL!KF7x-%k7{v)ed zjyQ#+p<&R5xFQs{N0%aiI@|Rww7qdH{~b+&`kAvf*-apoQoBehj;+~4-ZErGJ3BX2xm6uem1+sy~@%Ng659 zzYww^$37u{Me&KM01VBI9(T<{+;c*I_=3@=_wVWP^cA*J{ts<$8C6yHhW&0DDFH!B zLK^9k?(S|7knZm8ln$jkmG0PdHwZ{~cgH5)J6nHvL>8^>s^6&|J|l>@ z-Obs-vcYH!RCu{q<16i~(b~7b=#2n|@rj;Zt>J3-Vl>?1$yM za!cWoNrDAuw~bg|t_H|tGx^y*6!633ZdzZ}eY9CMDx74&c3-8kX6VU?%opxnrbKWX zUoLVjLgCRT_X+$w?@r_w?FbpOIi{|9U-=ej%|S5O1gp;@z$L|bk7cddv4aLJME3ZY zOly|lO9F}>=hwKfae1~<-zDT&e*de>`?=ojLd`I$t{36~-zn zQH==t)nH}=zg&F9W$sbOrx{(GkUSdcG|nb?JfTF=qVpkkR{ zt-(S%;VmBHv6fb+6YhY+hXIFWfxNjn_0$oU9R=|2asi4q9gzu>b2+(xwYw~ooFL|} zQU8Q+6*%o)Vhy}RuQ^zSvFE;@x*1RB&GUyN-Gt zDTWs%r6Cxu1WUneHs+4!Dbs-x?eQSr zO)h5s8mM*+^O`DNY!{e^()1D4>tVF?q8xC-S&nr;IA^6R6JKIf3v{BO)qLBDvM zgaO*e+v7*h?GG$x0X*66)Ys)cI6NOc{djGZ#77AHew~Ndta?T6@^gcYmNwWslFdf5 zwWgm}59eXtaJ{KenxA*L(Me4LKNYdPzBHQEo_X!>iyizieyaiu`OujWaLLX z40L*08a_V$D8*SAD#5N}vv95=X*{6k1&{&broRe zHUzkfz*_)U-)%Osw=nc_7x%hgGcVq@PE9@IZD*DS=i*WLeVP1h88qyh8dTv4KDL%L z{TCw<>d94_aKza&JKS1pK}US612z=gjo}VLYP(whkkxxmHjiCUto^5)!qjN#$ZX%U zoigM%pV(pf%`B$gtEccATuarT9B@wB1O(sJPvAaHmZ-?fp{W*Xu5fS?j9Z$lcho9t+!! zuMM>V3-~FnqQs3~Hu4kP^)_wN9hSd)7c7WPGKi9Ntv?WzDtWd*iA4%mNWxYz5+_=K zc4jsqV*gX>mi!=7;>i1#gKnA6!$kGhSTyNem|$T=66tl+&_*6SXeN}c{8;|7U%#+n zg;I7tii9dk1F`3rY3J$b>D`)NHoD^k-yQGcem-FT2lUl7bOT?jf&T)Mrj(Qvz+RY= z@;rOkBKW#N%U zUe49e_*E0{2v+cS9HmH&e>LZ97YeNr`UfHeRTyveHnv=)Okt zI{Y9}-C^62Ph~1bj{TVURa1479&_Y6Yu$WK|V)!S#P1?I7=eCqjqfGdCIK}{8WG@6iDKa zj*g*99?Zz+$YW%<#@SPAHUU_Bt2K?a;0?q@Q%Bg%CrJR~=Y@M(S{lGg`Qmdk+j<7} zdb+=OA63}W^0?U-RbOBK>({RYat~gjs6I@zFfpYMe4f{bv*mzT)jUS~X)f`jZpc+O zea6I^^8X$20KR-qJHawzK`M3fxGXhgV<=Ht%sAG_Glw8jMX%Guaau|^7hpC|=Uxm) z?%lG%VX}GkXJo%MYQO40SA-G;MX$Ot&9O>FfAU8PR_@>5p=1#rl|#%YvCLrh7epV! z2#Ssbbyj5Ph5opzCojP(K_r6~1kIgacUpE+ARJ@9RGc!UUS z{_=f%i}+$y>zyb((;Q`yytR+wxM+-BW%n<@ay!hXs?ORs>0df$+ zTYk4wT`w;$z&iloJ=pLIlTrZI4Hi~ieLV$cL`+P~_VzaLRR0}mKxCU%v=Ql{$o22o zoqDCB;2FK|O0k^!6^iz?lS!~7dEXyR1R)?9q#8hEGCIvV7{`3K4s|LzawcGb#)M3s zX8PQnf(~!K^1^gkqdbKL+0?mKRKY=lM{&xlUXuM);lSXmu8*CE*;OHrGUyZ$=9%hV zn--xO3*Ul=3sd;B_>H_Y3_cX7ltBZZo1j~ge32(U)vgCz1Uvde-UM0%TqCfDdL${C z$4bP+Q?I;{=Arzq>sCJc&}^c@(CMrW!q2Pj!KSI@(#uzWow|j5Dey8lkgEOU%d~_7 zr6_GwtqBy40PQj7hqNMqR>PAy4rth6gSu3T<=X+oQ?2P3CafVahSi!the7L?dit0+ z4Qf~qKzz{B(lX6TBB!CCFac!luC09WlHX}5FjvjKL)0sc`2yA*-aloCK7~%h`40~D zG6y%E`X9+F;zeJ?9O?haGU(befBi5O<(Ws|Zy;qV6}0cq^W#dMRPzxm_;+DAJp)!I zN!W>FFAgNVOL_dn)DNXk>&8LS%c~cC4EY&Ya395Lghml(o__P2v?m%$JR?l~ z#rCp_18?n9DO6(E;n$m2x<%!d`7`=Y``z*n)b}K?s)A?B1;Ka*D3_DXGp*-Z64Vxx zZ5HG1TVVrv(25-$%w|)uk$aKZ#Fi9U7#_8hi)ihh>xxW78U`*Nmk4EhI{D9Y@!tt0 zye8lb#d-6D3f^XbD)$=<6k_u_9~=QvKRwU*RHp+J#D zq!}C`Od~{r<7QtCc5nS^xTa5CNCVi1OG^Vu5dT`f;8AebFWiq^z1Z+)UGx$P0E|;M zpVw!i*r+^C>px6dDS%r507R?;wqgS&PN!X2sf4z_S!+L_B#+O|wlfuWdiC+!D9(iJ zR&F;K{oK(jtA7Vygg0scDw!5*>E176XCNXCA|^jDdWd+Gj&7J3?7Iucgf)_7^;E}I zZYjYKFNo3O4DNax2eow{u?gHfumG%8m(T8+>PdN}v;sBkoA<>WRI_Cb+169<@>tz^ zJE4U08gg4zWCP7ZNa9CkKC!g7)A(OUY+XhTn3}!w6AMb>Q7sYh;5Q(=6bz`}xL?o~ zgZ;ig%rImK&PSz3Cq+f2Pw9HQ?6voEh^(Kye!gEN4F4NMLCi+PDQYD?(kMXQ$(Mj^ zv)oQ@v){ z@Qs&mtr&&$zGM{tPlMk*iI2`HVpJ_xJ6ab$7}9t|kCpQGdU;_YW8(zI@rt>HaFCX}!HvIa_+rJuiIY>sZxhjBm%ola2~Z_%Vg+4}bP zep-fhekIp75^arO&CX`{JC7T}#q)tOcA52^%N*^y6 zuiv)>^qnKf5R+aI{+ZTlCOQ*5I^_Z)ia8QFGAy2f;?^X)auN1_dark|<}&bKx~5tY$ZkroxT6M1nCRUoFuUYEu%iYf!RVhTWm;?k<5-uL z{R{(mUo9N%GM>ws^_j9Y+8lMuqt%s*e;=m^5DTFFvvMWJ)%)?H$b>J&Aa_LimT- z{6(Dp?yLb@aZ#LWh3MN2wr6?YQ}FuFn$N^zY8HUD^%yQYP}~x zoJ8gO`KDhf--eTLeP{1)T+n&~j(~d$3spmyFe|GVmq@Zy@kUsKl2jOuR9ZACg5>5& zggO`c;KXh53SWq2-iV3#7p4-p?F}{!J4dtS7`!kwMuq!Mays(YwP8GscJVmGc1zFL z5eb}v)zkp@%)pM6GB45U4`zAD!`Wq@D0)kxYS*>@`Uy#+qsFpp^kBxUqRjGfv)fx^Z`*b9o#)otcgs$LJi()h#`!q}*Z@Rm zc9bAcXqRym7D``Crnv=jDBSS(ueiYX+{^C+g0iNiGXir~@?ha6(p$tfGqStb3E3c1 z4dwptMHX&A)(>PPcgG84kzd*HZ2<4z@p0XPH4qJcKqClM0v5v~PXKPUVteP#yF1wh zn1-gNfHf08LKN^Aq zz*N?atsu~_T7Ph3)_&Qjo1Z@AD{P#p-Q5(S`N!$T;*DGqPjtgO=k?wr-zCikht>%$ zyOlHxt{*?{ySsHgVxIsE-$UJ3HcVj#`g;04aw}vIg$^hm1+IFq#D3? zd%bazDu^t4y{>+<>fJcVtp#ylsfzPs`DYNK7!$@F8gB)I6{RVpfa={pSi|C(he5K~ zrWM;BCN{aF{e5!_3+5$IP}lmwOz~SH-uoBG8DMN1KD%>saq0UfqXRlivHXwJ06&y< zrg!VYofoiA+14(Mj(T{^y1uT^)oVW$Mmwtd%LRHmDK6_bh?NwvP^U2kOK!?#l3{V()zNz#pOnQ8N0rpa$?-@I=w6w%72Q)r4#Jeiz zRB`sp}9P932N5bT;?!gJkwy2O^x7}?v@W2R#Y zRz37(b$i^bF}UxXnIYEEfVnx33@ffIQ?6KXo6z~})Wy2=c!=|J@p5!I>&|qkY=Jeq zl*wSGzrmS?n9I1?E_zjn0m=new;rN{;vV`5}b%6XqI z)({S|@9RM{Wzxd(^z8%n=N!>FZY=6O+%fpN_X%OM6A-2IJN;5Ppp|X11T-MX4ZmqX zllQ}$2dvp#=*K)%y9C^BTdOwhX15&JU5uq(mHjrz4ElwUb|<3;3L3#n$xD;2ML+O?ofCtGebpvxXZN&y&5NeAUX1&AL=RE}vWRT8RebyY%K~SL&DtLng5) zG+*yizfoL1QZqsA8keDEsXZNGIUM0YxySRt2j*tHx2pouEPspyh!V3*1ynuIu*C04 zUzK-&VAY*vyQxDaIXPJ-g-)x*`QUF`8|aAhUG%<-!eRVU{Z)(vJh=~?Y-aD9yq3zYhE343m* zt6;-WZLsb03(0oiw6K@Tf}sG2`o?6|($`|+S4Gm){csI7Pqzv{AZ+%TA=Q{IG9jpp zc9H(mXtEGmma&tr{+=6HrDthfgUx;}fW7wScDQDB=55Q>KZFz-6+W_Do$?*iR;IRb z;B4EblviE9{A9FiN7As-t*__4G9zfP^|@vCx^cKE`s5Bb@I2Ac?B&8=P)gw1@nD_n zt;YG~b#(5rnzr$Dx!Gr|p!2kTmp>3PU*SW)t_QX_nq#Mk50W6YoZx9P>1%Nuc+$69 zYrhH+8;_Jbdc>v5l zP}i0wdb*@%uGlexeBnhAIL`OwlYp+;JDd+|Mb!C=9HuIkoJgLx5ZJp$=az| z|IO)ITTk}u?_o$~dkXikzQrfqm+m>ak@go34%=Vqwz_xexn=A(r-h8|54)#wg`8D} zE33Ya4l`CJmIrCSbU5gSey+A(B=-~e+Ha5I!IcPTR)P@K&nhJf4h8d}N!*{@!@RTu zjvj0Ar`TXnWL_*bw;e>1s}jP?@#G=HuP(7XD-|KhVa4CHIlbEO)!4@-*|s7)-cfml z?JFhk8@?0{1LesTS8rL8ftASH+go7QQNn@~V&VxrY+;DZn>i>*0<;@pJwk|hfTfuY zpPrU>hV29lIVIqLg=b$_1eFHXAtN<0x2QTv%!ogDNBowH~g;h`*vLL z3Y$BAuD#}}>8Sdb!b&zROxDiPVR_2w@{;By>(%=?KZEDplde1$#uqvbc#=K3<+|DU z!7w`* zj<$hVS6kEarJ>aNVHM!#+L>9@;Gsjw8IBmHNG*ciDZL z<>|FMG34!JmrNWI6Vz(8ZIP~?;%P$S_HY>)Ig11u%$j!5*)!hpGzJx3AvgXiu|%4f zXxTM*7|G7m-v%MQA79XViJYj!x|#7vWTqURZZ2AXZG;T=$*d$L9NcZc%#89ltC^wH zs6F1#^b=MBx|Uh;bhg(Gp0jqVrZV&AFHtpI>a~qA8sukr$uh|Atyh`~^In?Frf#Q? z5OAbbG%9|mP{U{;7oTu?w{eFQh7}Uoh##bMks#?>lVuw*yj;R@W1JAZi4R`#=RAaGrC$vv7577})`! z%s{f3t0+0|0-(A-Yd0 zj7(i94+^Nc(NT-mYaCokzc!8~tFn0xb<|f0TM$hu1=+jrxmSaKavvv;lyB&H@C1Gg zoP}zVcKX1fBQ&ppCqmV#8-Mvtp`xVhthCVy6RR+v8*!pdwwX~K+LYVTeY=Rhe2(xZ z+I3yQO|4=JIZwsfxuvQjdOHD1>)I3VZ@gEBixT5j>srasIj0lmAT9b$k-HrhVScW; zHptinvLgbTq+3aqU!l|9C#{Ft`S-Sbo4(dZ89#kR3iBIF&}x5jR6sPyyxMG&)ZD0> ziq!5MInP$^Pz5-}Rv~=pBUXVMF_)AY2ent9)K4JeT|NKP0`Q+Qj&UuMd*R&7%*m3s z=18cH8Ng4u%;BM=0f69oBs@ezc(No=RWYaNR9Q(G9a8B2x_;UJ4Sq`PU~}*=XbPj5 zdze(!*o!}X8`xS|SpmSGc+6i#0dy-b(HT%E;LZdTQ!{mv;PLcg_GhWla~Owh#bpJJGe~f&0sCm!N!|L7 zO2UyMkQZor_R0#cDl^WdK9mvi_q9%YE!pN&TA@K|kXGsZ78ccbwzK&<%Ii8QAa@L3 z?jt>T1rPV)q;Gby3A|P2+t00)QbaC(Wwvk5!3VHFNbsX99BjgQJZ`U_o_OD)fD|{8 zSaA_m#Rxb|&zq`6gzV3PkLTBZsjI>x7jCXs-lv2GA%Q3`mHgAAMmb6#^tv|skf1F* zo}u~^|B1a)S6RJ;Ef-VU)uVF8GIht4?Q4zB0-^A%WW;tXL?WJ5P9@KKozxXJPC)=Y>-QbhkQ>lem@4t}YlvL#2{pxTIu5AREkS|0Ak$K{13 zffNKdL?A0M5eTkF$JaAOkUHnddBDzS#o^QkOhYQFrF}|bs857hk?g1~R9e*=PcSR^>_@UJ9vlTP& z#q*G|h`il!rLyHW6h+DP6-X4$6SHL6x!_G!UiuHuTV#GttvfHm9UiyOLq;6##;N(e zwH|k?j()psz66z0kD1}wGQHSq5k)+vm3W$pzZX3%;=I=T1g%;|C}f03LZU?A-yX(@ zx~vG!hs1t)5ldsGpjZ*ob-QF#`=^YxWkkSvnqvFYOM``tD&in>n>ZL!iEeL?R}KrZpO*-EeyD!K3QdiT{t9E;S zyp+@@|GV^JlxQGHSH2DHD${64QVZ+Q?gF!fx%tL>yI(aRb>zX8k2Da5dwak^q zf%bAsQB#AUS?jdEgd?$g(--nmMx$awE-)3ciHNoK2hN9&H{SRnW? z{yYm@3lJo`heU3rH=b7BLXOa^zvvSU(PXB$u7AV`d7q~x>B(!x<_v8<=D^~^dq z4XJFO+(o>>TZfbT<_3_jm^{w^?1t86b~Wr4g;vDOAr!O_uX{9Gz! zyABxOal(~C(|J^DJSPR z74C*|Q?m=>O6R|8W4X{O*W5{{y;22u7>j+64oyZrr|?Ji`h1o@{iwFGmzVB<2{s?>FF%%6Y#)#?;TtW;XQLs0KQ`ZfeFfu&Lap zS_)TV+K*D`by_)iUA~}^etThB|KxGIFt7}kqfKGZ>(Ia5y-wMFVYec3RkQihZrwL` zIQlS?fvApPM}w~&cY`kaz5RnrPu$N(j_EFx8F*~8qq|#^WjpRT)yN##u`+Ec`%JIX;_QRh zW&{}~|2Pv>Qx6>Rv7)%)?!FSr#jzlB)ld9EVm$hTISsaGtA*4w`rw7@J;) zJaky~|I`+(6X+0UF{6LYfFOTUJun<&a+a2g>X1o+1&*WeuOL9h;hs^kK?}q7UkA?Z z&~tV#ZQi)6J(Zp#LGw10MSYMuOR+$T86Rx zW==h;_n8nK3WqvmxbYYjhyUo= zu&;YPKuzIvO!raM0^r)6&;7a?&nx6wGhY1&8$GoVyT3*`G3dK}8TvOIbkq48bu~fq9&IF; z*ZNJ$%lTNc-nupWf?Q(1JE~c2(R`PV zCJ_um4;A=YXR@&g6`>2=$=1^r12-&4Lt*gwErGLuTt}^4qF-=}-%<^+l-#&9p(jY3 z3S{2Gbwf){f&>y&X1frbJyBYG|Hj8Y(DVN-kAHM;rMSUH~Y(49Sn7}G)E4Q0<&vl-XZF~ z9Ec8F1t^dDww^SNSpln0loU!3J($)hpUajBIA!5|lo%<-RpV}CxM`(o?K2Zmtco-r z(F9OIde5NyJvo^oa?@?vdhoB7>BGSDdcp?BTzV3-%xdt4hvmr2JH0pIr)?XFGhdUF zec z4P82YBJX?0e=f;kEy2z8oZv>~}Qs9V%pXdNh%+a~lc~N>AUHUaWsKiv9KR zu{3)Mb3_U0!lVASos&7V9BTxT%n}y@0{7dv^_x9B48>?}&7Cagwo=Ib%kVbB44zwuVsDBD57o9Fgx~JHT zKSIxz%h*B$hc9l=g-RzEethoCxA?J695fgt@ml8|JWnGW!JYx}zRTSe|Hd>`dmKSC zM@IGZ11=HpwAro=5I>)~|8csD)|ZzItO!sRO@BFgJKOW>v8!8mzkbVY1aWJhXS&&- z%9!nVocRGFY&wn@vY0J?4wCTD!%Q;Rfk?Ri76%!x-AztNz-B>uioXRjQM#M)T?Rkb znyty}zbJ^zprDfEOmVzipDtzAz1A?xTqqE=cuxv|+Zi|0F4lV!Fox7gR;OxSGxO~l z@t;T`;0N)3y#Mai@>=E50G{tyMb=+MBkDkp-XsJg-SAL}|GBIKvr z&ifp??y-3h@#XnAM$aqTt9@9&V7o?33kJ^!53b{T@{z?aPs91uy%%kQiL9#Q+%B5v zAE-eKZYW(5A`>T`RudjmUT624jysee9_*x zh`rB^f*p!C`kiM0`|-Yg&$YdEk2n3PQ_l$j-vFMCumwp322>=%kwa@+l&EHwM=Ce|f z5FvxQGse6x)h9-_VqX4}lh~iH(!OpU<3cU7ObreZ)0hAjWDs4r`|Ub1fDpoe)km(& z4RPdjc@R0UU0lZ#SYB~CZ1yQ8fW=6ae>%0JAu#<$H*UT>Z`;WPP266)$N;zLd}>53Aefp}(g6ND8f!cYEdPsvf*kPiHW$vN=dB^5j7rE- zr7tQBD~K?u6a7C;-*gi}GChf&i(*1Tiuly3qDMn*qVvg;Ta#1Whp&(GF>C+(^&HkJ zD)F=t0hI+phKR~9=)Cy2J}8MuDlz|*^By!EBswYd-YmSY-`9a7ke>4d7({A>8z>iJ z1RC?Ziw74h*iP*(W!_7EmTVBc>I2D)D^Nr;qxTy5n}-;Ofc!CrNK}LWCsgYmbxeTE z3sLlxW8PvGtP!pWpzt=-%&bX1c-DwO%E3g0D?}F+w$|5dphc6;8{jW_>t1AguTP=y zI8!cj175hLQlJf<&&qN7VA8qU8om@TblzN=bISSC6DVhTPEHEG?<33kmA zxGaCYUrtX?^XqeYU-Njsz6gjvA%^jYn521CbS8IkN9^* zlzZbJSTh$%KEFieHilkc_XdfDpje&Rk=(T&$fe4;V!!TJYzBl@-d^!RRv%|8SO;;{ zSQPhg{-0}c(k~xl!r-kvTcLIy;<1qZ;#hDQl!*Gt!D|4gH9B-6M$L6HODHt;tuT+3 zrMH;Mo;)#OW!rjK`F23Wmz_U4WsZ-DGXbww*9yeZ?N1gQ89~y%Y`8cA{LT@=FL~6s z%5kYYY&^J^2p#18Ey%^A-{w_A>3UA7zte@FJupy&AHQ|(+Zj!eO5NP6uiGHoYr*68 zoHo!6nB5s7F3GY(h1jZo_H$YhQ`7sL2ZHx~nu zkPGDtLb0gfQS-+{!$6>ORfxnUKUN^`q6|XJ>E6*5MZE4Dd3AALjU8b0^sd9UTpzty zJA367{8`Zcxb~6`paEC2UwZ>Z>o#O}kP!}H0#Bk?k{4TEHN95#68*A#Z`WMsd<~gI zd!}~l-X!{+Cd4<~M(~_xC|^MM zpQwQrx`3ITF;au87{Y{1&W;Xosqo92<`_J9=RVy{Xu*lcu)t>6JU}}_7)~u%Cm5Gw zrD%jM8m^8GtrvnHMj}+>&s^fL|EXjUHhv!;F~Invs&ObhJ5)c3Ru^uP`GmVzEldfC zNDcZYCcTg}|7PdhA0(xqA$Z|j3eObdBpa0AeMFX}PFbx??iT&&-L$E*M zUs;CN3=SLy;zwC@L2JIN0rc(?#07ZaH@PS%3D|)s(CAQsh&g7SxTJzL{!pqQTmU0< zdNdT46sQQwAvK<^-8EFOh|tQ)>IRWO7bamWDlC+M78czUg{j|-mED}iAKspiGkL(b4vv4J*r8uCtPTLb%l^H-qB*xhD&YbyNT0OGHX5b5mbzW@sOk%=Gw z_sRcXzP=M7yHx3PXrzn}*E8oLI7EV$MTeC_k04Q0qRb;lg2skb!lK58v&1f)C5?Pv z-dR$BFRnY|Ovwc0kN%A^!*z;bKN>Gd5{I#Y$nz|Yx)l9rTI#LN$A zL_n$c-|q&*nP7?P^V)m_SfQdkl5kQWrxm7w>%>)Y$=q)#QW92$9y3fW?OVi);$TNe z!)N@`WdHHK!XG**=|EIG7RiQgzFu~Nb&!;Sjm-;NswBxfXlb~96jSpW^9&v@{$o5& z<2VU)cOHTNh71@xAAvfyZ0r&`#Rx@VFV>GAL6Q?4h)|s}2JyxWOz53DHpj6Y1KT zOkUef4l3XrRq30@<`Fb;$CNYQ>fe29fC1^>U=T>`)a&c@3-Uln!Zf+0AF))~NR)*U zjiN!(=;62I2s4-i{M_1J$L?(J!S*dss>B(o3{?f1I^|SD;q?ge19^Fvu80>5Vlzg~ zA$^J53~V6SXr&@%CMJW@WO)hUkmM2qc7oGQXKEHa}jUg2eT2H@r|DE{2U^fwv zBwalT$t>3NI(T317V1Ws2JGg%ScTnKphZo z){Fn#vF3MB`tNu)}hG z{;A);gr$kR_kPoG(LjUvR#%-{cAXQ`1bnnp0My=zC6~U_t~IsIFwE9;@anU3rhv9f z4Gr!@(_K7-m!(7a-*wkkg~fO@fy2-}Yq924R0BGX$L@Z+PSeC>hN3%6%;D9ax-dyu z2ptilOH>#U>Z8FfV^_)Sp=8bCQH-xHynsy zpYz0pPxep>TglAHTf|!Pn|GaW_cwx-O+nF!Sb#MJrQ3ObaV&LG|8{h9Y(NcCFw6M- z=$oqC2w=HS5G=V>hkp3ICM1u@)F{?l-X4ezTTXbm?}Yl%TWj-p^%-Id z8bA^b5HyZ`t3@kTTRpC5v2O^=wnww8jdxUl0v(`G`qI=s#Ag)I_>z42h`5}XQsLEr zwe-*ZdpJjKeW@2j)A*Iv`WXHw=A(0SYlJ;O$~9xUQ(Q`~c1Fand-iZaZ3UsSBfOTu zyEVUlq~F|I^SLTX%c_vr9D2kS_~m}~o%!qVwHF@^FZRDt^vdw_2}c8!j&eg^RRWOl zQ11Pk@pRDFCm^iVACw{xNwMD(jQYqR76v2v3nCU`B`FI>2z63_3?2+r)A%OnBy#lw zAF4$NXzR)-;Dnia8BYnL2$CsA2$IK3o*GM}_5QZkP>vL-i>y{e$gL5i>HN-xLj#3N zO_8*Eyj-wxNKgBjSYyNYc;4#N?W4QFNsZhNJ7LUdhHP_wk@rmG*lgs3^v(TgyIc$% z6?&XU>TJ@_^O*-`MAtV(A&3=m0;y&mXA({=hBzD~!bjAx@VVyQo5_TXIUi@=V zOPuL2&vdkNM%AZ(@d#E}bkRh>;kyKw>u3AU2a(=*Wn6fdvOl;}2892a%uP$_e|7Zf zd}EWFdU|jA4V*M#u`h1Xjn;gUagCUqaX+CXuf#yx3xpg05g}pPOE)CxB{2wQ>hBap z<-9cbvwgzALGMTpz_tNU&rHNIRuT!PUHS&=--V~ z&F9x@K{WG7=LSXou{zWKC$`x`B38F>6jMQ&PUf$3?e7%}H)dF~dl@7YQ$9OS!FYUe z0}O)e*3YMIWeQfX{=Dwj3Q-d7nWRaYJ8*255+1T-~KT*VHc4S~D0n#t$8l~7`rJ(wJx+Nb{NjH#~ z%QYE?DNO_QF&aa<6GgmaJV}x|WB(LQ4@uY3Hc}i#NF!0S`f)Hq(5N<~=2$kCJT9g} zo)U>+z7wmJonhZ)kD-Vnf+h&TrLm#8<_cGp0wb??5{gOO_Ju}b-~u0X3-SBh0|S!o zoQEZGv|mXGYG(wP6IoBjZrq?jv{aN5#R@4kX%!a)5^PyodyqZ$_+a0qG>3w3UwPif`t>K#+ zt@!fckK6P1+rgo`x9T4VF3Ir$2i2&v`HId)peecwA@0K4c{j%YFGwds!~P0S_PZ^4D-!>b)@**JhAGb6h49^|{ImBng*Xs8Jy4?p_D;sWC z;aLhV75unUeC9(X65gIHb}&*i3*BxjfPEABQjO1G`l3SXPG7CWOyW>m%gv`?LS8ys zcZ3K-Z3$U8PkI!-aAL`g(CD%~ROq82Yxv%GIoVP1ZXw~wHCfFqG=8z!NxXZ?QIdZ1 zF&LKwE7%`h9MKRKB|6UDjU!4lX*>r%O0;LgTrgDu%wQK?{HwoDeKAJ-<(SFUmyAR>K`78( zH1XpX}p;5j{ph@p)9zKk>$C`SP0Y*vY$8{9ys!hO?kY!9XDkpl$$s zxwvQxFY2u}aO>l4tv~w!U%wZc!km)EF-;49dkh(!$G772y4~?%NB!E8&T@9Yaay6m zc*di*^!ML4-TbUNrX|4$15eb&)YSyZ1ZBgdq1kpy)y!T-nMNm#_J zv2yb~*L7fTQ+1Sz{gA^VElCWtrbitp8$3= z9utc0{r(Oa4!(A)j~aNf2}3}mdTD-oa`DT<>K#x_72x)g&rZp!tknGim|w07Ejd2KtD4&9iEY|5LtljTZf zh`NDBDNyUp4d2M>1BXTOni9~3SKw|3Ef2T4R^%5UNTSNBq1?$OoUn%r2bBxq!<7A ztj{9Cf_NedFr+Z7xbdAirPY7>uD;>FQ=XZ@{MGgGN6@i5JuKG$!FFO0|UKyyR4YVhJ|*4Pf^ zJS?{pablko?p_!;+e*T!6QsQ`ZR zW#5WG@@-1a_Qf@%EUByKCzV3Rd2y_h*!WzX@&qo=|Kd{ch_U$u^*BM?C%nlB>^B8w z$yi#TsYuxE=uNNX9K_#Qkb>IE+#dgh-{NAza3I+Ne<%^Avw9&oVHzV?Q4pvI28F~l zj87Ob5tV7~Txem$3=a{?$N+vO$=`KfW5A^ogu&h7!g4>nwCwvipn@Wfx3JFLR=FpJ zZztIoRZ6SFI}dSmzxj?5HW*X-hY%Dr>30tk=N~OU6Le4r+P13Q)#yE zUCvDT&tIK-esEh#9quE&joU#9(~~VRi}CTL`JI)V>Nh2QOd9{j(Mba7Rlw_xh|t7k z|Ltq*oo|*|g%stxZj@AV!AW#<@eo8fY;+MUmA;Jk7O|V!hZco<*q)!<-&d)3)xN*h zm}1C1!?=NiBzk)GHc*GpuEWK_M?je`ERf-AmzK06OzN|_u?NrV8mM^$xTekAD|RR8(9)56*eaX+ zwKvFW2W-F8+1yQ=V2dfpdtZ8NH5d9VH&ud*#89J~+;*28e1jQXt?j!xz#q4m5tx< z?DivX?NGnqzDD=+sqths>KZ>8JhC@NTd!ze>}t!e1Z-@DjtGS&kV^sY*Cu1?V0$Kw z&>mMug5V%0^h5H`20=?C_L%cRk)n%=f2j7kG>c(CPtC02MK-Sn3O2O| z*9bx8l`tSqM+n@c)`E5BnmFcJ_;QaXBoXEaVdy!k=!b2~AFHrR zUKBrnJ6+UUkj&xU81BR|hsN@^W_tSaju6%0lZI--V;Wg~5v+;70d$KP{!wgN1i)N^ z7vC_#&nA?%h)*w6OJja?j?6ij~ICrw^4GJ58R=ki3j>wG;l+ zPGxKwo%=K3N`9Pv>3wJ)BMt&i+r??%ssHEGA&ynP=ltaa{TJ|d>fW*5b$Um;*Y04m zT^rAxYy+h4Z0)}9fDm~k%NufKUyDH7)%cY(@hXAKi%IF;Py@fJjzrA9_x+vB>;+@axj822)i-%#*cSDC-T z5EF;L81Dx)Qhj+TfcfDgZF>}zxYWp|XubzmHFsIIJH@f~bd~N_!87?r|CDbFfl6Tc zyxY*X#f~aqa!eFc3&zoFFEe^Rt7Y&b!V)PVFWdFwMKKz2q1Ki}7<858j-~lDHVcm- zZMU)@F5*TK65>a}@by3n)LFKlx3{7qb%hjDi${w>vTAa+_!(5N6NgI^wl+#LZL6|& zGZBg3csFiJ9Yh2c7E?^LG8AV|T${aR$$yKE5YIgoIv<|+X7@}c7SVLX0>^{?ee}Q{ zL+G+0J;-SQCxq$iuU_OZs_&<;5n|39y7-7Ztb^#Fk5&1MuV)RA(aEq2%6sl=6VPatkK zdQOs5vOMj@=z=}D-|7P_wgx7+mATIBsJwV#do^EoCBVcnX`d>m%%h%le$OgM{!8Y)pz#R65B_TnedG;BZ5UA$97W%O?OepODDri;4_MYh5SYsG zFkg@RiF2QjO7pEiel3LEYK$*P2*@ylIp!srW(Gvn(Z_(Cdjz~(uuYeoKfO{0_%kI! z6XKA+jf=~kF)A*GD*uC4H;*ArmknK-0dYXnDYh70jr^DU)MjJ8(7acr*h>hMN~B;0 z-J*B6r3p$jOc#gezj?BL@&(~Sa)l8XS=hLG7= z$=lvtWMdtcERb7(pcXV6q@1=)gx{A0^Zh`Gk|MdnNuokLPV!gUE3gGk@QBS+%O14(9Phtw6W@^sR9JStWDM+A z_2qe+9wZ&nisBXHz9WL(X{KNovrJA+XM#VAaVgCv!l=}ZV#9TVH(*p+5-1T3!Ps4d zVP#eWeE!()J`;RxW86_j6=yZqQq5@@=Qeo{Z@*6Y9b4?9+b0y1y|hGJ-0uN7R`?my zB`9K+Q5((MaUEl;rPxYcurh@CVC?jzY@Jw9=OHCsI=R66-omkAuZzNBrFVZ^ z=Q7czopB!pEa0JHC}BwoZ9d=lqi!V(9Qm65daRF1!up+IIDM^F;fV;uAKQN^iPAb! zNd|%TLmgrb^ZJ>2#A;&Pj?J_YX0R!}tzFvA`}(u-^*$;W%tQ~8;ccbxMCaD&0^6&} zkD(Q>WKfKbo!wr#d^ji7-Z9yxuHo-4H&`1keek8H^qC7+$==vP{$)-hjuI&W1f^)6 zNoYU}{NtATzN|a#F}i^F7oNB>3Dw5bYjjmJ*LmG(!uXFM%E40NLc=!wYL*V>b6QPY z{zbRH&oXwCkUe(cDdg*?-T>kp+Px?!JK5A@}4pK2ebN;`@|*(2BuT5>NEH4Oj> z3rA~F*oIE+DD013@~I-j)@;6Fgf3=nj}ymdvd9P7n%#3Yn;dusYU9JMuR(0=ZC@?n zCNTqz#X=(vEBF^yb2y-Q#F+$!HuRf(v2zYMlG@$%TE@w)79*dL;0j}+?({J5Ps-(mGOSQ!i@ z)6&#sw_Ds)t0}V|{4%pSMOIa;cQ-DvySfMpQ|7iC{N7*2;@oR~zjpW-N4?@LLxASU8?eKvGHN94Y)v8P(K{ z>rWi<(ac=XK7Klzqw-bLu5TE*=3kuyC*OHDo(g^R#BKhWqyB1`F=+O)Zz zPGKr5cNLQ8g?`swl*HHy$f^Gl)S-(1$eZelcFvC=DySKsX&o!^T~!A)N#?GJhz+jN!FzyQl%A#E}mTaUmQ)yeg8C7+#P}A*j^$0 zOL#;+RM2_}G1#J15)pSc&b$#^NGE5X=ids3D=J!%i(k0{mqNtfEC-r!phR0Lkwo;W zO*v}+I(lsz&B%-q+wzEI5wv>xeva0PD&)8!l_mbu!$WPBq5Z~Xt=}m%w<1I%D9Iyn zG8SUusb-!fcfwox^+y-=6tZ7xxt=P|lNHl!$ruc_IP;R;(|r+d>|i);-z4wf!Ah-ks1d3jV3&&GxBk3F_&_xXb5w60fCig*!$RR3%q$*FF z{r+ARa;>K8@w-gPbYA8REg>5VHS`+!SUg2t5}p=?hxy6gSXaESdk`lDD=>jVv(+fi zn+N~IS8WEfZ|iY)gjz74>;GWYP=(N#%Se=Fs_{(YmL@#{*aRkrqm%fRgjr#%$7FCn@DHET(E zLY#~2c@(!jpAeHwf>6HjeERTzA>v<5mxEA;IPfGzs&g7@w#Zi)xiZBcj;qda$;Ixd z<$P91rNC99cX_=7Glk+3)Eu7H$Hl8c3g#E(?pBo|Dpd7npEY;gZ`dxvlweorjYU?- zdgSN8?Q6Exye{0Oxx!D3QL^GGAUii&kLI>4E+4m21qqr>NL3sTsQKw!8PoGHrCnHG zB}Q{vvFP94M%?4nX#nuu$GD8sT7KCccEa_-x-86Hk;h^3xpFOzh2v_)R;3H^8|L|s2SCT zJgSO38y9qcON@m;tMc9<(spU)HLl2;SMGg8a+{46|e$26LCgntU2 zr8dqElf$_j#&g>VYZkz=)tt;kc9IYzZ5?JK4`uoJ%=Ga8ZnL^Os2X7w>b$TR>AN2v z-eyb!=pi;krXnq+CL7Cmj9FPK(`^oWwWWmqUuGuxW!-kibUG|&reYDghjxVA1{yQi zHj{d7Sa5^oTTH6E31NDwrGp(gICY{XCa5l8{D0OTYTFWj-*(c5m@H(Zlb+WB3ecb8 zjXAy-_*H&jce8-Z(DUI4Vb%%b9Bh815^&>R#+1ZspnzK=(NTh>DGp*&Q%ZazuSBb? zE9b-xR3<0VGngnqIQmGycg3#r)@9V}$VEv8IA!!@KTI+{TJ0t^$#H-ii_5DSA-}rc zmdz+>=JKlla5TCITRuHz zKQeY&&3wh9S_}+dig9|%yx?lKi zGXiOMCq!oV*>sf3NVv#I<|!ojLa)EQ)1#K_Ch%+Vepsj(_%UqaPN`u%C3P-$`{FGECt9~ePW2y_64uMh&4syuYI1mI3jb`embQ&MnrvkKe)J6c z&tk@^i0$OyM}n%UqEn(OOa`ihtupi$J;#Ag4G3pA3}3- zk|=aC!wk1!tZE)^#CiY2H}|6}u{aDETjsLBVo4mvv-@x{=$mnOwT%J_EDR+m?C(ru zuQYBGoqBJG@aMu+)DKPds6~hFa1;CBQl5Z3_HOh_G!*eL8z&k1&sZ%65o>`;Vm}EB zVQ{cjfmu5p0-+i`W$G_O%Z;Xqb=BhZZw1Uv7Apn`SK=v;j#%ALB~6q_Ue$i_#Xd{$ z4!&pf$0jJc0!Y{+tkYg+Tt|B)YA9xuBX0%=f$TV|;@8`>hX=FIML#?6Vp&V)38IT$ z|K9tU>srVqI>oitMz=P&%p?nT2-|`SDVd;OjBrhCp*TZ+x1YO|&_?Lqp5MkloUF3h9yYy7piNG4chHm6 z-C}rV)x%2m=J#Y7Nc^nWuZ&lEb7}Hea?i8hgTtxCc~Lnx)&ec;h|JL<{vp7W&e^9L zyp$vfgHo+}vRC)~4nZ}Pfv<*NgRm}D!x#VWOgaAF0>c@(-dd#|wP(i_Y!6FJpw2^L zkyCBJ2^S|5!bAOC0tFQY{24JyS%#1*i5Uff0)dtSE>LN(89M_xe9H9Nx78&j-tf&Y zkFOsmxAW_JJFHoi?25U-y>Gi`pw&2OOGc9%Fg;C^CTJ|^WHk}Jby-&QUgvja5rJCe z8#P`8`WBfUk-m462PSHGOAI_!y0@o;-3wzNm9(^|sbNyVceOS^BpMIQlLhVjHJb>c z!=K81xx9quU)=k+*|{Z@vluLIf@DBpe-ck!7%=7K5#$T=*QP69eCW)yot}M?QA7OI zZ-1Yx(qU*=m(2r#Z8*`d&F=188cBaZty?3Xj72-XjEj{K9iE>vnU#2(|A36e!FC<< z9hnB5utV*3P-%jNNT*5a_gbfG9C4J&VoMb+&n5XMq^)Z>SRtRS|EAafjh$4l!l^8j zQNpCM>QP*9EYUbAosofK?pK98yA2LL?^($^#ew(HtC2at4CzveX~`|6QOCc86LoS? z`!MnfF~CzTXn_<5qo<8R06|==jW~vI6UhoDss&@r=2Xt_eN)BaaHgg@?lcS``$a^L zxbEFxG@TECPj4(PD0kkL;M8AH(zp*pqPT$aqnZ9n7UlwQMX#!unheffy*j=hMzwwvd$M*ejLaqpi^rXfcS-3A!Iek9FH-}oQM&jEcxb_Br#!87D(|OCW+|CS zA@qFg(N?e4A5nb`+jDEN^SGr9ElPXGwYiM)-1;Ybt$JMIT22=Whg`jAL7%sR@lm#O zOh@)3BtlEeW?6KVow`y3-yFZi@$wmPO2?GkFC9uA(Qjz(J(%IR2rAaB^HgaP(0N|& zHsLP8Z)OZb)AGJaGm*_I{6|pMkdL z?rqlF45_PsK+kXX>=~3lt2~m7mAgLFYdLL>*l%gsmmd=ruu-35V$&*S!du<>$HbAvG0b@j~a<2=+JVZ`>dhcaXAr+Z)=H!y-?#&L_T6=~)#g0Kh&C#sAgO@z7GLDl8BOTU zjakd_+3{4%cHt5yU4to2jdwTE%#k%d2bt* z0!pMdkdHZLeinyQjvXge{^s+#^LE*bkgU@~<_ML`;_ocuWvcJ4eK*#yGlVE{OUvR; z1L&+oXkzsT3{xiTGBFIvo1E5IW&3)nKlzmDdA@J#FPqkHAj=6h{k{$AFnumhqplM6 zXx7+#N6qgQn@5!3v{RMBU1WO4Sl78$73#N{cd&^w*ut7e>>3-vo-u+ zXNn3-#bt+DOaqGiH`}nJ?5ITqrX*)u8pO@-!1-%^0f;+i=VOa5bOC_@`99%;gZD`1 z6?RF}_s}L|%bg@p=Y#1cAf^R=opDviK6(T7wCtSVZeG=#M2@<>yImH-it)XCMypB3 zSNLi5Qn$CM;8|jMXQOqs_P<RG}q z3Uyj~UHy}u(!sVt>l2dwAF@H6j5LKSjrx2R-@D%919j+&`PJ}T7SRo9N@h4pXj#u;0=>1_MNT~jJr5*K0cy;g^3`!wIgyGaidez-Tro?(d z!!8ZaX=n-jw%^v@xOz#=#lv&|wCkKzXbLT0FG@sc?CMytkU@d9 z4N9+;r{p@v@I{@tht?ZgE}G<}jdU^3_XR7e1|puMb5V?6E=1bRWLqDaUmP!;(}NZ# zE*RY*TJBggj*`@O4WPkA8srn~K^=lgfHTxb)Ws&M&=LvVvZJ5 zOCZg}vDDU~rL<|Te&UtnqiRK7C!_ffSe~lMGQ~r+%=Tyy7CwUI{Nku@n0Z!k5SW0( zu07Fi7M1cZx-RaUPF6;eiXmGC(UXlxl-Pk7kCat~)6aiKH>@}(>(48=M{HijrNt)4 z4|DB;C*WyU(y-u`1k*6+5^I$HjWU&G3FyJtn92S96~AeFv@PK>7& zwzwpXSH30myBbT|=R$1!iD9^xwDQ3^Astnjsf!)~hj7O4XQAv&o5w)8N!+6s!7y`t zm(qPhu!R54N^g5J-&xnZgY)HS#|(EgEwK?cim?YOvYC|#0fFyjb97+{!QdCVzhQMX zDOBucc>{*q62yP&upze;cY2l0UP6KU(WyI% ztWxtr@5=X00DEsInIV|UQcOYXvfV}TXg9{Uhl~V72k3&BUfPcgov6*F$v}_XM3i$f zezdWNAG+@%IxTmTul)eEKNvFNi6ivkzIYbY-1m+oLKvM7QY?Bnec19tt!_M!VriFr zuXc;Y!t8IFA7*nmku&Lg0;b`#2&`BAj;ABFuE$><&wk8z9yOjwx^O$4A5qC774iod z51pOgxOOc4hDGV+_4PJC|0$Op0(^OOa`ado2S0v~DSQ&M&onvH?$mDgWhJXI#q_r%gwHl3zz43E1L$YSHzqx!dwP6+N zH1T`3>15nt?Wi_s#K^rJZJmn7C=o5bMYZ$%YHpjQA>a45;nC*do=i3m5={oGH8wC6 zm8jjmO^WTdBRkq}@rEcweK?96o3rLuH}et9x~|ORzL?r(#C<0KPA%Z-YL?>0C{H+7 z$ik+GVahf-dG7J^m~iOlTCKLq$FCQGs;uwVKXxrjYYSq0C7Vws1aUMq?iBPsEQ`>b z?UOtA=B6)$*}}tc9_Z%kL?;oMP^1jgu602fo_n9~WV8JmF9ok&72-YZ*!d-pPp_tX zVh5UH5Oh$s-8t>tJ_?MT9b95!!!lzWKR4JBp6N@c(rBYm|6LXy{LBb$ggl#ST_@k# z={WE`c=25ph$DbM?uVG9;)CDuISX5)s+)O@3|y;seYTMfMD)9^lI+<4o)1M%jdbjwCAE$l3ZMqG6B`RBo`FID7n_iACs ztM@lE+E|jL9@KLJi7`~$UYkj2{F_jR{DJ400|w~o91aP4-uoh>hv%4r{R6{?4%el( z8LEHESDbE(-EI%PD$huu_pOZwfXr%#@nq+9WXBJ~11rH8P5wEki$q_|Nc9; z|0pLQNUdJ~`e-t?!|b=Hqg!^J%H?W*`fJ_ZtFQjSmdtFnt-f%_vYq(CDxTl z$1y9~DnB8P>cAi)k@3m01J}Fy@vWuN&Z*NH8n^6E5}p|Lt^l0N=Lt|G&j>ub^X@-R zKptfc_mUeZAmTrZXawC(#ZdJN!#|r?R~9w6+R=V+T@S3aYP%xuymXyO(h_l>zM}RK zY&ba??>sgW=`z$_o2?>GyDuDDN7HRQaC>3(M>yo`dPT{BAWLA54;hfBrs6F66LKAq zX>-NBM6R>ug=RpxB>0R!a~xhkWf|QqViso+>nB4cCB;zfQu3 zUY4M(C$kdBfPmgj)3jN^n=(WVYA85i5{JPa3@gH_6-R+a`6i6py$)=oVEiEL^U*R+ zg6KcjWdx)toiiT{?$o>z_A!3Ejiokd?T>Ax@mER2lg>ZI#l^tz*jz7de~?Flh&u%U z)gtfm*V4Yd)@^^DvKN=^Sx+`1syi7*t(8z7jT36w34(uUrYR1*He!8I)U~QFiKaKN zpsyn3Dbq;9q9x{wb)CoVW0Ou7W#d#k!Fm2VCH7)5n z;BvebaGqR7>{2={1#-kpZbn5rVp}aYp)4SucX2j-Z^&9saSb;~)a9PhFYrt}t zfh484dY=2~IohmkT^B)x79j$#p<~h$s@fh+718xo`kfUv#j_07#+R&nW}$O7EAC)_ z;9LFmhdq}$)5xQ^`{b9R>qo)YwE1gmLiZD1Wo`!)^{xjUXLpE*BG$80vXxGazR$D! zD>fA6u2a&dP>zml?deAKN-r;26{Bf&{|_D}Rs+KAfwsy78V2mxsOdmPf{!q{uec~h z%T>??OC$BDv#h@oo4*AGf{v)Yzl6E)Dm{#|dPlp5Q38CP%gXiago-C3-UP)cb2w|K zaZdZo5!Ng@55RTGWDXGByPZh2E4O25Gc?HYIZ-*ln&v>n$ZkJ%y^r^*B+Ayk*`dEm ze`(zUiZ%Pr;Qd}eiaytUZ;N8c=MXJ|k7(c1^X0#*tK0k;Pwk-Q#5WcDaw5R0fl`C_ z^}!Mog)JHKL+C{&P%~m?!QC3fB+D&F4)EaKzrp=(FHVf22(Jo@*@YM)bbT@hy0c>D zRPl}Yw-p1NScX=mpub8%MGnfh3jy+}q5G%e@@NoFLQe#;CN6Ba#Tf&XuD}I7uA}Jp z+{Kupe~Mf|Khn?!17X4vjfqo&{QdhAh=OlcL~<$qxI+3WdYjQGwu z5uoC>V`!vY476oj+;oj4Me@I#=;h^0+&Ra>lu{!|k#V=4n@u|dk+g2DYW4Ih998kR zJtc&^SIOwmgT+~z6wMJ3qdQb7)96H#gb%0Y49Rkn9-Zcs3p9pP%E-Y*_xJxQafUJe zL0cXf7r7YDR<+|wf!c&Zrs61@$K~*kL5K=oiFgYbMnw$B5L6Sz%QL<9ZkoL59>Pfs zqBB?ty@;sN(0zl&XAF zqWektxjhJljw%oiyWQ^A!{Wu*q*tYCM%pEfxA`y}Hct?!P08Y_%`rMr*`{@wK@^A0 zBd=VjiY4V7ui7=EIdDCy!z(UH9Veor`i?r0iB3s@aG6H%QcL@_rV`)4IX^!#;tYLz`RoBVyycbCJ3D>B@jiJ` zM3WLBrZCh#7#Xr4i;Ehi~F z?ej4iFU2p9geRTD)9E|bHWC&Qjq%=NE;YwNQNo{Nswd6cFa$7{s(REPP!KWU=yX-) zuos`;a0+OkxICg>DHQ*mvVMv$s2WMuR~1EBH>gApJpymP7vMuKQurzuj%h0~uh5;z z^{VxveEh5AJDby+SDr1rw@zlbSgcB8Ag3I=Du3U$$4w*Ub^rZS{!cftU!WuTvYxz2 z$tT5lF{<-Gu9u?PY-+&zocwXc2^R04?>LP3;gsLfxBra(T=B!Hh~qI|fE6UNnae-& z^1gh~k`(Ad^~7wnQP4Id2Zq?ULCm*)3q!yA1v((?fFvw0GHxf&ER z*4Lg~noUp7vnN1krE1*I*72U&`YCzxCy;QqeZ?ANN%1Y+SD=UBF~@xIoAd4c7Cq^D z?9Chvy(+EFXjbTQ3Mml7YKC;XC66!P*+pLP{$Z9^ZjyMOS`{n6Ls$vRjG|CpvIf#| zr-obv|E5EF)Gq{n>rDC21>-N7KZU?t?gSmIR(T(_pFX={{$gxY@3?-xW-fC6S^RXl zIR^#qJdH7Gk2dQpb@&)kS!tb(<18FQ7oNa>^gyT zKLMj^)FxOyq^R2kdpDcy>%k9FQZ2kao5MO|HTj&0;OH!w9I1@39M0p*P2?~sn|2_uY$4pX#UTx#J#vLKRgk`GgdR}x8KtYM@ z-j_b`Fg?HjfXo-S-b!QrM!h_Cdcs&xz=@=3HW$_+6ElC5Pk3ndGDD_SB=#ADsc+C? zF7oWikL1uE>N)BdPa&GS_k7?G&zF8V>|>Iy#UQ0!1T#7hVdQqSOGrqMbTFg&17ZU! za_`rPzby%}CS18UaW2HL#1Add)$xRUW8BC1 z;wx7q^mrCvzB7(&H#RVGx`olU)3x-lv9+sBT%4f?K-B)l=;y8uExXT}LS=3Bold4)XH7v&o`Ke5>IL~20^Pk|uRa_Z!T3Rz*zF4firkYx8SrrWDBYL{iy#tm2LD5ye1^%6cR3b4?%I zzP?`e)tXH(=wYJTShoH=AwMAf9{snmIjuQgeGLzr&Eu`6G{f%G(N=J1RV90_@7Xx@ zB5T{!x%x(vd9|=g`~q;d-R0fmY-?Gh^s2ChczDqJbjzVRjY^PMZn1gk^O1gUP-Ae` zZ3(=m*-_WvcDiNWuq1Gl_+N_@_%Z!2=aE?d7&j0g9i9s2A@h)_z-X9%=oES~zY~$r z@cgo^V~@GyZ{o~MqDX`*k1fRn-yO35UJjAM8qM_e@_vM$ILrq+%y-r)pJ2@Te$zAH zBBMxZ9lrsM#y+~N?5kttMqtAUxx`PG9zR>eevcAqaCn9kDA1SJ4T{p?VniUVbsq(m z{NgbrQX)~}n#V7H50h*D0VWCB&IxzNzP|$$pyG|x@vfCw_QO&ru8?8aGrJ{w{1E-^7 z-C)t9=Iu}=hA^bTmTpl?xYrcioz&)TC+dSa%|AUfp7%ru#bH&(^!CWWs7*+h7omMR z$plLe=k$1%bD!YyZT-F)99S(~lSNy=OT`dp&o)yp=e~)?X84;=`o@Kh3Jf`idMp98 zz-naOD3pQp6fC0HgDpGy{Oz2E;Lk9DB@~x!320)TP5G6YhB_rVvM4yJ0Xu+t1P3J@ zm*);PfN7%qK&QZVmGL7>WvK*i29Z+q)u)ji$F6mQy#65^@mAYtC4YYkyvY{SD)ZeH z`a)G~M~K$1)F;@r$9OiSMd9t?)QETAU-iO5oM|P}1kxWR6aVK~)n#$$MDS}(5 zK{-}g16kPOT`YvF?#IvIZ>oyZPCR;tQABrGP$zjQm81Qu*8J(rL3jT!-xebu&p*el z$Cnl#dAMyoc2BCf-_2y!?sDiD3+AF5n4$KKmU2NZonJeyUz42_KfJ#@-17E3-R;HX z_sSm9X$~Zcm6@b%~vE+qEf%cBl+sCm-v2#3@AmU#J77JQf^0|G5b8`S*0|e|P@>`rF5kPUGN%I3KDl$rl4M z)|YbK(ARW?e2dA&<>hu1$*9>{t8bI#MwZWaf!)`(dm=TI)hNGq57En>7tg9_?05Rs zd;7IaWhEu_aUTgoVEsQcfOEd@w;Ve*1EQ)T&$pWZ*+YhYSLlbtji3q)1-Jm3B#tuL zTv`gTa2$QOKJwa(<^|}5eJLiIB`ZQ?imt9aMsn({|GCR$v_gn|^99MW#U3`#8d-c_ zhWhJeq8a}7{i`0U`=jU;gzWwFwO&{-Y3yWNV)L$h4?q*{2ecvyLP zxhjPmB50|>MHe6%gkq8F0ouL*AA5OmvDAXthzSq#6{UEXsz1U{ep+zBc~<2?8Uzsj zZ)#Z?~{nN?QN7SNZ-EkRhCzBtQx7**qRgGmq4u6EIZe2jON1h8eF_eKGpcY}%_ASia^ zYPVQ#u``^?+I9*cIZhv*{z+rj|Gl{Ecw_rFuRJ+9INJ08WI7=A#>^}~RWC~MSIMrQ z+|L_e8)Js%*VQF_wj`8d@aEy>_9^L}ZNH!YzF~pJnASPT%$p3-($NtzF`V~Tep;63 z?Y#lLjTvwY{Ab}ww;l~kPF!(5Pb{Y9*-fy&O*cnofZ^1=1vW_%=1Gp1t%E=Dk8F}h zJ_njW%Y`{1cP}wIm4FFc5%X*po+Mr&=hbMRi#8b!D9N+=?*7xjc&6Jk)5W;oQ%Oqz zHszPDBe&6gpFbrawYkihV_=sLH_H2Tc3B8xAZb%OZ;$$JWay>ZsdGJ>-RY~?mDkYl z1e&y`fi@k>!->O{VtZSe0?%6+eR*kV=@V$X{8Yhrjy^DUgH7woF&3a)2YR^xVUh5C zi;K&pli^4;jw;OCT=0=r2?aP8OFWcdr%DUr-3+I!)Kq}+b2rR6CUh~(X<=ajvB+z6 z0ffA+j#nPgl4ruC^Juj4nEPg0yr}S_VZsIt{;yjm7&3hC0%`#en~qe8z#nPQl}JlB za7jY43Xsa(-+MsniVeDuPgt1DOZA?P*TZIujCFp~YpKKzbp=k;*-mty*lDWF?Y;G! ziuxo8vR!O?PFOV7G;r=Svuh|*TF$@t$mN}rv;@wiZ_ZzhuA{k{yRr6i&`_Dww_hcN zB@}4F=<2eur)qI|>eRUM+lZTRKZq{EBp%lR|7P)+RQtA%Hps7t*am?>%(8u40Ry#r z-6(KVGDN^pB*Lp4`DQpxaWM~ljVergqoRo;3J}en(g01rtAn{!=P7xBX;ExQ2=qgw zcaYaR1Q0wR`-ywX2%7U^xzgD9XJBrYtLNlK&yrP8ud!|;VUg#}G$|pE>F_ru44A0d zmL8z+I(m1RV^3=gF_eo$xT%UJPgh?E!YkN*c59~A8pGq-66wq5;jhwh^j~NGTUFvI zanxt@YX10av+~uNs!8tzoe-j=gap*R$@0WEA)sVj$KYdcXH>u(csj|&&QE6n5?J4v zF|2c*?+k-YwAp_t<9iQmaa2&0H+)@6>H?8~gr0u5VS=xgsyb(XbPW2lc8Xe6EH5E# zh$P4(k~->=>px@_LHWN7;c}^VEVtgg>EQ#)Zgq9lh=MS%QB6gaDc_Jr{yFMT9O4hXoY=z?$e{{Sd#s=O1^l_G^VtgBSM?ugvIcgI{i7b?*0D z{V9sV7g}v7K*Cj9NW(4w;#F#1Rm=FiHMg+{F(VmnvFlYo}v>JzD%RGBP3_HqFIjHCui+Q{}tu*gTrmxbwOB zbbRnmmPcylu_nRkD_*)=c`85w@86XjTOC<$H?^Sv@p5WSeZH8TRHK%3y0FShzqs7N z|C#WHtNX26x_-Ouq4Dy9-R-xWH=-wEJ}cZKpWdFLr?I(&O^I~ejf^Rr%-3IJR-7Fa zEibY@K;+(WA|L(md+#rvk^_uK;U8j0zRuRM z|8E`S;w2Ye5}eG$7nKFB+xxgVf%@4iZU-gWFdUmk3O*FPoH)~|)EUOG9RV1B6_xE) zvHL~8)fR0u#TS*it2eX?8SMhWl?M$r0MBH5dmG~|kM(r1G7uk5J=?#3u9{0vN`lZu zEFCp4$mUf$X^ttTjo@RKsxEGfv#IzhKt`ra~-79KCv7)`WKIZA=0|EV1<{Z z{A-jIHt3iYXhm&7ycLNks~N?jtOWC|QBgEG?p+Sc#-0jCW#gNYI}GiivNY*c?~5@z zX!Efst#|WH6nVy@eNUt`g1MQAyw^anZz@q zeq;aBaiBZyWv*qxt;E*kr{`o7S=-I1cISwmL}99FJ6;K-+S^J~MU_x%GznVZw`S6!D>O^YCOf3EL#bc5lwu?l%UmJaSxi5{4K!&5ksshzdx+0E}g z{07wi6uuNRU*|GHNeV+3sZJiKP)&oos8wT+|?6ufO24&mU?;V3{#S7 z0c1A03zb;NzM?Fd2r2=o5XC!X5r0WZbEml)W29Hpy{n5%wh2?rdKi|qD^KNwV{@}E z?g%WTe&pw8z{avGWrrcGsS6<@9&vGrV{KgyUTHb$Dc$jHj2cmVi8oY`bz2;0qF=TD zZyBRs$GU3z5e3#TM-E$(w|v&zDt!Y+HN}+!KN$ti4BjTHHT1@&hqkSOi?LFW<|O95;{@y zq3qSSq!~s%#9XD!oHo~ohggl298@mafDEwIed)mIB?E2=%C2KG2Pdb>kjDGhuV4Ve zZM)~yq|3_gMM)_G7#O}AY>FVv!tF7^HcKs)@Yv!7MMb;Y+rS9Icr`Yy1KEl&o4WGS zW&mdCB$Z`Z-|P;d7!*n=o05;UcV+hXTf;VXKiWhNo=NYZJ8AdFW({mQ#8F5esJoXK@t4X&`|V)dzTs4{vga zYXt-z!gpY7ag-H}fm76yi}447fOUT}eeA9%GP264J*3x=JUYOy<8krvO>4ez5zEuzZty8Y$AGb~vK!mp z`)DaIgiKEA&HzGg{=C$}&7}sxh&g9Tf~esKGUq-3V}v9|-N&&s_qkfyXBFEF>9jBP z62@)bp3W^p$d{e2YaMj8E!UTFzO@;|Bu(eWLt2J596{v$nB#hw!B6_b#jjEbH7(_n z(@u)RH%f67O7QsZx&7Nr6$F^?pY_)`uL<*2GkqZ-fBM?Aj^6~e))a-f#!vyTdrp-N zIZuCs-I7?5<-3lu$hp@@ZzzZlIrG7y=>E7U?GNc=-q@`xWaQ*k4bLSKuy~Rl$IZLG zFAuAsp`mZ1`(C}FNs*%o0g9{1K^Bt*zkh$sR4`*BoR%wQ`9S&Ubq`xa9uVo=+x1)! zBLTo^`{ksprMmZFO~32meD2)Aj6%`=Cs4K)PNqw=!H+aV?6>-Q4bT44$(q-mV()g? z{x*9qva**~>x6mReWuqq&}rch)iOCXk0Y60Q-V2Qm)5nGS|_)+jVV_4)^vv zb~D{jD1k-IpD9HkGyQzauqWhI;M&cDm#3$ewl=Fy)A-7Y&w4jvyB-KY!7S97bpn_l z;9*vuuNx(m!AoDNHf%LHF4Vb`PWYFnVR9m6M@E;b1z>~zwL3OVPn9a$VKy4F9qs*w z(fUum9zYV@o}_5P96<~Qh8sX>_s!3LNfp>ZSIrGMEPtn0K}AE8jv~wjxa5y7lZL={aeRDaBko@-pd?U= z|G~sC=8;qewnh{cW4jE-Er0lS>Q~M6_w^wKbwQzeFl?!EXJ=;spIXT4+FDw=ACLmi z&&%`l@*)Zu7#x(5lWX(7b7UjDbQi+G!2v)xu|ns+0mO=UF18Lg7QxhZ2@ z2@MWrM+dejSoJ%sYraei4P1BwK2WY%=PaPhMyRSG^9wrhr;8T3q%}ZKMC?(4e_jFw zn=<~7Q5RbxVa3m{C#L`Ro;OxZB<@{oa>mBSs;am{wM;{RN!NQq(??7*73P+f7>78< zF8+EE0BfeeUgNU`+%S;B*~LY-!~5=M0K9FZ*Lrub(3p0`Y)VRs#S}z7OGtABynlwQ zXYeB*`J!>}T-tum=3UFHLaqX!02hwRHSU<~&z)-XB?}RMHhOjdUNB&BLyixBI-FKc zJAeQFosvSBwQHh@k3jkE-8&8r$NlLNz<$6581nlh07QpCXsYI9Q6>(qHv6K1?tq5R z6b4+;(ZXKWOg(HQ{k^@t7F@(Y0yP?V-Z6}9_>22B#-uKC9!WeMHrx}ryJjwha?W>^ z#r5u&!Ig@`+oGBl;29|8LQqx|$7-LDpy4qwv*uj2OvrEnqobo)Sy?~_0NNe+j3MHL zG&X7|f4|rrE3=x_@9@^lpQvUM1R?<7h%uY>T1UgFoRZ4cc6Q0{U%~LjsNe=;=XDrp z;xD03z+Y=4fX6xg-nWwv`f4f{=lw=EMA>_=Lg`^cRl}9cecki>XYJJ>(O{Gx#E#hV zZxgMkH2onLcT2>Y;r;_FniM+NxeJ1Q!VtfKG#_D(5K_6@6svQdQjP?TB7X`!CIw2ZagP9O5;PT|Vvd{mwX zYrE^Bq^j0E)Z_3L-hTDm|2~94hz67h{Id#c^y}}0JABN zuD!jTl$4Y#R@$fk;3_0ISW-%=R99lfmbZt^vpvf&<@ngvC2%SrgP*NO{w3&=R2Vxl zx;K(zmdtroO{{k(IoY@z0Aau#%q}&VZPo@85ux$UdYtTw9tT-*;^Xl~xasV)M5A$L zbslehy|^|(n^SLqF0lV%EuG9rv?5?xf-*tN1e!h#SOX$Lo*nmO-tWxma_ZX7*}dTwRy!)RDIRWQahgEUoX5+@|nF{9k`$Ew)h7 zRSf)0j2cYlu@y&~<^B#AwZ!7|e0xY&7mz7H3=*rFJ8*4X^?P{&xEsIv{$6P#rU?VM zI5_JUcS2;b?>`9(3kQgb;!0{Jg<`zLCnNJU!flK0lbC3*Fzj>s0j;v1X*g!BtR`~g zNlvu+IPDh#uIDfspm?=c`D(|bnGv5h^<+wmlZII@F5UDwW9Ou;MLoD_czOA7%-+gY zE`*c^v+Xn6FSLx!uVxFQRPwt5u7?$VFFopFJq~bl-v1ACZy8rrx4nTbdIKBTG}0g` zDJ|X7p>!jqfOK~Wh;&MKH%NB~(jwg@-Q94P?|IMv+;8{m$<9Ws$ zPkD~jR`hsTxgqr}K-nE|QLnG9fpT3rlNNt{yS6sTv%YRj zVNkRuo8C`^0tN{q=3!xCk{?dh7&mXt60#kp4NK zaP2SlL00jw_4V%!9I(X)PRxehosc`H+fbL}R6eGTPiwu9(LS5FeE`yl8hbp&2Yyo9HBF%Sb-su0%+3o4g!y~9=4Nixnvoq+wKt=N7<705;X(a@7 zQuNt@N&(Ew%+PMa@ZOLR2=I;9ZVhbhfBeRCrmQ916Q53a*S(d?2Ga77c4RaPbQsp`&MXJL zUYoY-rqQ2g*zd*M6J@OSpH6#6QMi_57_^kZt(`izCmUM{HncWm7x%yLqZIOzd<@!0 z6a-(_X({`n#C)@kUqUhUNmo^qRe@#U>Z{uW?nBMywzr8_gNfBY4hBz&)c3u(=4YDBXN!v`T5@{@ zQIZ7=rM0!co7Spf0!vM#DWO-~t{rTzIV595T-HxgC+EL178B`W+sF}p(8Q6Xcz*ZF%bbeA>~F{oe3n*LUlNLQnTxToyv zX{+R&zU=t&NxZ?=+cb(ns4pROILSyR1&^-QgDx`irf;7b9)`WK?-omz%=gy*f?9!H z_`;O}H^xsH!q9WnRY3vzuN9G20l32T@3t zL^&9uY!L+{hPnuA%&f*uARWYT9B)oHKrj=GV9xIzXk&M>g2|G>rFgvBt&}0O`1>~~ z`Mi4J&W!(6ze2;DMs0lk0J~J@vB5>>C1x!86&d~DTk$kwpE9GJuN$T*H5V5fG-`@~ zt%i+P+d{gka+`;Xq)N5rQU01ArBiybU_=~-=>`pP=?KD)4Gl~shiUw+ME(x~ z0mzqG20lQ^D;%d|UUM7**v%H1xg1Q@()^viP>vme%jDk|DbM(9av+zcXR=N!R~btU;ceh z_D>n(2&;9-C}T+>z1FAd_)Qz~_ay0OEBRYjp-OGn??*8D$Es}F+}uZaPuRXe> ziU|nGPPGc>koa81#NjbT2mtVJr5}5{*MlX4gL9Ro)p3hZ+Wo<8JImwQ{9h-_$HxZ} zPrMPvT6OjHJh*86)kAivorZ>le}jmMX&f=BNV3KG`DPGqQKmniF^&u;d_~2;u%okl zi$7Q$L;bOKuC9(dTngv;^Bw1AFQE)-nOCn~foX^!p8=>%$=#Ku4*)PQ7KXtAYw84L zDdxz)+3)_l&^_Jvby_xhYU)OcmD_L~sVO)vnbjkx45$F$X(6hj7z!9_rMKP^m zT#J_$pZBYs&ae>yInkv~nhlhLJ#3r`bRX;a!8{sn%f}Mo%4feTCXY>4gGv$MI;yEm zHQI((kyekFkSSYpDdt}S)K))B%4a>j*uEbWoyxP&|EwZ{V=6%h+kDRM>sNTaiRUj` zNqi0ZT{&wN(Z%XDJ*N@_`R8kwZh9;-8OhcPZ0J!s-z9xCTP{zNuZ~;@@e@ma$kG2S z(b9eftdO-#G+A1*d%MXrF2xw)0z-{*>sJX={5?#27`1a5Tu1u@D3*ydA^?4!pMEsh zj3N*QL8cCZQNYfxS^-~Q1C!?$E`IQeQ(yl^ZlnECZ-;Y(dlh0>NCd`65l1*bF6@7J z8q0~`?pjznEOqMi$Lrn9cqp$rXwu@z&TlzRI~frsyS|X*>uHT|Sr$u2=Xx>{(W{a@+rr2JJS9TgVX&#;m;{JSU%DSXc;3KWZg#5rxkg@*bbGEiUB-&@t;hoi*qKFi8LwCS{;@ zGI!6{{O0XDMfQ+~{$f^Bh<}@~4!p0|v{|!KqCUHHVn^GD?ZWc<+NqlfL;5BwMW8ZQ zCmhJEH=`9(XdT=%(=au;H9r^?6FF753i4puV9Vdu6#|CD0tNG zrSZvWJx&l~BZb&AKQCn~DOk2r?8y%az>C1Lceu9xuH5Di zN%6$=WbP6~VPn*${F6O+)1OG1EF=pKM#}Hq!(g3(?qbzl)l8!d_Vf~fFMNsjOoh8B z!!c3%O9^${2vbw_$p3^*4=GSeCeJXbu^@jDQ{Ur$tWs`VKoa@#GMfl*G)=%s+Sc*y zXR(QeBY~6eceblKw5<^Rhmf;&0*MX+Pa-Z|ojkIkSU0oWyJ$G|6F&^(srhC%jDlM4zX+>e|-5 zk^FRASe39U0ytJ(*W=pRUAq<>#~U`D`uLG?MNa`_|A+ z*(Ay|iYAjChL4M;+9R*uO9bNsJAvY#oN5Smd?J!6Wr zi_DJCX+kZXuf_?7U)YTGTxiN>E(#}31ffi?r4r!=7UD}u@yJCKSYna|G7vin4JIv9 zdHP1_Gj&=HoJRnDfawICY(T%2 zIgbvKT{kX8eTaEBzi7y{Y*!@Nw<^^ilNkFR9}sEz@qjht;=IA*y+<6|F%Lxp;zye) zS)WW5G#hZC^q~vW2614sjO5DW^1<>LAFbr{(n5pNp-Sp|w7=lSVTFk_!(Zc4lU(dJ+LME)*=pHA(t_b9#H0!ESlCLJ>g)P1zcBiEwj(mKq zu&Fzl+Ao+UB&xsXvhNn|kz}L{QGB?08o%p3dQ_(|aFS9K_BbppwL^{t;49MPQ-vGY=0BJW230#lh~b z`*v0^A3uL2DgV^e6fH!|)wSWr`&UWwS;~dY&GUN~`Yo=YAnp#h=~}41!z6#rrF~fsD4WCRQt}A2FE>RyW*OsVf(9T>XYBY#!HA_n1hyd#?{@Ka#DLkJt zTpl`_+djC`5cwO}t{_;LDyzlFR4|)d!zlWP+d>U^P4uUo(e#p$r$vF?t*HK|vHNV`Yk#1_^ zZA`ko$omoB+oBp!lJ97lXCs-fPu~7MU8vpFGEazga^@gjG~bGHT>2HRdq3!{NkI8@Q&JHc3U0l%uB2T-5luZO&fUp}y-^8xFFU=JPn+ zCil@HVmOcZ@)a)Vr#vn{35d)=C>=9s!~rx)pUgymDoZzfdW>sHL;ns3?P4&TXQK-A z9PyPX`ZawQ!6kg>xRx8ytEc8%U}iFv!;u}&5=B!C16_t>gKfh$!Q9ZoXDvY+g2yqu zm2T+?5tymDfRM|N!pi`ka>3nvV{%2E6W7r3i>sHIKwd{mS?a;X^wJS$nD*`UITt#g z&*^5Kwf`#2D`NF{H@~Gs=W@aXblRW>FR1576b|C8g9*&wVVV}(RWUX~5+3W+AMaJ} zKtN^!)Vo{_Cg)2V0ijB2DylA!Ao&y&_ZCdX!#~%Lm8n+#`9nJyXQRKI{4^&g9+(t} zmvTmu;$o%Wo){@NtVPuBVpB4XUawy~`b}LquC3J8@}@-ty}Un2?0sE)#cQS{_IJz= zDfkcU?ce{Vj)#Dr=WQqkarH1@*w3sz*-(_-Y3xEYo*`e%|7)dL(oQ|mDq!umf|~~o zoBYTS>wJ{+*&ic$t?1_(nr%YM`j>OXS#?SEc|#hy)j4bx@UHLPUIzKQiDMLSm=k;| z)Kjniq~Wf0%e+TtIf#FkzjmMJAxe;u%$;P@`f8_~kuk7r}x8;ULN1aEwrMT3zSd-;F`v%G%o=#=f4ZGTh+XE_nDa*0cPNb_ghwX>VLA9pAN#Ehr?`GG>z|F2Q4qTe+@qYm47F^Z0BPPnU}>@VqxKn^ql4{$Kn?RL0Z&7N{q>yTGvv5pS?KUKO!cjWv>$ z9RShcQuRGhK@$3~HTHP(wwV59-+M)OfoW!Kjy zZn=qtWYd%MVTtWKdx(j3d1>a2JXj_s&MB0<)E}%}L4htl`hab5Juj6?uMmz0ZCc0g zdkutF36qqQ-XZ~zZeUd+so&MHs~%q-j`_tNnOUD;-eJf^@ZShI{PNN{=OkG;V%gM| zs^c`%NR)$JcF=!*x@Zi6+$h3C6v`)xVgwI^ht5w=iGDn%$2d6Ja2J&ga5n?De4zBOy8utYb zPK;uE`if+%#~#Eh=4!Mf15Q}zqA)N~TLJ|=3dUwitLeiFbT42WiczW>o zifmC3#@F9JwIz|WLCp)J?-IySqS1b!Rwf(O&(=5#WU^#_od>qp7NvgQFAHssU2J8i z48x6d`-mgza8_zz_)edK{^Z=z<%h5n02Ojj7W)#b^sz3$-`F}Mn&QI zokTF6u;5jxZ`tR+XslN<6pmtB=wWl&Lv*vO{~ev=bwry-wImho-cX}d-bT*)8$tPH zif%?aO1(>|lyA3=L0rd&NahWcmLv4cuGYMj!W8~fAJPTH_*`a}xsK~*HuhCY-=4RALbE|mn{BwP@}>S$YBSoNp_aqo{o0hj5bd_Nd=O~eV+c4#q3=b{ov{T!IBrTa z!zwrkpMlnWIY1$P@#HjHdxqJUF`V4A_C)Rbr!LI`U1HG{L8-n0{EW{=j}x!N6YdFFPtbEPe6Vo@a{+Rb9Qee)~5!q6}9XqjpP{m%lBXgm6)<47$bckFxs;1)92pXfbc~_!n+}ySAJ7h5qHnK z>^pEWGwWWxRYYJy0Rk&Q--8}#M3{h$Oo&g9L?Ht4CBk}csJY?_0JWoJM&%z%B>s6+ z2qoutk7%eCe#kQjTo(Wb>+%DlD4SZ5M%z!E&wqc9Bd0|dk(}Pa9DG*i9BnHGi7M%R z!4B}$>pp}&s^vw{{x&dk}uE=6ddT7 z!2kC>8l2CUw8Bhg+S0Qv>Xm}v{1=7((ouic(_S3ZC@MYs-+K#elmGVXpX-9({s|EO z`4o`N`}b08&;O~o0Drr^ZMuMR!uJJzbdC4{{Xzy)jTSYb>@iaNi|axtbDNx&(5E3F z?{#Yd`}7Z?H0Kq|O!Sq&v{cZw8~<=O{44&aTDRbZu|{*#-fGgat8FozE2ie~oW)|^ z_h*B0?COUuKChh?n|$^LBtb4Kqj?_PmRvWbs<1)jzDpPyaHcMt7+qDR*keHV_akFh zYc=r+h$Xfe#X<&$hKCg=3=%WySo<}#c3O7QdwYf!@RICq@7j3{m~0LlKyGZ-I!xwp zckMTkG%FJ$qcqP_bN3QvEgf)t-Te1@UI&K3e1T-ty>Y1vqjd#t`qm=|s;Q$X+jY$p zEIcmy**BecY+y4U-*)-G^Dqr{#*y5HqnhJp9&&BFl+94Cy4j#n+B`V(&GB^WtrqlJ zAy9b*#HkA5XHxXX3FMMqcJ&Ytn_2JODsS!(At?svY3k({5Bd~SJn>)uq7v3FF>zLC*Bx6vsr4co^`$kEBy!E%v-GWG-nLvSl#&n(e`aoL%{#E>MFWXPO zU0ZcR?MyF>`v(ywd9RHY>qsq_nYHii%kGL_>eYcd+{UW|3i07f{ER#CbItvNq^0Vw zaQ`kKkgXTPB&1wLsW@Qt_zl>(;oa#E*A^b}T}~4vv}x+sz1A@>(0}V>Ed1`S++uNs zI7EN`@?w5>jVBH_S9e@#%*%E>--~50DCYDuo5?_-RcZHY{`?t_#*TwQ=}dF8)#t1_ z69?0$Z80UVxitv#Z_KOraj9FiU~>v`7jRXSdOBQAmf4lX-wese74V=3iaHrYelKc)kT%R{hl}>tEX0V)FJoL-FHfG@65&R9r}QaMqDY|RD3Bp zeZ+)Gq>lbu{pzmY?N6D(7n2%Izq#Y$6Rj%wFmV%kLIIGV1z7`P@No+18Kv#xY+AU# zE;r@Yw-p3T6$2f{{}|`_ML?^}n8pnzF^(y%nu+|tFi(!2gttzP=YY3DcUA{F0Qh^a zd=$2J8f$Vh1K3#8S}GbwXv_?zY3vIzB>El|bgnwrVwh(WEU#>*_CI0&mP4y9gBR%v z!l8_Tev15s%y)i2sdR@HEdjqDzq+)&{~#5#j^!CW_dDGv9)7&QQt zbFy+DE>0#lWKq*eVj60-Qr6Jg_@wb$E>Zm8Dxe{LS#q#sRnweLMoX8nuNJ=K#xSDY zOxXTXAG3`Autq-_w!;L^1!?$&SBD*=f*O(ou(6&LZZ_ z*6w3kE&WE5Ew2Q*L{$~1PYSb>!)yZQS5R_BJ5Klm>o1*LHWkEQc{VIsLciX;g@u{< zZi?m@nYC!@FKRBYL>QzK+Q{Ogl@Jr_DH>bEJnulKI+nRHCC0Aci%|jYTFYNz^)xS# zORzC7)iKXI(g-Gp*Bktv=l!u#`%=W+EZ?xhD&((M9$sjk$sdcrH}Sg`jTT*9cM7Ap z6^(8W5u;~UL+~d-lns`R{A{X|>QQ%pKx`EEw&etqOm?a6Ug5Ct>iq!Lf;9rm>A*w&Ao`F1aj+a*C+vmPZF9kzw?=*fG+ss!$!z*q3 z8iLoFpKiNxCWk%OdK=CqkmgY*!?JjGJ3rNM)ioX2KM07z5L>xy24lq(?CcJ>!hL!{ z0PDS)-HE76FB{pMBOPVcX>4`-*+m%pJ3O5>@%5kuB5aKVrxinCsqM8^ zU|{Nk>u6h7+1;nI5p|u7eAB_YxfUMA>hwesr#iE(VQyL7bW-!>wvTW0YHDije0HXY zr1jFRgPQqDg-o6D%d=d^FXwuvrh0b|EE7xHjT8n_;?KFQw_vrqHo(@_os{{u{V_AA-e}1<9xM z*LMETMD}kQ4%7Te-w2=L3?wC#Uz>T)xqf{na!yiGq}{$}Qp0)gA#CtOp0l$4Q2Pl} zSilDnv+XN?{n6uCmA>q3krLDGWPL2{cILrEUxAZ`;6cyu?d;Vib24ET(zXSE%~ku= zL!aH5jls=`CmdincT1qFbRhTWBWy20gIhN8GYyMh%vWSSskQxS9Q~*XLACz;>CR}D z_k-6_>|xTo{F`T{k1yA1eLOw{ZvA2Gdx4*)B?WoAhoZJD+)-w5Hsh~iw9?$LHT`s! zbJZMht#bQTMHWd?z`5x1xai5Nj82>1Y>88pfT2ILbJhjqFWWe4t8-0SjX(Y;5wo=UVudCtX9;gprAbxfD+PcWmQM z1e#8c&JZ@xac)v=bJQyk90}r4tqqhLW^&c&sCxr-om0PmU#MYkuZ?TqmPx~c_A5Rr zDsroG=F$uW4xB+wDZ$tAUVUj0P^A=7spxJ#HzZ{aVJdPQy~$ z!39BZi$rI2lL;|yqV>Q$BUpQ3<~>>9S-nnBG4~TgzBf*@q?`*5lB{C@34X1lNWl(){|%M3yUVMVTfPk zqxsZV^O%gM>9m^e4v)tpg;tyxT5ZG+i&tO2FUv6MKTenBzyVFVBP;>4RKRrvtNvMV zBo2Oi{RSnDNXLN{&JeyJ(DCI!*zNv<)$HK%AeV1RR+~CWE8A=-(p80b%h~uuU;CZJ zZ%4Q$qP%~FF^>Ey@L2!&l-TY;m~ij7&f0s0$7Z`ZT$)x@ zVI%Vj&UeOc4u`vQLW3ACu|&bVdK<1M-+a2onXO|jc;_qK{m>jV0%vOS8e|0D%h zS^q(v7@&uB^(M#md-DYMs#EzwB*O44(>^O70*+BR=oBU|((fyaw9HWHV3etaTUp81 z&tCz*)SfoMCQ~N1x^q*K>zv*Up>We<0g`KqUF~ru1VHz8(&rE? zzfY-O+etOb;;u5@iV*%G7{|E?E%SL?_ID9`L8g<)58rWjvU~KfMb3W{JY`j^E#TQH zO#P$%DSB?4({MiRaedCLc#PHy1pxL(eJV`Mb^iR$csg&#ruhx!g7cfPfHohO{wP=%DpU7MP?u>iMzLLkxbqb21=VY8 zXkCrFR1Rez(0w^duv_7?C$YC5%v`iL(sEcVJb5~`Z0Ss9y|;-t+^2`$_B2fH{WPzF zfU@;m;fc4(u-V}E?nfIP0stWBm!J+?gX=gMDf()J1&vm`yWO-eNY7v9WSL1Iyz2sw zwOq*$R^jwr?iW>DRtDnSviRXa`uY^Y$KX4Xu1X&GXu||=^kXega`Lfo=xqBYIO@{u zbyuhegAjrMAmq`RA$1JxAPpNJcWh*}bPAi8r-6s0BAdvfj(oYLd4jKmZp7-#>at@B z-FL1|FO6A1f-xEmD2%n2if`9Kx2_tg*?P=3!HD=h+drxE?Lb4b2_ZKVS0`crJ0f^E z_#POKPhAi^-7nxnP{Hsk9OSuV9pT;Q-ynhKGu|1GqjYU|L;Ig))?>{DQw8=`%}Wf@ zp7zSkd4!scNE&uaLYJ;N+4x=FTpn9)#!!;1A{ru>tE9r1>?+O~+m8Pz_dLQD-bmA) z#`QSxKsY*xCRJqS(Rj_I;0g{6r%plhBk!wE{~Oq_Y(FPWzTbK7UhtPzI&FRvxl z;nWfTlh5B93P_Z!40~PPyr$2CC(hpz_oqUm7Qy@cGB7ww1VJ^rhzT8r-GOO;6yHEY zh`;4^H9Z*PZ_{==?DJCE^TY(`h+#KQUixlG0ywr_Ec+~3@=q`DYpxT+5xS;arV6pb z`I=76NQ32R5a zu*ES`;)e6x3KP!_NW;9eW6+7QC!qIvIoUJDIH^df7azO1%jQ`<4)Akr{!5(bq)Sbs8r1208h>M?Vq! z?wVwMJ@$Q!u*Gy(S|O6}S%J1-;+|fVRp{+u`-7pF&Yx15T>+11BJZCZb>SN&g^G}F4SjM66Wq!_gOI8}akXO;}qEDnDB_iL(=FyU#ffb#A}jDz)ARetc)nV9t2(AZ+2|bJHuV%6-`@7ONh9%k^nO(C zN$dCvy!??4|B~k@1_e|uWR3FI+v9tmR$Z4OIrCI*KB^UgGhx<;``H&lhPKfG71Uj@ z?2VaKJ{Inn@Ufb1M|nrWRjshUKq~lXi&Hoki>2CGZz=Ah8B~(%HpLamL{h$eh(NEK z;tZD1cUW|Iorn7;it4tA2~G`w7`ah>@LLtZ#~Z_}hC&fUL{Q-dIa(5eBwose!K4D& zl*OvsQ2@d+GKhE{MLax!3(1K%Hx6W5L5!l2MDwRA`Qo?A6*vt~$%(7#@2zaoWf_u* zB>6XNqXy8Ra=aKXK7dU+_VXw&!n7}#WII5tt((f1Ep$dMk7AW84E9Vl`aw_xPpX8D z2N&N94q3gdfwaK_>F*rD#EL!IEs%gH<*n7GuN}5w9q=J^pTg<<*piQlW5Kf`)g(D% zaPbUzKpeEpL_Qk( z8TlG%B^0Q_0b+!Pnjr24ulvM62m*kb6ijdMkbJSbKp@Tt0*q~oDEn555Q;%;;fcvm zMJCqS#0Zaxl!Sq4cL5P@J#3(`d6un;OA^Mq3S~bz~f@113U;JWaMYmZ@ATPt1O-d5BP5U3{UL0 z=h>%$K928|qj;_UX}A3Lor1%EiCyGnEm0}Uf9zAJ&qSJVGx;QxDR?rpjc}l#^zie)|lX6Mho{^RGGD*rs_KTr^@`z1zx z^D~Lp)G8FYtoZOh(U88ttMP8I>s}k=HGh8o1XU;a$KIxA%le)Vu>Y_S+b+RFh4W2! z3%HKx_tuKRl~nP4DFVrhyW9}}{8ln1PPt;}oGkXhhhzrppYb$eCy}sGhW4XP;ffiM z2I|*g*|hGXt4M-n`oE6j;MH)&LYja=s(0z;ZWyCg5|=@m%da-7%Y0f1{~4(BT8F)* z-1pM>;_Oqn?uN=Vi0^^i4g?*s*Yx#mKi(qY4pfCb=)RFopbH~?CL%_eWJD;Lk1le4P-*v_4ma+3!v4b5SXC?mrvL#lPL;*S zY9U>S3}v|b^@{7>lCaN^Ll|L9hTeUYQ}ve|z3(}GVbYyw|JfO3U$CaN&(^G+<)C6hPgbfilcRWyyhr7Tvqq~zEXvna>mj2 z%5untG19FmprdAB1G!Z2?-OTL&{=_3@>_TD7n77JcYE4@>Q7}C^5zX0D5mMBY4;wr zt8!Qf#5$VHNJ)mB^|XAcHqgEwE}~1B$0QYO-Y)tWdWHS9_Afa}d5*`UT0%i99@u8K zj1RTO6RrGEv4;#=#jvU{Qq;iT zwjAnY|5y%fce7ZL*>CZ6S{Z_8>D$lX&67E;ox$_&DsPC5tc?wbxELNjHy+;}6$@{- znt2Q)O;;r0JdF5dq{2`s0}d^dV^751_KkWwlydbfI5BAM`6Drg4GZ7t854J^wU23F zKj$WeHxGatbMAWeNo6dg=lkVlo#uFmT=}JuR8B_?0gFBn7kgdbG~*zeqk%y6*_*MT zpFfS<-={|WJC^Z2MECL~>I==>-Id3$h$M;8;N#)C=-yP$DFe9AXXa%s^$3(mZ>5E% z9l9^8;bkEvSoEJobBNSLp7}BPQ7s2Z@)o)t{wWgo&xw60Vw)^=K6%eVX#H6(7+%o1 zn4B?8o^RQn76$p5y}WgXgLh1W%`N`7w^TQf5RK8nKL+Y0 zxR~;{&?#^yJ6<`nnO|B9GHt1e+CrKZw{%F!M`}YB?YChA@j+8Y3tbSFus9w^h+n-N zb*eG9`0aH0CnfHgGY!N`GKR7QPEK9*Nb!e{%Aj<#abGh(-*9(MTB6|C7&0>ofgb4# zg>Luz_w>|zT%|K^W4yAMc3RMaA9JAkBgkqL-(jnlWyV=Zg$*Vbj>98q`A6k)Dd@4w z0>vQ9bbB)DDUJ{}bGo{Nd9R^;CM7TLeu*_mNQ#o(zA@3CcEqa-B=^vHr)RaCmWX4p zD_dWWqnA3YQ+>~F&%4RSFP9K9`V(lrrTDi(%R@2k)^&@2q`WO7a5$acXE<(kjG~d` zvekymn}`Y!$r)DiG2UHhfG~@6IIIr0lX?{B?d)Z_Z;Bb77ruHsIO^?DdLf&rv6TF9 zP9(mr^myk;3~Xd?jntY&a7dtQIHLeWq<7~$`9tAffBFBhuO+$n=tfC{<|TtY>yI5r zzli^yXJs$pk!XhS)Q6${ zQu?b-;i;LH)v4fjHS`S=v63{8+evnQv2O;ReMbo!PuF9+yIU&GnDX#@yE3dka(Qcc z{!#{?-ZiXlPpx<0^T z-czx-Lxeq-{UFnn8fMlq=aV^@udHu^=P~K@vJP1_>NFsds@#S;^+!#dyF78$uPVtb?t>Yuf_1pzxB zZw66frv(T3*n z!&0!EAC+yU$9R_bCdLk9UIR~^IcZv>P@dp^W>F;E9~UG1Hr!u2PC9fa?c&~M${H+B z6pm@-n9LI&si)D1G%b79aNo|4)As(7(p%fN9VM=qCOi1!du`x@(_1d%VfKFJBnU>2 zrYmq-vU{cnML$%sn!1UV`aH(5v`rY!z4D!_S=*#M?>5cX<-0m%+*|+Qplt`P&7wkx z+{CtpauWcEvC{)U2Vlzt0AKv0&pLg(|2e1!Mlefw@JyIQ_?$0tzB4s=r4b1pV{J;~ z_hjNY!e{}?j!Fb9`Wg3A!@-~2q+98)R=U;n zPIa$k2j3~1Wa?>4s;~-BARH6P&QwL3JlZCZ`NF#{&**J5+0%3@On4L?$r47f9?e~7 z41Az7-Ok)PFJgg1!~jGx?_5!aiSWv+oZu)a7~nvj8j~Fk%U8qqB{Ml`eYl)f&1O*o zx}L(Yd8GGs(brWQ2WzrGAr4uFSK9F*GAlx&i*yvWGFZ)UzLOGu-1yM(pOw^IACDt( z|Jfe54`Z@e%nox`Ra)TL$HZVkTGhWffmD2dik=~_2}EdvV%kHdTw^u*yk6}Q=9@QR zsjrN}oPLLq3&psek52NB1|pN0PJS`*hoV5=K(Yc4_Ex1Bl!Vq-9hHIXaqw&w2zl`LKe-xf=+gMLFN<4$Fn;VEzPsUA)kwIfg~G%D?Fh2lFADHr zpqs*hU@|V|R zyg>$WEZayjo4x(*Lg{z(=B4YE02WXDHyNy4N3UA&T-1FY;g zia-AyN~s<1`NHX=8_kJMwNfDd(btG{9}+n(o+Jo3d`1wc#C~OfYBMzC$~!2} zN4l6vE;Pjkiwx%o`?azE>=|i0T^@ixh%*Y{bMuH^1~9a=^PA+mc{ImA0jS3X)L` zIQ9e?IyQ8lb(9aiNhiGfW2J2TFj7ASe*zE0pe#48JlO4?jsC3ga-BqI!dUj`**$uF zZty|`a(rbyOd5dskaOZqklT z4M{*v($T>Qr!#!@*(gFYw?O*UylC?`L$8V3{ni&1EqP(?2j(0#8U3|EOJr>j#`NpM zZcC(T)&n?SysG!xQJaSt%i5?vy?YsHmSU?D&^;<55mtT6C;vMV^l=sLCJ-pfOXd~4 zAVlQA4*K8zvc|ea$hgOW>y!~FJwr<-5Wr}w8N(+36Il6{NVe_=Svn)G`;3do9ETP>{5lRS4rPT`o>+`NSbpxCigId!C)K8NmU) zY3AZCHV-P=R9G$DB~&4z_Jk&=4ZMb$ zQAn_Ek+>onE-~K?KQ#ncR2RjUdi}4_)V@rBmA_F3XgwHhbC;%Bm2B<{RZTd!mHC+%uxuOcG zk-!&)!gU3zQHqJ61z^uAe(^Q(Qyc!0#NfjoLItX4zoKq^7*!?u&q}9{YZsA{k~(*P z*tcm5(b)ZxW4`o2!iG+Qj9uOSR7Fa;vX&hz2;Lh;7(3~rkq8tX$b}C|;oJMX3ioQ< zjvzU-4fIMl>KIUh*Llb=p9pGDFez_*3` zj4}c~0+Nb%h%4)GU{}Ml5JanYeZeEB{rRH`5)e3?*7uNg`hv}&CTE#;l#q*FNFa>j zG9hxz!XK7y&_y*(g}<%y@_&;$&BdNdO#6xnkMXb3|L5SI;X{Aq;^AD(Q6==E3Ms6B|$N1tX^qJa%^wiQ3-&-(V3vUwRb?Q%j{) zi54?9HWH&yEO{>h(Icn%BR6j^1_8@-spzS0u%~1HH$aawnLS;h(%*2QsDr4G*uznS z0u=-}Ekqf_Az%?k$Rbix7lwB#+nK1}z(;;t=54gUsE!8$q2Ez3b2M=jHnJ#y>GIqwu>7ANG@) z!7PvIQaoK!zd!fX&vB91aGG4}?uA?7#Z)ODu_;19fV?N_{8D&X=Jo3FpRGh;V$w4> zSdbBKkR&ufi>!)dknNk1W7*ugWz>t=9x zj)RD+HT+6M`omj*1UW(t2Px1Nf=+=XNEr(BKN!=85L^E;x1dhe0bwc z)aJbH0vBZxC8J%4kITFu-J@w|E3c+pG|Kvkkq z@?3R2qzvHF`qo5-2JEp*0_nWJy_|vNbp>|5f zOzEKJq=;q5@2mluji1uNB{{HFp1mb!i0ivnu$Lv{UYh zBIxqZJB*=#(L%DBq+=1Vt@nyZw5_%HSxFrS3?cuH@6dc%pRtgOAU(S-!P?&WvA9M-Ms`6ZODzuI`@A~a09$f^t+!YtQH%T4?d#S}vLLQ?cwW<29c=+)KXU{C#J zXE3?9y`MH}#BSMLbHHZIR1T8+oXmf>0bw{(i@YjhzP(UMfY1bn~jrL$Seul+Pf zqd@$I1aff*)b1^@mFkuz4Ygl*|JZr(;;{+9Xgqg96R8VmGkMCfL|`#+ym(zq0Nju~ zp1)R;p>!j2xn8@!7BU+}7?v4Um#-F*W*BJt6o5ahGTD_mx{Lhb@WFu`LtY+P=*f|= z(sT4y4f-Xch5LP&25p6ha9XP2XWs>}vGg~k@`r!+{fnGTG;g{!oHAhf%8 zyFh(AJr27(c+5y2`@@{l?xn5kmnG&w;}eF;R&g zx<{pyU_&MYn|Z+iAP|lNVk`#B{OO(t6#-xr0#2xcPC@o`n38N#gp^@0GuV5Gp$L;0 zloCLMP(-Y2lus0CZU%7Zk+XoS9u<-V^$NxW6y=7Qi(bhE@JXi@@+_ktBcPQ?~T?z$?yF+lN6nA%b_u{U_ z-QA0S>3Pq&&vW;`kdUmsWUjf!o@0z&s~s8`|Djw8KQI(J7z?iVS5H+2>7KIrMjJ`n zpv0#7>P^KM%{V~gJaDALd#K)7fuI25I}{ubY38SS)^1jKo?H~8V;FeoSb>1n@Gq-*F%#qmBq zVK*)NVsro6M`}fV$hGOtQzFV;Rckx~?|fvupo1LXmiDmglGI2%en4b>cgHB8@bCX_ z?&Hr!xvn-XmOAQ|tcO-ioEx2Z0}Q2@D|x>HYQBtg$cl z0(vh)E;{b_mloGwUbWsCw@js``L8qw95=MuJ|9&!oRD~lN{X87kcslI*MPFpvwWH? zoWXZ1csi(cea#63*PRyfGn5sbt{Rm*%687p2_>*!XZt3-t(;Yi!FR(nO{ss32H}|1 zPcOWW=LK$8(c3Uyz`|=%S(KbG5~8%%}#uLPLJ#r2MR`Etc4x7upn)rLoYYWFYhaZXEky>}B!j zQ2(003EJx83eivK`*@L1z_3FGXi`7cUbhmSNhnDZi&sBjFk=Y4!|mot>8imZ&*36< z+AsHaLvuZg4wGXBWBcre@e0l(0C-}yVf+J&DUK;M48U%GOx~TkqUd$gN2h6ak{}Ls zlZ0QdsjHQS#hb*|+%d*bZUNx-Z0)QErK(@}p?kyj0RTL=2?56H#u9su=HX&-K6sz> zsPVJl?*x2FV8M^`mzEn{dy!k;c_^`cqUo8vc`A9R9L?^eIXUWj+j1q*{w+bTi2Jz9 zW};AV67;`iH!}pn{qR+LYWlV}mLfOtwmMh_8AZqw+2GHkO4)-PZ3uGZ07eXiap4L?-!y=`e^xvA?IJPoTd zd%t(~-T8Ux_)C_q2^&wLhcq;uOAJ5;2Ng#739~z# z@Iz#Dl>UuD7fvd0z}~dtYCS(cU%BdGxnQz)XA#c=BcRt}8$ zucsL{fVZc=7*hfsQu!+mf(}e7&F`#S4xs7iE=ZU=tNRY6n?ds=F=eVTKMx_eC*(u_ zZPP9k>)YKnsUjBeD5uVV0rI9pnfOdkI1vF3>mJ%Qzq>RLk-$#v&UZW=*Jv0p%I}c= z@yuOecczhd87~`*Cbs%x0sts>5y(B_;R9@A`e@udPDT87!A>TpsipFYWY!pD={z0%yyCCOIjWaziK!1FYf$8wgRQ#96hD>SJe}}MX^tw(OUDOY^8%5-Y zX6%=aJT6Ua07Tjh$xT2UjzNe9R}6?*j^exeP#5FFmGC(n&rmJY2#WIAcAbBU4oaMf zY>-tgK+;G* zT3DkLV9&I$o0r#Z>BBMAgSe8BDQo68qE`}6y`-xL-uPqmQAOn4p9$E!`VYOz|?U)Kwku~ zISz-HI$>kp)JJvi35DX03>VDxvkI;K8Si20VX+_S`LCMQ0)zU%;bYI{@!+|#>fL|O zY>${p_EVkn^^K=d)_7~wF6Sh=Dp zi8p@`3%}j!To-Eqi25hdmt;5vIN&4`5=cxFo8{EWl-nCQ7z*nnkH1+f8-ty_Fwl@g z4H#6*!7>0rE#v8;L_7O|-5>?ti0kmxbs?b@nVpOx(91ct8p%S0o|=_qT1(CLJ2E?!m*&Ap!+ z^Ma@Wko3aIy?`oZ`AAsSb{d{HNl9i-N?vpGVIP`)aqZ;r6onfKWhq6LXN|+HrsyDd zf4be-wRV{%(rX*cxuG+zdiLMW(HeNUN2U!h@>>KHMW+Liy!bEe{qm~1AUTa0Xp}5b zk|Czh;G;i;N|Estw*~6US$fO@!t}|%S||WRQg|dpOwn-J-*IqR2~+QoPy<26n*9!; zoef}zm7in*ti9aV`Or}C(4ing9-l7-+XYj}@5cu@!T?t%|)1Mg7+^$%+;s zx8t{GVwowtKh4dCQq3L~e{LSBSRpo_p`i}1j;@CNd|q!bUA}>86<=e)00_)L2TLbg znr@>i-`8jgD5_{&gXtzV@dNZBTir(kR; z7AFgZfsW(mao@|8C70_h?Y|7QmA@8%=t}-Y5@gB`Y>@sEtp?R6_*N0J5dB0`6{9eM zsae*+!K;8JeH#_6-_ffGe5gtfopo!!4q#Kpl=zAGGs&&HQtPY_rqAt~@qPT$Ol6Y>H+(2BU z0V}^h@q+@^cwNtGxXz*DmE4bseX@QCDU<*HXr+UqjJ>PNX0Mkl!|t^fj(-O_?vLBnqdIN zSaYlz7>Xj^;JLgM?`r0?6qg9+;rtR2s2OSP7<Y7l?LxNf zoKS`V^D9T(8*Kl|b>aJRM6jjA?}+^iQ92e@8Znsq&1`UEn)rVJ)hZbU1%<~eqbwW) zHd0V6VLxK57I}>yuCP>3GJp&gM2=)63QdDF^XJd5TGfUSkH=yw0&X-Wwz5*ZbZ&X8 zc@+Qgf%^9b-m|;Osz};j%i>J5fmM;~npDzAy}Djry1L|I)GgBQLQQX;J^Lhwm};Wj zl;IrCss9Cot|k46hoo~D5Jcko;>an2L4=QJz%PEnBBauq7=hIwTx6MC2Mba6n;j!% zGWxr))o{0WP6Ic#a{UB5M(($xAY=zZ6$>{J5n?MDcH zFd@6wUL=J%QpBKvlHLE|aK0#qsbr9wrBpWNmNQK;g!faH+Ev0A7FWqv`p&>%?+uGd z#}K5}t&ay`I$a5NQ?0eRpdv$_S2HO9H@t1*y6JlRlbNE0j@sV_XtD&WRVX61+AzMB zX`DnpP*=5E6^Ib{>=LwzZb>VrPxaH6@wCQ7{}26wz=nIWun>y}Xg~Bm!@$_`q407; zCEP%28X7fz=1_2XC@!T!&|tx3AZ4Y>l@wX12>{baqCI#J%Klng%I5^l1|FSJ)-AYL zt9hkfJGB|>19f#I28sf?5{N9Eft*~qMfJbX+;>x{951a+ZcYH^5~S87?pqMRFp`xl zS9E*MQeL;6A-p}Dip<{+B7&H&ThdWV~l_3EA zOE=KSf}9W-&|TesoBj9_azNF@C4!~?`wCJ*R_ca@L-Pv7N(*FAv6!dF*g+h0vw;-_ z=U(bcsfdQhX6v-XeZ%E}2>OcxRZO+8OeIvX(5I>XKZF+o;l?wg3B4VORD8)>tkSMn ztdNnLE7!~kKOoWWqUNzENSuZoeKtj`z%nDK-@tx09X@*_*qYE-RVt(5_=6`LpA>=s z!#&b;+`Nr4zYS33`>*%|zh&qbNjY%ymq=ki=lhY5fODn9al$B7hyVX0__yz|j7?qm z5ewj73@}rtI5N=ZHB@@Rd==Zta)RG(~IWLfdyG#1t1t8DAVw;0&cRmY&_)>a9>1!dPu>)Mf zTbZqkmtFnY`1@b^cdh3~A+KYX50DJw_8;`4Ph^;i4)ynxQQIwdgQrJrK(hR;@hx3hpkY-K%_Amy-FlM`ZHzoxY*n1WMCC?Me%*$ zaA^swDq|d|Z<7dokZ3S}^sevTY)EED57u8#ZEJ!c5lr6^YhPthsd}eIbsSxrnE&KK zNsjgq5jZ+>5uYM^QQ>1Bx|2On6S%ftUVk(kHGuwa$dWJxKuQfv?v8y8<9H^E6*GY$ zu)!vC^xNEWp&(N{8~`$d)^K-}VioBF=az`r>WEvgxiIx65t`oBMzdX13Xp2hzNZ=^ zIlVv2%V+KFg!4&_iR#6++!t2#6R{&o9HNmXyh*{PEx||U?m?@zUlB2T1QyJUP=Y+R z&-Z>3ZKu$;7CJ6hUntN3pu@7Nv)gY83)Xd%1hzy%jbBer^o30K-gARq&EsKg$Cf%r z(_1O?K*6apvMYb(shsz4%9z(K>WCO+9!(ast2Jzx?$pv>+!OC(n2=8<$Q{jJ zug(SV;0B}ubW#yo#!{g%oq-YX2z)v-)>Y?in0l9YUoR>gH6Olmm{JF{J-B&~`!M^S zPLV)7K#@xxNfysLc>@M&@$V!;w-pbm-Uwr~m#xyyTCLTvm-bE1vSdwcv*zN0YdKJX zKIUx|g@w9lFP6$98tn)cka)>}5G@52NSye%7CzwmT4%2n4U@RVgNSLEay85vCdDuc zf~(2yN5`2cJUrJK?FW$lao%=3i&%kjCJqOby<>uFDGeo+_m7+m^zeW0Ewx&HzRku%n znDMk_dt63m%nT|g6q+i#8<~ZI5CF3gYCZlLgE~ZQpE^JLcd%A*SC!nlMNnKwAfx^J zTHotR0X*$eYTxh!is(jt){0VN&qN%6Tp`kWO~Z?L6-`<9-;dU=2G3u-86~dZ$p2;# zvm{whhVvJrdZ`_c6O2(~q8YNC(H~u`Z}4r>$vlRqU4KlJmkG68qbO1Ib%axd$VJbz z#ut$o{JKr>c*XB}>Un?L0sF2tJ(4_FKfPzZscZA6SZcqlDZXEpw0ft#+i&c*l9=;* zqh;E#nP@+JUvh+dZ??S=!r4m_XrK;ba6sHU+35%PQ~uaj7j}C|#V`iOxius05KnXA zx1z^UCP4O`uPB4|D1&T}?2!JeeJVHVK5GmXvG8w)Pl6ELP0pV5u@b~IKQ%c`vcO`^ z1wMPdb`SUGP_IC}ET}Ltav5A);fM*|Q)?GNij6TCzcLHS^K%!)-RDdg0xsh85!k!> zv&@NV#6LP8zSQnFb}Fr~CIGiAmw&dkjkC|IcEFPv~O0?tnIRUZu7(QF{q*ia_OMSt=YSTmv0_<@TlzlizO5B zq|L2`mCNl-t==|bg{qOTkTzx9*<5BZtvjiD0Q@UIIy8Mn1^>}$rF$@>ypzOAx1L2U zK2Lrusj`(ZCUDhg$knOjZ76ATzK|3W zs3{K$F7z}!L1uP!2NeEl)?Oy(sUdJB{E>!JRaIqC$Y*8lT(o&wp82pt>wzu*fxWb) zWtsTVxcJKKI%!Iy#r{(Tt@f)PBcDSPak-C?mCgA%j^ge9*i2(uiySM**1lBt4L@wV z&z2dX+Ps}xQA$j~d=2vLZ96|z8q6R9bX^q9%xg;;q{XOk|L#&Af|{bJTc;@Gw58ZJ z+Yk06mS6;R1`s&9YG|CVC%0W08g&0>A26AX|8!RTgCv!zXgNqF-yIT3>bmMm1`#$b zZO=o-wo~BxzC8y@B~ak#EwNQ}H__A_MU7%lv)_R0U6&> z&NW`oM7~QT9mqk!1C6Hi6LOmU$UO^+YH3R&>@6?*H>OPsjhynX>!a)wtBZ?nh9`4+ zX&-FXxjk>ba4^@D=THVSKJ(u1+X!m%aVG!Bu!)#*wc8o^XlY(waBqen!I}ui2aR)R zuefq9U$91wvhZVgO>^l^n?pxuYLa2e=nKJGZgbKj)AyraeYm3c5+^-XuBJfyD=W2d z{2>1!;lFd(k=jW9j?rIjU)C5n;het-1>dtp_T`SNUHo7s{x>HGP{6Oj!-S?>Ge zT{U=W(A>wR{LH+|zKq1n>HR_DI*`E*anCA%_NOhaT%qWf-_p`ZqnfRh2>dzrnLFYl zbC=pU+~tPBq$u4+$PUKmhwE)2j&#cJPC@~i#a-qh0U*dRJYOq0G-hzub<5=!_LGV#cGy}Rt)gQ zeLeUxhCQSI;FltCdf)9ueSiY!S{ESbWN#`t)>V+JelIJJcF1`)ZPQdTs+&KRcBx;O zSW=_n#(!9Jx(NzNQ~dL(Ht7EP`m?%w&|3$ zCAa(2_pLE@G3yD4=KNks_qT=mOu_gb7(ZYDqj#c!n%9Jmr?Zf> zG=h{!_Z8@CIJvm6s8&v7t%?T3?Wa=O z>n7BjM*Agg!Bu4rzIikqV+*Ugsza`e@smS+?(MR5XVn!srNS$=Whb`)zpApoVxbLHAKb?u94LXVCH>R$nK*9)_#j~;%)ig$0Vf;*KI z<1|08Q{Hw83TBi*PruZggB$ufL=;#Y&bYK(MlGgd_bDGXtTs$xibhD(pG;XLz? z(}CVRnzRRThL;95WTCxq-h&2XbhSA%ENiyrw1@Kw>l3_dD1fb8O+KzW=(OSaE<@cy-7~iE=Ht-aFZMe=~)K)RCQ`<#odk)x6M>mU3(mYqfNXuR`VdQgp zx(zFpyBHohuC$;haKaCd$q-!A)&S^ns{N!M;7Cj+fy_+}VHFT;yS+3@qN}2n)x;CqTx8w%5j{5IuZ4 ze7RKoDUv9H<3BXojQoGqFl43^gDaJ{<*6W1loL5fjhMmnU5g`^=(=oH$Mrp@6o)pZ zY4eFcD&mg$+f7Ct1?DXmji{%(p>S3S@(9Ub zVhttsh9lI!yFZY*+cKbm=L#W$0`ez^PDrHOo*C^_gJa0|n2a_zo#DCVSb4+RO6osR z*T&am-D9z1{g=_jzBmTeG4;JRjE2Fm5ihLhtOATGoC z-Q6&5ygCT=X(JDN`N?vL;JEO1(=3W>Kb>ECwago-#xpn5X`7Z-=UiuHv?DUCDQt~N zXEH8L53Pm2b!wOgZTyBwL6vIhyC^k;`c^ zCGds`AO;xtHch6doSxJ^1H1xYpiH9Gx|BZRBFTh1FwjvmGEAj^XUInc47~IWS~hC6 zpE(!saanh|Lytpi6BTsl+`BZ{$U=HTHk``DQ>(^(*@OQ)dmugGr!kur^2moIoNtzZ zzjS+HLqoIPxgTrkN01nPt~1HFG}eEa^AD)sjsr(x&BiCBMaUqrtEe#WwB08|G5r39 zp0}D}4$8O>icD!bU;X9+NfS>q8w{JhvNlin*6B?X6Rn^W0T& zLm>P=Q7!ejg41AVeEpU{7URPBgQW|~{KAM_y`iJs`4Mv=Cka<2G-_XIL<#aDEY1}mTf@89w(h3=|xHx4^^*H=fD@WLRyr9Gq1Q;mKA`=Be zT9k%{mR}Ktk=fPdl&U8#Uz+?OG3{$W+DMtlt>^J4hunUEu9;T;$+e5w30NTnt$TKj zcgQ>`K>}7^C2nH8Zb_%T-ytLpZfX~zPjSm{JND_*aG-x99sSPC{b}v7yT0w3ns&Bh zqjQ@flu6hUdbMH9#&R=lW20YI3u*}7x9)HO_hfq!WJK$1FNkckjm>%DYa`Tb<4kXm zi`C>w4>OHx{UoG>L#9>8H{%N`tSLIBvi0AA1x|htTt3Tp61V%dPu;zj2nQQ!{QzNg zA??>ZPfTn?4EFcM4TbirD%-b3)Ul15O-F(S9cKpM&cVd%TS61R2@pNERxsu5v`L-7 z%`f}n^x{beUM%LN$=szPQCRu9)Zl^F?~*b}+(x^nI2f7+cZnqUPm}7Y2>& zVo%k!<9#6%8sN3vv6A^TfEmmUm_BjoyejOgbU#f@ZGSQ_4;JM2S>lrV+I=OA1)?JT zA(cpWyJXd+&J=ywT>=15e(($IWfT6py|nS_@ZylH3eyKhA%$r1iT^a>U!VfwOv2}T zaW*R&5t}6w#9?(ifas(!uy7pNpcBnO6tqUruw;~@NCUV4NVytrBIGG3*w2UsUKkb# zA(so|0$Gy#fJd=1yTjj%bjP>d0!7)B#gEYOGRVch;&?Vg`~>_L?YT5e#zY;nXtIy& zE|0#g1kB&*F^S9`fX05C5ql|^D50Rz&PoIFXTb{z*;WqEfdi=L71>RLCmNgH0 zefBf;JF`0K!)u^_HU({~Rpai$*vru72f*P$>o*^2?X;1nWQ$)bjK?#-?$}Shgv8(g zfG%y4x4aQt8R=>xM7DmLg##g4cb9+GjHh&3OP=?u#yXc!H^*1PXYLm-R+ke}QW7$< zG?cOtK&KzjaPQ@!+_M`JUtb{AmFWPMwXZ!y6^KwxeaI6}87+5Q=5XiPERyZo#KIsz zcYG5K1d4Gx5%y5`aM2gh_qW&fx$z}btuhv%;4Cb%h;ikCNf8YhY%kzAFtsS6h=mhi z^7cq2hLyZ!n(8k9GVtRAiKAb13F1#&mb^oyFUsBXi)$Y3!|JVz^LD2a$Rs*t2On`S z`8v{hOx_$Fy%#d&EB5wuT#NQh_e~G>uy-%*tgvBivykJOQq1f58Rb6`I>C3N00>uk zOE%4jh3&d6%&}yJ)|`=<2+T;B&lWCPTKepk1Vt{FIt<4YGe3nY((zv349O=l)wpM{ ztkwImw>oc-qw0^sRHaqY3|^6jBDY}4`eT>!Wrzk>wh0-oo6Iwh{>i(2R{5%&7H4pO z^Ma9;S5#5Z(qLAl%I!kAQ9R$5eI~3nnazc35$FRIgFcEV$vLkh8K%irGxoUzl5RCp z=JFJ4t>N3X1>i?~E0kWAVBjjvLWs~OIW1q)Sw6Uxw5gKKYLP4-z8|+}7F@Cfd9FbX zRpV&qw6397UuS%%PF$-srftsfiE`inVe37Slg9%9DA$5bBJsrloBaBFD3-M+NO`u9 z>~OZQ*NQ^m(_bP%78_ap{!iy#v|1R;yC@Wdu1|sKJkisZel8&fpqHAcZ!)X?nJ_w~ z@DQ}P;&|5xhGBgt0%L6wc%MkcH}(jlj`CofdIrWZK8D2ywZl~0-4!J4n}j%aZXfWk zZXt5O<_}N7LP@AQqJS_`u>c|dCiCJ@WQ4uYQX+~{lz|9mFvY0 zBSGTZjlU$5>m*ORuBb(lqEEJh4;ql_)Tu|b3q{IGU*pBR_E#Z3{VU)AM5$09L87uL z>+hoP>-V!APQ@zj8_Pk0MV8o{x96-#FaEt9Am;n!z^PstbJvxx=czyUiEC}6;PcR- z(8ChdTBA8}T{P;;wc0`PXP)41t0^_TRt66w$gF}phkWxp-ZfcUiFOTXTx zyYCcQw=SQjK76!fGFc!lvA#Ko-?o_&a7xs93WtM>Lnik(AC)fsf#QJ$kQ!-^n0xT* z<^7lJvP^VYz%1%mqFBE}=h!H+eo1!qP!9pYBc_(LOz0+E?a9x({vlcvjSF$Mw+#<`hQif} zTIEo(-3u2iOWuWE5ucwv*g^%C@H`kZyiCd3%_S}TVK2k~@GYhO=T7s!zAfF;;|bh- z=6dG&#PW6_<_bQ3`2IH|psWCtHVDA6q~^?5G^n=e{%U;zeUO)wuDhy~P}#zhPtf&u z&>Pwh5X{KQ2^XyO(DKb~OCC;Af7I#r&c)gF&pj8HZ7JVVE|q%4M_cd?x1B`+DpjHu z^z6-Mq;jxe(RM?mwKv2VP>)7NCyjkHhInLpUEvw$P?A~uB86tg+cAU0+ z_Mt=7Dr}cR;sV@4fSC8$T+4e4&jJ2+A4>pDTlI^G))(#TXo10)l?S3m-jB1#kLnoK zGYMDQHNS$q1v&)QtP?y_8K@*<#QD4eyHL@Y(5xL=(LGRbcDB8Xv=XlvdeBzGoIR7Y z7UCTlszt4fOlVsc&DYK5VSom)HO#r;{$!97bz^dU_X#79Lijdo zYfwlu@i5D^f9A)=ugs8@%&zu2W9lF&?x^HA@nf6Erer&OE0q5%0U_o_LQ#uga?Xm0*7FHvL3*w4}Yhd@wrv zZaHat!I8${<=lLe5u?y?b{mWcT%5S~aymY9JQzR}o?3sHE^!s)op-g@6#vPI*^P_! zIT93#!om;b^NRUEP`P4o)NE%%2|0;C{GZV(^qK~;hr-I#j$;=EcZoV#eHu?H3_8!a zC2_%cvADvxrmzfX5Mfw~KGAKM$#v!>-&dCd^SpI*#e*s#LbHqIYIxv&)YWy=joAIq z;jPJuj_ZpKTQ3Y~*g7jP3o;7wsT0G)p@|MECXt?)1|B>Mgftoo1(-js&nhen_Ix@+ z3SfbO(Dy<>)Z)+m15Q?dmX=*%wvv;k;QFdCW5}=qV*|0lL!lVgv9Yk>a{ba6II;Od zY*4XSa3B?7k=$a~UKLH@+`w-j8nNCeWpt=SY;}yElrUr{q6|=^l#$rzSTL9*G0Er_ zqNEO>UV1E}j4?$fk9=ltu=K#*_04$VZ(qb#NBh zZRF$)%E(RJs~2T+YNFK51VDfcRSwO#0}0aJG0ZPnvv_mKk?rg0V{jSz6&Cn;>u#Pj zjK|}{>61sD?pVUJqm0o2+iLut1K^=;V%w^p$yPMGHp-?mycyT#!t>uJZTuC&cB(Q% zgWr=eY6Xu9Bu$c~2aSp(v82t*1~%!Qn-aIwm+%n^PJBJwI)G|fD7Oj z|D2w3WZn#}n7@|p?r&jc$WizJKx})}wvxP7>xHTF&Wr<(d%$nt`P_UB+tAR--*S_8Wc%;&5*l=sHxIZk2-p-U7(^^)rK7V^ILnSXTkVP%0zmY4$qNvRT=FcZ zwSsRlD*SI6GrnIq{%K47RQ4?>#H&TqsRy z3+B(vsT@fCR+|Fp0*>uXl(rmrgK=dKWytwG7J9;fj ztZ6UGee|CHOxW8xZEer~uHmaj6Y4cSBW|5*A@bUM0^@($o#%3KK2o`&f4}L@NYna! zDwdhtQ~x=SR*_vvXX($5T??UJlqbXq@@7>#xNcTmZ^g#dT{k+@rm0wV;l^-mJrRdn zYxWQ4u00R$@#sn0>vBtg_8j#kT|yiiy@ge(lYlxg-sKvn^Y#$>Y6$UUi?C zUD4HBo8j8MLb-F|0jHC>eFcflF^dlIcso;oHGYfWG2H7gaT z%uh#x*PouG5(vsHSJvCY#Hm}pV~T9{kK#&q82T>FL3Qzy;yC# zl0RK1W&{n}=(s!UWcBUg*Sc~nWZV<5)kU>W{D3t-xnhC{bx&(*UFf=r;`Jd8vdu4X z8sw&R=+S%}7a6y4HEOh(GCOgA3+z^sbWC$q{s)Wl)``@U2(9nf-8L+$b9#yZ!z1R$ zd}}Lf`dB&U7S(lxiicB|Rf`*Nw0lml7#v~5HX)|gzt-gE<-M6=M%VRqmR6Y$>zmju z#nr3brVirOOyLzYJ~It}JYsLkN6ctwAiB>X^Yrw_qG+3!WpJg{>P`&EfXvqa%<9HY zk{RR*)q_=(xfNbQ;z=b9Z)fu<-B@ezUQDFy-TbsQV{29mMMw+B!}gJ-zGu&g zLyIocqLP89w{_R|iMr#Dplb||%gM=%JuXXiTTNdL=pw(!IZ&`#;R^#cpe&f>vW&}X z5P;i$z|`(4mO>=E4q;wWI$fOwGx-8dNMRxLRyWGX0jAe$UjyAVhc3>&%(+w4N3Eoo zuB-K>X*hCvXe20yyq&wsx;zw8*l=h72nSHp*Yzy_NTM$Al5O$2{OoG|J`m;a`nHu( zV^`n%RT?ef2gkZw)9XhPMd%{Y?@w^pk@k!17FJbV&vo~cwwLxSHv(kAl69E|%vl0= z21S*u-45(q2IaD}256>$pR^35KZSuiWwoTxbt*`BN`$mXMpOCxJ)jgxIaLCBo{$>L6%rv&x8HO*%nKs<(CJ)wGG9+8S>MC@Lsti3?#@GY;V%Zz|0=cl~=Y_4k zzuA`oTj$zmg5ww<)z1qMxbS+p^>rYnaD%h_-tX~lycr~!5gT7LCTG( zV$#7l`zTYasY;p}G;<4F3FjpU6S19TxnreK3BG+rSn~~T5frG=cFoySkd+rP-|g6qNI;a&oO zWTd7d=atg?HW`Cg_fEmG+{*gSiGRJ!F?HG7>9KLAwZL&P8Oj=@_P;j#lxT0hG2MhJ!p!vK293x;ePJQNC4h8`_3~k83kyO1?W)2gO|&TCRT$h8ca5QcUYSHI5u40rhmU1{FgyP<8+m z+zO>8pGPz1;&EiIA90fF#1Bb(jkQ~6uNB14{k2VRd@vh(X#0PC^-mY)a~2lo?FYcR zv#4D$XY&&D!Q?+#osSA@z4{oDQiz^i-=JQ-WcznDh9D}lFD~y#QgQjAY#RT9MM$tS(g>`&y`_z^v7G3_dO35gc zBB`KYjO?~3YBRf@KF=V;0i0G#)$oFukGV2&zv9n)W{l=;f1ZNs!Vp$DRNZSLxvvYP zK3W{j1TOeqE^BP%07fuKr{X>v9jRKbWGOh?k%t<+wznGyVS1dbnS53daG)mq4e-Ot zP0K9&M}&E$;O2e1D3wUau|S(ye%Bu4Bdje|u8 zxf^gxL4|@;e#OgBx>McA)^_n-%Kutxv()I)&APcScE|juiNYcCaR06BOyapQ--AJ@c|wV>(r7l+ewI&Jhca1VVq}2DT|~?2b=PW{(B} z=PtgQ<6fupT!uh_aIKCb^M|^_@`~ErL~XsP#b{h!ALkI65wT#(El)+@0|;rIgLgIG zyt2Ap6%ST@liH6Zj5e}7^|Hs4-y`Q&>aSv%i!g$EKUA-8>6k z*oPf2QDX;o-Uo@3R%S>q?q%B+hgVsjNXM}8evzJrkZ8zAic($!4jfFFPM>4yIzyAc zheLq@OkSJ}w8pA3IJly|Hh-t+BqSxFq@jerlVZi&v?2~D5jtg=Y$>vQy%z0)Sy}#zjrY#?Idg4lm3dbqB_)=eo>A*8Ohq9owvkX~A-)a! zFXP3y;IBbJETKl5VsW%Gxv6Hf;6obGa@clQ*uXpqhfgAF0}uA@R6GqQR;g@Ug(sJS z5E6-K-ecQY(7yeUFD;r!mVC`+ffEo4iu#-1$$< zTu@a#*&_ii&g(nwLNa5;UA?bEGL|e_ZtB>uU<17xe~o*tz-3z;o|RwBFb@yW3c4Dv zU97EMuEaUgEOA;)aO`az3M`{2Us9;`>YxY+mn@V=qBA0&{P&wfAmnw|s zx;Y*dbC?l`hmH^lISJAKqkC$0Uz`+JTq>5AYU{H?R73evY?q6eTEL#IV7WDd{2 zR1e7io@ct*4zI08pv46|F(oj2KAWQ6SLnoM$aT!u?nd*8V zslU1uDZ1C?fV`g?2Bm`T)uOA0_Ag>)y4Rb9)Uxox3HAP?$TnhqyP+@Z`6lISGz*5*L4-P zwd4?rdYA@Pt^pVq)B!T1R3;K2(>{E7`Av+!n@3Li$Bj+%o}8IH8wJIj%R57J3WvL@f+MI*c3u6-Rl8DLV0f(`EbcqM3o% zW&M8!RZUUZ2DGoyZLyT-{r16GJ**m20Y{Z{c+kSWij!Gy8;hL~X{@@B%*)~y_@G(f zb}41C^sqSHixGKuHBuZUk21v!EZI~bh$0R}iDT5`af%eXun$IqoCEZMosdMV^hG5! zPKp%KpENbp(3G1$EIXG{1@ZEh{(a{tstZDJaeMwZE`d|7t|l2#Nr2W|r;F6n`j_um?S%CxPI=`SvB#pG#^ZJF=_y>*oO@-(PN`mp;Zoys^0yb% zDpTgtdV4PM(o%_~GBl6#FIuawo-@@p)44Kf?`eysQAcvt?%x6sd_Dg)7h;f=gTS=q zY@-wR>QHf_+-9>7tESY<{hKA;rnHoRtj_CXp>|9;>dcug0vUM*_0+D}t6(?=ZS2k| zF&*4XxN{~KlUq|sCtIhXVZ!>)kp_)6T_26?_HbJB8i_&d2m&Gm)MS&68snxBV>%*Z z)Z};ila-OaH{LWmTXfpoMSEy?bVA8~fOM3{reOw|C>lCs$6b;wwQQ==X(Z+2^PE0j zObaHsuwO$c)7Pr~_m`epXU`u#fXbUYD&&ZJ&mOHhe$S=M^BPYFPHUaEA0jR;F88_f z2?%Y27L7xW(aU$t%tI3s`j-xSA|Jbz`UW-dgFgkm$U}Mx*OF-1c~R{{MVrraV^Up` zbyCcr^MYEXetbqoM#pZ#BEdjOn-gb8r-w4+JHg+qTpOcGt?^yOx;k9GZ$Vx+HLbQg zgr9hMOW%(=6JK(5u&KZ=&Lg#28cgUnRzOZ|2G!N|DIxc$5rZ7ZyQc{eI4Dgj&hvU! zYs1c+ou+Q%KaF*(f1EW^e_U;iue@5Z3b`;+%Q&Hq`l5$AU&ZhjwcTm@ zc%;?dX0_siVX@Yx2dq&V9Bw~-T>3L@yXH*mp;otM9X%nW4~f!M~;3;yRN1G_^G&bU;@gotEAS=F(SuqG+K`n z`=*^wR`$WEF0AWMhwq6fBW{Gtsc&012Q{}f{hCr0otyLEx}FYlgM1p-oXZ9XCC6Ja z;@j`U|3}+f2IUnj(V`y&_ar2^26uN&aCdii2<{%--Q6{~TL=)`-QC^&Zjy7(eO2$@ zt9lew31olSGd(>$t5^4Qr<8B2YUn#mmt(@(-dN^OOCCHSs+-rB(JdULb?fHpdYrQ; zo2d>*;G|y6_eyTh?oOU?Z)5RnFbp=#Sdfd_u{NzMVYy;b%+9dM4VXC|FUUq8thBV3 zY-3^3m`ybNG5o35_Yzs37dc50Q)l(0b6VhnK$Lj;Y+`;=w^L9?-v=Hc1Pu+sedLFR zP{V9y2c6Z{xm+iI#<97X6=$8QxyN!kTBxE&K46J!_jKca_e`yLXm->apK4~tLZh^} zc=vr4u9n%Z=@TdGI|jDz9Y^vk zw6G&%vRD>5fO(hJx7ru-7U}__VJ0?m8-6(6)Ckcx_H*4YWmae1GF3BYnT`AiLNqn% zo!{z&%KzVL^bS#${*e}!sNJC&or1!4MD{NIuFPnl6t}G^5%Bwp8A}Nh$L(f;T}L$l z5~Ra?G{h?HsuOmxTndMKmbuVpX55C& zDU=G-KTz)jC3UaAHB~wamzqlU3|tAsl9y+djqR108t#Y8B$@^$}mYSI)wP@K)6ql!4VV)3cTS;g@P6Vt9BxrWu@-QBT+ z)Fv0>?7{)~8E1;d!j!_hJN5cmH#sqii%AJ6c{P4P)sR9@<3US*!VXJm#zZ;7)t)70 zL-vDnYkMPA)eL6(@f2k_7UYGS2ItPn#@ygxO6^!f`s6YfL&5%+9Y3U##T8W&L&0pt zzG@D0UDJ#i*~K};tW=m3z4<;@dBgDcO%;aT_)mYQa`h{}e{6Z9{XAHw z?lVr~F&hFRVDzp)zdQl+Y@iZu#CB<-0z&e(Yq0nGUhKj)yC)}C>*E-RN5zW8E}*ZI zzBprPQrq&*)K&y1L9gEtLePFjhHrm;=3z19X?}$jVldXsjGrR_qAH=DmJ- z<%VO`n`WeEJ-6D3RZXIq)o$is8rn^nSx`45eN^p1_Q=V0r@>fbgR)gg1A8FcESuDL^+7bF9$4c!oObRwXm?j= z+3@WUdOLrXXMeNZP&Zf|uTZKIL5xj(7Gg4T)Aotcg|&iK#{F z91YZzW^FZuo1kxRjbE?4f6e5WEz1R*Vx_3w-=TVbCw{T3RRG#DrY8UT1|8| zz%agbu;gNmkqda}GnEjkYw*asUOz)pZ4(^i#L=Ncq~Al(PpLDj{mgyZS~b0Khh;kw z;P~_Nma6?x1NR}P(Ll8sc8g=(Px53aCF5acw%eJRmN53uh#>Qym>9}~BAFbKZ9P5c zbpd0<8To z6{vLFv{S!kzJ)uN_waDYwO6yHw4%q#e6GE{Iv#q(i&NEmT0MMiuBE29W^zSNU2zj# z&0=J9ilbi9()!@2mesOyfjp9^n`8$qsqJx)^3YFy(Qq5^(3Hdrfk=e(}`vNnA$-R%dyc1{>-TuG_8i%m};3`aX5i#KEz}v1#R5V zTm@>L!cMQ5Hx+3(0D+iHf2gL+lnkidQMUAj1TU*o><;ZNY>Szg}(6P9#tZsFl{})ER z74Sd7(RA(Ekt?k!aPGOtDKV0KDHx{QUU3T;%DrPX%)6>Yq-@(#y$Gg-R!&MC5y4P`g!#w%`>uyU}0wo?v7#;i+||vRmu7NYAsM zEF?n5JUU4}qi!qCDpVA~f^wxbn~SMNz4I@Ew!c2sOAeD8s@I%Rg1reKTPh%ih+N?S zC~(p0%1k7Sk}WI4bw~TytF*VQNGS3F$Xld0qUYCOcY5$90_*W6@*x8JRFO41Ts9H} zY9Ir_1;s^F57xIc5R~mEm8kTSz8o~T-i3T_TIu<8&OKjMr8Aid^==03FBmswh$9kx z&&hlXTlawo#Tn*O>^Y1$Ry9fhCXkQuIRBK~d#jm;*Ur|a$Wf}IlJjmQ`8c}<41OuX*X+={uJ?^+)#<(q#S5(P(eXZ_UZNDd--bjQa4d6$$ z^Sap#v!kv{Vdphm)P78FOT`D)__2=`wc6``_;ln-Pfq|QyG2;P(^cU{9b=({z)W?FN*Kazr~M2 zMDDsD%2@tO+4{J`8E9KcwRa`GnJt~ANXk!lsUJv~@9gH8T=WUC&rwtF83-XEQX(FCu zJ$4IvScXM9Iut02#6SXdDKpbS9GnN^4etTIpm3j)r6lITaY+Xq%vS-ShfUW;`<(q& ztSM2`$?_EM^6f#S4Db*zCCI5Ws2sMXUmrn4D8x|$AfSr@!PmwM)xvUGm^Pf#mp+|d zBH0g+jjrp?h$^Pj3IcTVbSf5@4O*SHid8N0=@BDcuXT^Uu|v>j-j<5 z`A&4%3J4C*d|*H!0d$ZMu;5^*A8j-CVe&^k2`~6gy?sVqGoeDA#WCQiKF1-A{kb30lqmxGw$`?_Os z;b(1#EOeBoE|bBDUB+01_hL<xm0kz`Ol;qaso1%)YG@Slz@Z^JnV#t@AZWF&;~|L~QrD=xJH zlogKx?x@#m=ZfF8{QYDreldyC7qunAL+xeTzYvd=xJR0rD(QRvvGnUhVQKbUoYzq5 z2d?p}1)f4qf!^J%R|C@%&jP5?##jEG+}NQ?pISLYl# zbT=pqTPw#PIlE`UpO`l(8RaVd?r3V{mF;Zddk0T{i~#IIW8YPFD73VejX0bRD*XU` zvScyFN?LIB0sbBag6APP{(8)&K!@4Q5@~E+d$+L*{?A|k_yvM1lY1$L0D{rvcV6fq zpQ?fpkr0G5HrM7*(yJL`27A5POzHHqm~ZI_l{o$|F3VPQBN@ggY}w0I?{2 zhYBmLX2jUuUB7~IKCB7x?MVlPgeXaGvjfTgQ6RY0bz`s;!!$+b_Cw(Bw@govr~to$ zaUq0-SO_4uH$%MT-he7VpEc&aL+`-^soN1b=1n+*0-WRaKM46gLBb)*=lUP?>!uS9jdAEy53Y3FF?w;+d6CKd0;Vnf_WoxH)0tWLX4$# zh+#!a20gnF-G$YygNUlg$^R|$p6s_V+BnZXO%Z>NFM@?OUW#5mP%^6WBtQXSJd540 zS8SJm#B)IIFc3%p=g1cWg3 znLQ1#`a%eSp)#T#Y$=L_;EMz+fdr9Bzv-C}h=NMNWg((;3<8NDL0LhdDEVv%fZan< zL}!4D3YgVZ;6wSwo1c{Zg9tGUjtExdt6t8B0*QfiG^|=Li;t#R|5pqDG-35e<#@}y zBZx$W>l6Zk@yTpfh@(KDOv!w0;bDwnt+#6HdEi^lvyDV|kVQoVb(=;u*Gq>$fkb2U z3WlGiFU?kyM_0|7!Sg<(#=Mqfq%7Aq4fQ1ol?mTnzP}&GlH~e_PD& zfeGrr$M-*Bej~k1q*!!-qXPKwn}5Vz&6Lmz4*&UIL#e;4$u4`N>ps%v1e3CdM+@3i ze<h*_?`=RY^sKrQK!N_mvdH zPc9@0HOkcFj$2gI4Kpmj2YIcB13n!zm!w24v}LjE##vAdVluymcbFc>P%M`|Qj}5g z?baI#4kvRuRx*LvP#>a|@3NdM7A?1z6_wkZF1j?Ia1Sa?jZ%tLo!%EM!!N|;f5K8$ zV+MgVj5Visj>98BCb4Lr6`u&o~EDY zeL_kK;=S5pL`m~{hUbZEi|73tbwM> z!Bd%2U^EGr>tQ{e0X!w${jgzKF;$&{!^yH;6AoN{(y0{qyZmqbBxl|Tm1?Y^sD#9z zdU7tLrBwd_mAIasD}Q$U_xeV57h(_3{sDXO9O5<`L5g?1zp8!Tekipm#z?d5rc72& z*eWC@QLBbi2Cf$g8s3`*2hS{Rv%9Y7UWV}$jKr7%EKv)Ht2`X{k}J2cYX|JCw&5O8 zRcZOUut-xyE5=+BcrmSn{t`9V)d-z+4(N^bN#h8|Fe*5luEZb^U0#8SBMaNpWuqSuG?^%S&cAl_ z;$U((l#{n-&BzYGSwR~Fw*h$;E+a-9Y|l^6eyCvV3~&C|ng(bp1^CE?vhoS>nyV%? z_vry;O!8)Y4Q(Svv+PU>Ut`mr+hL(4#P(-Cz;nh3IdJ@^N8VfGGB5G*u{6`2lA9xN zO|9Sv=Dd-~<0bjh^&#Tk#So{mm7HxX9GySR{fBngKhc5b|LV<=aS%!~7E=PYeAaSt za-tas^v#H3apizzh3#QTGDcU=(`UY=qqTZu=J=p~xn$k|4F(}MN+Ru zUm0IBcLgG}YPU`=Ur(haLRy>>LdfkXyb|&{&>&IFpMlHdo9F!hgE~(U2>p{AmHBL! z7T9cmtpxC{7ssXWD$(Z^d3TN8xJgc0f3Ur+LXrpU6?As&l1(@?m2x$x#+Pp42wXNS zC5hx3Q~tb2`K}+iueK6(23-iHYWZ8-fyg+#V_3NJhF467CHLo0pMACZMv$d4p=B68 zYCi>&tCoUS>K{TEw%q+u9W88U5`?9?Td-7*yy}c&Pt6Ft;oJJdLGyeq-t5frQatr5 zc>(>ihOzYNQ|+P$_1K6?ye>l##@Wr$W8?JaPUC;a0>M>LBc(%tU;T~FgnShoNTzRl zuMK*1U@*SsbKXIE-{2~T%u8|KgL_GQbmA?Z^J`~^I|tk0J;u0YALYw4-+k5D(UEMp zU~(hzr9LOmi}SHM-sx2@b#f^{M0VZmXV;x#b9bfKg)y1b!KUdScD%N4;G|kFglPcT ze?PC19IP}xaOTqGd+oY)Xg|(ma$GTLrLlYn`@+aDWOF3bqmI|H9hUa0K=l7W$IC^G z1_bsq>#k-gip!Jn77^cH^WiffKsxp{b5i+te5zV+xC-QUm>D;GTj~l`rhFMINz%a5(B7nQGZho-b)WE zOP}fL6BNiwWjBEM!L$mh+-!PO0tBMklrPmWp*ikC681V-V*gRKTpy8Z?c9B5@b`3h zJCZ!bUoyU&V6gXp$LX&Ec1^Ea11fy3Inv_zvJ-kU;Jj)(L0|EMB2;mJ(d zC*4J34|+y<#;jeN(=&$l)t&I6q+&%7nO>nP#;NFSQ8OFxJH_D)c3Cix+GMC*?U!@f zt>f?X-)r>2ydyGWuSYNISaGHMi{docV6uY3#pNa&k`X-6T6H8+${|41sZGwH{=-Avm>RAPs9S954@dl%SjS29g*vV{$s0{Aq=<%@`46y2YNdAQ@x zp3)@A5g;Cr@z~9<cBXC-jBKvNSxIQ$Pb%m;{oHgM*^4$DF{HUbC z{+QTJUfiJ;zjb-@z(%6>ZME9gmd#F!?OJIu?N?^&-G?)t-T8D&(6{w5w=apsuC?nrssEks8GgM+V~=!xoqVrmghRl8 ze_hng@t3=MLl@3VWlCo=Z&vM}y}@;Ov#bA}1h~Ebd;~bZ{`2qu_f2nY{r*2cm@Nz+ zF6cd$4jb5=NUM#DjlIQ&1QLmfBMK(!mm$lOE3VLJvc1?6jqLjt15`!3fV%+b1~3pm zfP?;63(6Xx2kg4YqHb<%WO&@n2L-`|k`8Ko>n<4g&+Dzq(AT z@^pV+wZ-vxf3olsTu)~wfG4s0`qwWnwg;W;tC!uhRHNDqJYsh_HLHQ-o+BV^dT5Dl zb7M(sY)tF6ywgVt_IHthWs9tMdGTyYCgVq8k{s-(BP86|8_#{cl76+{_zlZ`)SoSd z0+F%X-R+!_mI4&a`gfBdL_de09(6B~V5%V;77M=vVX)-mwU|_Fey9YiL)MH_&jBw)9y6RgfPA#upIB#bIT~%XXr6Z*T8_ zVvwy#9+{Yx0EICZJ24<_WzvCX1TY;N8yPER%#R=K);fJuYmCaZ+EO;z0(7?`f^4_9 z8hX_{tK6)8wDrf9%MWMrESDN)-*KexD4E0hoQ$UMoHqY@hmoC0Z!C2I@fqZO>5ys3 zYsaJWw1S)=v-(r?^q%n;3GLDTCQYSjnQC@%#{Ee`TZHJ#Muu4Cr2qm;;ok!tP~tJa z1OzZXDG#ba7FO1V+FFSuIs$B@!RL46Au*KCfKCL)>Z0#d_2Gs_MoNo`iHV5FP{ebM zeuOx`p4Ilc=qClJOc)4oiujPtMyC~*-A5o}Xx?JSC8NOfUS-w)(5k4Sq}civ9DoE* zG1c*=93xtFd5t_eR14RR8FtG#7fK?kDWfbi_02AIF1qst+Ifed#uGn9EHlh>u->GU z{JPl&NI90{)fg7ft4*~T8X9ZAEyTxFkq%R~R@WVq(7vdbTv(X9(m1?dh+gquVYj#Cz1UozYS#nFW$)Jh zst({X?D>cXT%2VCnFQDoK0aV|YShZG5qbPg8G!cx?(0*hN&wVTI+expV5*p&o*vj0 zRvNBA2|&>pGjnrp+(;tP3py6J+mq*QTCZZcVxdTNyHbt0rZ#u^wp9AjLHdVOO!eD@ z#6!onWT$5{_r(>pw)s2<&en*?634BA_+*?#F;-SruqmN;#--Mq9d7e5UEa1A^8HZ6 zpx;uVp*GIG;NGrkJ2?jVHdW^x?dYoK7si>`h+J(tFI&MipPyKXw>hsx^>wxs9zEQ* zJ{F+E;j`#gU$k2Dd6Shf|8=$A7X2N+6(+|8t)MKxyGa$wqY5^8kPFHJyTwjzjEVdE z#&6>c7o(S_d!riFVg)lMOcxD#mjXCnd_8^r-I4UidE-pYW_wXoK^LxxT;a$Htu_uq z!mnDwJWJ&<*^?(wI%R`{0~7N-Gsh0;S-6#U*;RYT4VQ>72@c`|>hBx_GdFLh+`ww# zSv#KLOMB%TTutjXTM|${aWXPG?m1*tMn;MT8Gv~!f_EkfRVfT@N*A7gR0YXY&pso> zarn7*jvt3IQhMxax^Hbp|EGUFV41J7(2J?DU9jMOxVpLujY_?T`vJk9M5p`J-Tf&H zgHcXi{^N%aOqhtGF__^b3=A;^`#>3C8#ZjXAK*TnapdwDE<4Giysz#=D!@!5x$TzM zt%UT4#SItK0ryEuPok>8X#3NSszc{|rM7hWGzbXrRDrl`()#wdz@}!XLZLt^)OM_) zVvP@qgJ|x*Za+-14o1nwlCIhx7Ht`Cj^OcJWg~)eG6&lBrT(5BV@|&Mv4r-d6{YR5 zeV91t=uw4*iMuRYE}jE%|E4;SUPQsNd)utgq!TuoDRJ}BAGBGXQ@gC*ICHZjnjDA zkVWEGHB*s|zQIH?KKe)EMo zqklEkxV^jG$9HsI7$b&MxC)iCE3Ir(6YbsI+24J-{BAA7xi{cnTUzkBZ!lI~Pz9;zTcLN}cR87d*n*UDMx46fwedq5xO=2Y0%#+iochB`a> z1O)um%5g=La>#74`z~9>@)?pP;C>KdBTX_<3k&<=Z#Aqsi=|wJloL-+b7Eognn4R? zR@(@wX2W*Agk${;d%b%zq$5_62V9osHOg8Q%$T4jp*E;BbtP=T7-k;8o{v3ge`AlG z%BOzf{}tXPbynv!^C6A>`^(n%oa_ZI^H*2E!P&!=md+g7i2d7B*`AhXX@WLR zk335_(d7k0p#+FsH9&E~bwO?=BiTBSBda)PnvNC(=) zUc}wP!oqT-kL+Il_)5^R`Z}$w-P6}cN<=i2#?DAVVV1`brHkG~5@o0wFXpiR>qn__ zWr{=rVC(TX9m5Rgudc3uz2_p5>gI;AT(`Z=nP#S6o$S!S-U{k%?J@d~PacT?AVrT^ z0~k;a87`+|S#GXh4q1XBsdR=!jDfaxrUv5N>Z;e)pZC7_8Ez*{Xxi@d?CdT8IHMXw zLPEN^y>)VO(r$G=KbS5>qt%)+VY1s9O6GRE!F#>y14fYfa#e`k*JU}Re6E>n8=^F4 ze#6wz09F)!c@ZL}M56Z(jl2QV=5iIbiP5v8`5GokN>n(2!{Cbu;z+le$P;yKThXCo zOCKpHD7anq0$ih}QLf9duh~BrkF~v?9fXC2wYBlO>7e|8)@ygqo+$-|(wSOXTDVwP zl(%ZFyZtEkrjS^ZaAygBA@>`}<{|ziSrS#Sa&~cbwQ|}lUTk}9ElVgjnaLDr9tPMZ z5U5Sdnk5xLt0U>0PWKnv@Mtsw!otW12vJ1Isj22wDm0qSKz-p>Eo%dVt?5$bw-e@S zQaZ3(7o8c2;vdKcV7cqsABO-CU(D9pnhwxrJ1A((glXM|je$X~bQ*xOu3QlDD|}=_C{sriPLkr_CJ5P-Be6 zT5lZ!_N=#};h~8~(PDOKx4gx-D!@TqLLXB4{ZB;4xFLz)V<7Ho|GJI_8xw;@6xH~XNDRbh zs~lYF*|?|@0 z0s>t?GXYhN9{_Miz-D86I}d=oy$eibQDJ?fv}I6#I0QuQ)IdQHq(4R>yfm#(Rw8Ax z&Emn7C=R_o1iFkz57?+=k%`3!@B?*VM8U`o@|>jz3twQm|N3yiX=eX=0W@N>Rm|Wb zDi+I!gYtX#?j3-AE>LfPg-T%(EmmmOpy^np6$Nw_+}p>;hYvq%a-T#Z2?g%QRu($k z59f?smkdMI7$QO0RvNDyVPpbLt1qq8)+aosr$@ssR%&wYVRFS`GSwGo&^crb2!f^P zK(LZ3;8|CVjli`arkS+r=xxpHA4RCZ{ZBgg95dE!RATZP8`jzTpuX9cuz*Bu`~P{mJw)NROG8z zc*}Y`gaD1yd-C5bki53huy%NiHXFiM*PxY|pYsll_7z>U0EHcASNh7CJ|)9D1Tk+;W-!jo5>ot^pOiGb&tBUk)2J8Jb5P4N78@JC;K^l+g% zHA_15t@pz3fZDf*;Smu?5a7VR*kt2Jc@y#b_h77mQESk4nbTCR>n_l2&L*6+m|By! z=Y$zW!@rWwK-H|;aia+Ezst`OCvevm({4q~Bk~c5+Dg96;AP^30ryS&Nw*n1G%pW3 z@a4vXzn3Qz^36ldevC($o_x8-%V7Ca+0=D8a`Nz{&=L#;dQLmiF8tNy5r}kUrv3C- zwiG?;v$S?!gY$@#dA!j_0}Vpwsye;pbOW3EPCFt!KxY?r%rq_l+z*Y>Zz!+E`OEFkm4XErCux?V*&A@ zq8QBM5;rt*CdUL8RMuu}h86=W4ga@y{+dXA?b6at8jplpEnBBG409_^tM`-r=J0)1 z8%G?@za1ysj+d+&=l-Z(mN)fRL4Ec^glkhq~nVK z85SP`4v_&jI@0qhw>uE|_WJrqw{GRE+xdnd0FTB^fcfM%0&8Y(W~S-Zg`NWkjT)0w-5oF!};#6#S9al;ma3t zpTiZmGFBLri<AL%5G&>XnsoyEv7F%hwRRK zweW=HcCiUGAqefOI+F#Tjr)8St8SB6i^7K`B`IdQtXDXxNm+YPFD(#3zm155GoJLw zf(~MLP>uV1TOPah+juN3ghK9jY3WaH)mog-IM&rX;H~4FaN8pUVT|e^@M!7?F;mGm5h)ZVhN7yQtMGD$Uk4x%9GG8>*_l>_P06 zc(}NPe+02mk5r^I-1~jHNmQP~WW0{(bsP@Sv_?aJO0Szvbz&xNtT~IZ_PI&qTc+H+XJS7F35RPAsA`Q6%&^3;86$JY0Mm`g}t^S$5 zw{)W@y{+YVmnAu(DytM@t_RlKK&w8U##_q(B-|HG$ydFG+n)e;!KNh&dKTw;smtb{ zLj`UYUNnK+BFCwQCSZaw%5qgClDCpTM9_uBqO{~K0%vBoGjLJO^$~vAEg_sb@UR}k z#t&bNFevAbK#%p}!-&_*ZabyVnYC9uWiX*+^a|y>#Z_xdUbkSv;M39MdcFRk4)&$xy?^t8#>(?Z+bc~kUZ%qu6scF%1oo*bxR?G+8vpO;# z6B&QJG{EbEf}~hTYjp91`!v+QEP2*HZWSGsBz-W~>2f%_@`>;S{dD0^exI6E(4zMx zp3eF1=dlPa$lmGPew`_vAMpeP8ta$tA!oPdER>X@-|vXp%wf^DDw|k+UVyemJ*vOH z_#qmm^)5)_+d z_61nX+H0yov6!vf$89vK!3!>0;omjJqi>qrw3{I=CdT0efKj_$C}`+H$y64Xi>+e$ z!VLB|2+RohJQNfIr?;fU#HLJ`{3u%-fV0rCT?}bKbC}RTIixXIKY@5iN!`+5Q03$p z{ZcTnF?>@SLv2_bR^w=AXi9$MT+;~w>TEc%P?fDWY#OQSu$6aEG!JTq1U|9~`;c%BCPS-=Zd-DA1M{^)o`LIVo7tR7@OKh_ooy5wD)m zC0Nl^qf6$7MATSQu1uNGxH|N4)zwrqSGO+xJREjkZdB&B3Vu{C5i7;M9H>u7ZmP$L zpUz(#YVpzqLzhRIjdk`?LG{i95rODADBy^Kf`g$@_+!Wt%wAd-J;j=k}K1k^Pu~5ctCt2gh^LLca{Rl@(XKe+(`QadJqM3L^cvJ=*y< zD9kL}H0d)eokw$5_qnM-s-Y1bL0Jlt-Fn#d>?t+1iPDWW7 z4JmMUG!qXCD>WwOViWHb@V+y4@syqgJD9czBWSc6@JW1oGaB35VRr1Pxw1 zXl>Z>IMh>yg1_kfgW08;#Gq|p!7w@ zy8X|yW&L6XU!yX< zL0i9};k^=$x2fSgW*NbOEUakx}c2-XHqh)a!dp1<5Ow)lBMn#-ra8b3VCwt%~m?u(U>05kkOq(48 z+~0!>l&b&^QTZ4=^Hl1^G)U_)64AhO4D0h5#Fu(i>Lr0WAR4i`-Epc24)XU~DzdcZ z{R|F*kgmNQm6EJ3ag!>Mtf^a<4}AEFVbpj7>AE$M+19Aw2^7OQUR7_oYfnGLyB(Gu zNa8fU(Ku^r;pK8aFtA2?#rlFFE;r1p9S5QD zT3kQ*7;&r71$~+N#{=HFev9XdJ?`;yi9!j$Cj;aIEdh-0t_%C0emmv6=NAAy^FCiq z1|s1sw7EHHXru|{21iDEJ)QS$M~iH3ZaQ$JYgI-@L;x7T7a!=@;=%doXXy{w~QhC3qM9EWO|wY(0^2%`H&Zf%09hy>DLA;q&vq_JqNhp*{F z&T5(F4`9q$wRB?KxmpkFOPQb^@@$zz20{qYLA^ggnB8O9+h6RKiZb7s_e(3I;aQw- zC1I(tU4}5>I0M-*mSz`crY1v|VKSC>b}k2tY?b3(Bl}x*#l7p#Nf%lkjL2Dbi+9T0 zQZ5{pG%LqsYK>k~x=)~kRBUUQexaE4m!J62VREfY=PC+z>l0ji>;u>7BpC5TaP-k) zqP}A~L7=a>MzFpx@Pyyw!Nb$p--2;hvl0RJVVL+R2oaY}MZ3$=E#DUMel;zu{Wvk- zY_#D%^*m_&1qOn6w=yP^mluDu*IZ}qgw!4paamm4)E})}OY&~E<`kUQYX}aAJ@XjG z#*(68AB29~V?P6WLu7?XGwcpYKHSHMY`Y-}x1tHO^Icmv$XDDa>s; zZCsmY;LT`iF6OOm}QtWmB;k*+? zxVlE2-IF=P-^(1hbrkTcV^}gFbe()4pjtsRzUs+R-$s)(Z16kZXaQKh4QC&Gm=Gdj z(GL*sK`=4kA-*v0UNYYN{=LcsgilpFubFLbkr5?gXTq<`Zkcum$-fMNd;FmnYWce^!|!4l<8Bu_8~0eRC!6;-t@rDX(FS(iSzkeR%ykSkewmwXsboAB-DKVmPp>t$9| zk_1hFKzr28;Q`ho(_HgkDT~t9wI1XY$*@(Jmf<_qW!6HlizBngQmx`V%3&1lnD(sr zkPj2F1lu58%o?khm$aoCjW&0BF+wS!JIp+O-cViV*3<0ZsALO8?k~);qMRq-dxGz` zNRtyg{-U1V@fGWY?7)WsBlvSBcP|8RIz*xq+FTf}LU9qpd{!qzF?{u& zJNMtB#r^Bkp*f8bA{)(Zg^oQz-juoazk^+zX;{t){PQ+Z|0QJU@{Xj+w>abT?3CHvJC*NuF5ft2g7$~9{)KcuZcsh!qNi| zQak@O&>EQGVVi5Mnm@{RH*v6>)NYo5Hx>#%B{@xdoCaJrR_btg=6@%cNY!xH&VG`A zIBRuDlY9butkvPF?mmuvi=xb}qFwAY^NSp7w#>77Ett5*UFdkGF7+3D=Hv2FWfOLa z-51`=4822o`GU2y4|?w}22zC;enjBzzenkla(KVC5^^Z&sz+fck^lLc?iBH2R{>C_ zn7j^qhT2CGE;`m{uI_+c=nP}FIEC(UZh2cuF)K1|;1<|IP|Kijnz()7>(x$2y@Qpf zrPmcH>rfhlAw^V}08*=mja{sZprTkEGj>pT5{5M!3fNR=`+kxdkL5up+W4224CfBV z?$n*9exKxRu*Xge?R^jjkF#1PTSwlS4>%-UZgxVs8`3P{tyhF1is{^n%}JNvd#2A^ z8Zva#leKNSuajiyyu=+jTu~9}&?`L6b(UEd+HG^JPP#^>g5$rT#Xw12y#d3gwSQa! zRugTUJ(XAPx!v{+k^m~aIIeH=+_fz^Ir)wLXTs$6c(A94#{^6TK8i>rIWt0TY3X6C zG!HD4U&E5EI6xkA;Y#0Pz!6M52kxslyL5|9=lG6^52CU3u9K^twU8RQf!$Fm(-f;J z*4g%xOe-@O2b_u=Z);>b^?p1|sMJ=jyUJ$MaFO3BcQO0Uhvgbn(qca!5Pz^xqA0En z$t7r)P*&FJdmi>Ou*#iVsoCP$kM+F~&WPH@NOfB=B47%RVo+l`JYN1Gauz&vw!CZM zTAF6wtW%!J_&&gpaS2pAVJJPM+T^%Av262cC`C3$NxOMbhSJl%Tdb@??M3F3!fKq0 zG&emhNN21Rx0dMisF3CNY{gJon&4!%iFV*VaWla95~UjoO{TAgzjmo#V~g<5Dl_p^djt7@u2rs1m%rVv6ewT=v2F4-3A$=-ww;>lOF8EpcH zuVeJQ4N|_z&^j=aSpi)H{-l#&opcjk@mV2a*)k^?VunCE6R=0|SS}Sj@(b zFKP;iG!X}@C*;BCf6GHpenk2tST%1^rE+w(-i?Te$j;7=8`-ySZv-SCK}Q3GrU+3? zhR`4Mnt6+CnLQvzd4E(h>Ulq?4TM2h85v{kGBSqAJknK;7xF0&pX`*%iqBp?X?`XE z%_U`C)_~QX%85Y3_?RYthR$LD|G^JqbsK%?DHgcwe1h^7BPt_E;`?P{`p?X+Zf+uQI1^A}kUT-Cg6y-QNf9m~IeBvA zp#3_7k?r2A)~>R$G6BN(k$t1uu1wq%%*$R$5+vmLo*iB*tu8>s4gmrj_yAre+21Jw zX*Dbu1LJuy_RI_n3@IroNZ4#+Q&UsR%N{550sHpG=m8}qjxF4uL%)w4JGSUv@s<*$ zKTpV`d<+&~NSP`#xRD*vYA(z;r)D6a$|4pZu(YB?4mXf&0Gzh)F!g z|M$k{Pf>$vZ_M`J?|y^-4kU)?|Np<=A<}(Ce_yToZ+yTI+J)oH?7L7B&V-t z6F!BI9Q@)E{Sy_q6<7AsGdGo;-m$zY47Df;v!1H-k{VNi=*4C~l!xX?={COl>}}Js2Uz<^G|HOUf^8Avk8)V()B?qJAx>%M!$&j0Q>hiEXo9TIJ!eqWQq5VXbbw&`m z{+S9s0Zdo(L>2WlMEF#dJ_ClpP2;};cxWg72F78UH(ct3S7OdPw&Fx#lpaCC%Q;`w zLTprWFs1PeDx72BETpP_%((As#i7v-0!}7d;F@0#Z|VBj_yJ2q2VbDZ$hA`>>9BSC z_0!7aaC+OY5Vm#GE{@NE0BMuzfXID6;AT$s{umI zqsWG{csj(k_rucrPV??dt6ig|D5dyCIq<=gi77XMUzoT^#mec>_}SRcX)v|OGp z|CmBE#;SYqju&>zTqHo>zDd;L@{NT{gzyvON4O(G{esdfi<)F+ZdC~<4ICC;E#e>C+``*aKBzmdUVXWN4w zDgBMX)^$|4t}=5Xu$galZ@pci?=qZ&2^!`d8;80RuHz0o;@FRvb3@s4n`7ZX7S`Vn z$TIqLxwsMxW+&k87vQASu&uS_(v`Zq-;{k{ zxu8E0V0-`hcOt>>ADe=Zg@UX*bAFP6ZZXgYuE+ZDAu6v(^-H4S)>wwT^{4lV+FqVs zdiG%NAjVencUmH*J8CZXd2!)v;g@{#zu819-bFg0JxHIrJ^Zlj@YuGo|J|71uw9bo zr@j`Eyt%jDubf{2c;CCus{MLAXx(PJAp5=VN_z|8eKQ0= zi3K?b{(ve$5rb9C%0p`PI*Wg3L@B$fPY%8K7`VE0zKEvfwM|s8qQpY#wx;K?8RBY| z>2-g-dkbCDyWFV51PUtK@M?9_xY>_nX>C2;cUq|NV!BR@J?cW%dVSpGG5OqjA8zUO z`m|!y1-&>-0G;wbiKR;fq#2ZOMQ@SFGuSTW)+wl)7gaE>qj2bytZ{Q-r^wKRFiCj{ z;+j`j9xDAGzTPq{j;)Cr9ei*nxP;*D?!h4toZt}L-QAr8cXxO9;O_43?sg~VocH_g zpL^$-Kl4oQp6T7at9DhbTB}Zer#L2s#~uTeq7VwVYN2mEI1INYs60D0EfTogF7!MY zha4BV=(nE^Nt%QHPAKdZCu|0edv5e$NRlGlqu+a0fzg+YcxG3RY zT3eleUVf*n34TcqEMvknC<}7lSXswFbaWzcF`pQ(tteLHTh5vx2=pldNT5CMDR9II zRr?mB^cP2Ocs>g_Sz3n$wYVdDETU{zop5!3nViM+q3>UaD?8XpQM zHt^7@XE^6wnoPE+5V+kw7@9)A_K52N2SUwc7l99}I*$+uOj9&@wEv&kv3v|NkF^8( zC;*U#^~goqi>s_?MhmEYMRMUt8JnpfpP0>HHCoLXdtoLw+xEem0rlr-d5>aW@eT$t$j@BLi!fxo{oVnq`c#0CHz z#N$I*4tV90_GXl9;L|9Yp@1mh{uG!zNpRtUFiJ=j-v$dVR!xL)&(iBdXKm1L}Q^q1k2A0a8-2;oFh+RIGV8QYO6uM2Ht8P1Y zi;>w+!@kTc&~p|6ad!P)7;mk#93dy5YI7LR2TlK+$c6-Tl**UBG8QUDsPWJOTg~ zJMV9WAH@+K^1lgu*lI{DW=&hXkR_U;N{F@yV{05M-``eZ#4>eXd@bYSJbVubz!jOQ zc}+I3tfz4K@R=_Aju|UPvGM-O#$Co59E3!~H7S|3yfygTQm=qMW;?^r`-$(2Bn8Pe zED}zBuf!?#e{Qgay<>@2L<;?vi$+)!;TF9^DeuZMhT*r6Mr^sJ z$Uc01jnC~5xXz?a*@fTz2_^Q4-($c7#YkSnT`Dv%0p~XB0*~cj~ zR^yH+1ED#bu;WBLpEUSM3~T&j#oe1_z?u|NP${_5MyX@KsCC!sKcf!Xcdc@q1bxPc z^KdHBAV_DkQo1k7TZ-S+Wu3`3EcxugZI>0D9v%oFW;VuJ`VDfZJXJ(6MfC`>t zbiwRxccLu##MNh&-f?d?R5u6vy@%y*c@53CL1lvEQ8*%Os>c>*&u7I@jaYoI-thpj z!>?yI7a5YUcoF02!L8)0ymt$|Dep%c0_HgS9G`o$|996nz(M%Z*HnB4&fsJ}z1?S) ze#2#EHt5T*pK*>O7RWFuKLz0EB{QM{e2pj|3`n647-OqsikyUiOo(b?+;>7CgD?gQ zh7HRI6_zefO$#B079dqZIVM*U5h7=4qCf;Op%==X9>+_305JJY+uuH~Q<1LsG zGi+?1=4FfleCZRYhB2A_knv0@)x=iS2>?fPKMhN!*5&>UuYqee2riRvs#CKy2t{pgyni9Qixu+QsZK!$i~yG!tMjW zy0I0Lg|TzP#4wcgBA5#(BNPI^w+f%JgJPQGtdefmX;!*!NQkcIX9dEvl+w=iO2a*7&sW~zbHjOuf_6a=Z-L{Q&L(t!Zc+mN{L=P?1{8tMf&JEw zg`ULUZ1WbKeE-1&{H5&`gz_2kSxyLty{$$;G4`?&(`Uj(~erSd0<^8EKAj`PL!T zOJ{NF_{ZBx`hM0D#sW%ErWrOL!w03OidJ8}KoXV-DAOpN%kJ*{d1)ET%+gfAeqZKu zvfW~un^Xk8Yr0Xeb)K`!xlMd%t+D@-cAy|BWE?X|(`G@zWvpzW{`=~$g(sZcnyddJ z4)b$dS~Fov%&!oN&^74L%y{jTqbR~%^!z(rBE--&pY`6pUw%IDB<^TR6GA58RNWUX zBz~I+ezXI{tVO`PFShS25U^l|S$Q9q-DaY|K2`qW!rl}4da^h#N4Eo2Ii^FaY3G5X z268brF=b&`g28|Q-A!xA!;clPgL9ci*?KlY5T16r!Fl80tUKz&qqjK&D855ip5Ad% z13wUv*Y!AkqDW4K&B08uV2&dx%|S_)hE6SE1idVh*_eT~^=b>k|FwQCzipYjNj#7G zM7#2=nXkJ3KTpPxi~xhkzQJ(x4A1JMF8n6tU^|Fp{T*)~0(=$TLF-O_=<0nev#sh5|cB#A>A2I_%hd?g8h1p@+6l;@aP_}BwI zYm65PFT8Y@SD(H=2?|72W8gEndhtmJ@}sEbc5&&fsM@> z+tX8^qj{EtmJ~-CMdSg&nFq7dAN$H=L9*gOtcQ25v}x7yZs59-NQ4p-A0^_IkWvO?x8_It2CoyyJQYdlP(bfjf{3(^H2K0}hD z^Y;eZmi;x)7u+`iJnM_+$MQ8Hwt=~YhdI*Uh3lR>F-#Uom~uu4qj2+b-kLLJnVinr zgnn!n=NsO`-WtB1RUl%C_C`E6J^KPz7nk+XVLbkfyL z=hIU80t%596-_-@Ec5BWwDcj`XF(tZN&qNY5NwVQ6LrrqCe<>I^|TG9zJANK19e7ZPcAhSC|Q4E zLC4T^y$bjCVkB3OB_!?(89(tV94n*GYaBOLfhrF{X~0}Q5f8x6I_G$us--g7l4Z~ z-!1YD+>Zv!3K&iM`S#aqc!tilwy&Zd8`7=*Z^m|GKW?t!LBqC4hP*v;*%xD)&2f?e+i5uh1cootn6+C&Xw2aFj7Yjt>AFe>mX zm+enwq7D1}WeGeM2P1@jXUxq^8Ri`bD_#T~?P2cC3>fBbKqaFRe3tn)5PH)c{G0Zg z8;U^_o+ zT%&x_LTc(!4Mno!_D}Z)#UXrKE$ahy>vu>n5jjz+Ei3>@NYm-CXw)o(&6qat05ZU> zr~y;ZXov>zn}L_UoiuuupAltW9Gn^-{S)z0BKOM*4W8oF`hfSuL%z+ipBGC{G4a4cNv+F zh7130%a}nNU=C!I`5+(d@?pRZiyD9;L`)0}y}J){(Y!#y3w6<IO zU+Kby+U05+06+lXwNGG3JtqYISl4$hduEoxVJ$vNTKww)n2T1hqVAbI0 z{(R#h*4!@#GwkqQbLBHu(rQOj1?pgWk?Jp|D=U3 zShNTeN9VG#l+hlii3p>H zVgtrhPr)Mk*BqGuTgz*70B}S8Gli)t8PLioz4I}CE~~s?n&m`198&O3X`7WTq|ddI#rt)pm;99*^f+q^4f_lxS%rIgev%P zIucsV^$-PXJ)x^KOlK7a&)oN=`qlyg7WZ`##fEaOMYX%hHy*gQ>i&M9lxBXXJ#zfn zDi{L_tfkhw#9_8FG99&>qo?QH^~(v|YIlDO*urgK?Q004tCRCpnu6no5X7ZSCi*13 zmU8LABFqc7eZhyr>jE#Q@C7%4%9}sGwqJA5(oP|6t5_m}NZp=NW=b-X2~5`9m8j>3 zS)pfo`4|X0K*YDq_H2~=ujzc&i}n2L*)hNa(E`7VW|s_O1S*In2`38^(*oD$)kChmb?)Y@ae7-%a=urbpzEw1EEM~JhiB07 z+g-Ih$u^W<MWpXt{i|Of>U;>t!>UuX{V5%SN;y4x?kw`qGcX0os~-oke?loUQHDnJnk6 z3MmresVMC#TXOAKjn;wz(p=H|-IUo1O*|SR{w+4VO``5a?bTrB5n*)89!g?M-uMe> zI+EPMY!J(kg-I0&QyRpD0nU}8^t&Q#3Pu{W0K7*K zSg0fj1QUk*L|a@MWOaZ0gl>sR&R8x%Q`lR?D3#ZH9q4p)HJZzpXJ)15r9m_d2PL+@6tx ze~g+7T;4H{d{STd*uUt9{1|2aKWTp4?)W}6oaC# zt_g@!pbqE`?6q>{N=wi)VHf@42sW~Fl{BPeZS1m}GrAd7t}h1_5dG~IUZBCCg$~|U&*gBCT)+|MP75Z(Z6+>@{xB4<)Gsyz>WYK zJL0K+C4TQf0bhmW=td-=B-tp#6&7%;(~F+R#l-(gANJ_kkCEp-D66GLo*f7L7Geae zpWL%IjZsNT)4P@&wuHegW81>Q%9EW=k-{z4u&A_O!xSt_W;A^yA4_H5B<4mZD=&;~ zZ^SK*88tYp6w26a>XVvgKT;Q9h|0yF_M86d-R)knu2cM$5mh(|Ul<5h;tXnHxh32= zBZ@&4AnT|fGan?z^`~Vwh1=2g+&64d5$A| zbnqTOlnoUK&2LYdf|us8-(ZjUT^(9cbW2W|UbS<~k_uv<(O9-yDo|2aGJc(5P{TV7{N_GLNnv&UeWIQ* zDig>=W12$#$z{bi>@6UFy@Nu+fgRNQHy3&Mz6rSxH z1j|5z8%7rpBp>zoO)Fdyup7nTx|tx@A^o?q$N9YdQl9NAm9TDi0TQdSl13HcHl`q7oAkanob9PO+K1IW{_)MIJI^)Yz2H%}1YV zMoO&0tJj~)*K6@Zyk;WXR6?DwGB{O*I)1Z2QjoJr?C?PQ~+zZ(kW$Kn< z`XMyFit|&NMx4AbaR5M&YR}JpJW!|@svqf^Txeh&5h&QP@pqRo%_bFu@-q%SurHf!8rfjcLZU?C^_-5~EXfqM!C#WD(T|lKOQXc1y<_AHw zhz{5OoRwj}Z0Ax^A45OG=T>v}P9j(*3ej&z0_$2KJ232RQyC7??Jvf$3G3b7t#2}o zRl4e%(43#vul(5q=?{p!h&*iDdUNn!u?2N)d&Z#(fZZ)M!X)R?S6iTR5jZ`&} zVCRxo(~{6GnNmuAA_>UklQDpC6}Aa4r4BUm@4kzZqyp1b*Hpwwqeieg#L_3PHG5oQ za&QT?;Qeb*xi>iQ2!|vKhS4Rhn8`>7_MBK}fb&^0 zfb_E$E_mlwV-f1v&Mm$z)w0wync6qixLCh^Dj!?pLlj4P8_~!-x8`^WhB%^2Z6vBV zJGH71sJX#tJaDsXHpJ6XIOcsDCK4z=lVNQHEtGYf2oM346;kt?)bImh{dn-CoagKL z%ty7kyCUoCn)_yN5Q;OVVgA8qyDxHDC#?F&U($=^;Cr{gbX9Kw0=wq^(ZzGwh zOm?fI_~^o*Qk%35zlq{c_$8{_H{DvQWcIONmd>rG-a8Dd3XJa7?*wEFgfg!;=AIWG z7U}$f_f8tB9vHK*v-#%&rfpZSEibGE%wmrEWLYQFiXpvomV0TTk%*}rHX2!SkUzFx zbq88`1YE6FS}Qy4F9px87^3Rg*@J(46X$N-USoP=aF2IeTXr8NTEcm!U-wO*dq~{q ztlmr2-U{8AVDPpXP_1BWyZLqPK0kl7ah15$Xy<>MG63RxDBGu5AY8p4Tz$#pvz@cN zKC3HcjBR_GU<@!!F6sA6uWsBh=bXcuvVc4Av#(f+i?V5ZZVy7IXjO`|wd%%b+neZ- z8hT**@0O++50U_+z&I&`lM(I;dRodEQ%fL`BB>*~b_))@!=OmMs#X6~x$;{vmc8UT z6ZX*vv2R5opc8jy|9CwAV5%(2E$t{i>zdk`gAH?#BW21Rg)Z?$Pr?cSw|Ww9IWz0e z`8c@1%756x`r5c*8U(#|Uc=v!a}5Optw9(Rb6&)3yPpOFSL=}iXXShIrSUoV3o6SH zDIpJc2UyTWk1%_p8H5(=Sn z^-3AyXOo9daggHSvIj5=07|M~$weNjou=JXhz{(3awqre!Unj-p8YzHHCESQp2+T3 zf`XPwD4c|QK8IS*WwUiUoxzYdVVOq%R??_ z0|q{X!MZRD4y_l|13l<^gW$>WR%54h-L+n*V~Ut>@}B0}Nk~Twm{)u|_9hr4V6xTp zItmEw?8txYN^RA)kP>K*^kM$I*jynFLc+$FdAtimL(9%*0$?L=;W{@Z(%W3z5&WEV zB%egIDm~5iMxVy_$10VGfGIZ6UN@HrK%{O^4xS5Qtt!BeS-2P_&l^WUPm8hKu&5xW z16fJ0ADC=nifpIaR9d`HgD;;{kfJ20*B(l!m=x9nNdea+LRr=77V(8^TB^v5lC@hl z3EF?M2)eHzNs~>cP%;f^YqkmP$mP$Lr##JTEKM`t68@~>xA6S0%%(#JI8q;$bv=tS09bt^SY1b!2@KRJ0t3d0Sn#DlLc zQl=AQf`sQ(xgl^_PscbN+@Yv>GLeZ0n9%s0`(NCDzz9%|C*DhQjUtZxz}sZ%iZhFLRNaMfr2PaLtC5w;eDWS zwr{$%@3^7dYd7QX5zP+*4b|k(#0@9a*Vj5{aNg?Us{`ixN9m2XiINC@HsN-FR>4RC#SL zJ?$Z%1GQ(}y4yRwcQbCuEcwy!$~^sBpC?rLKdOx%f+i~0yI^NzG1i|Xo>q0ry-we+ z-)oQQAcEI#29F8oL^urGd=3*V&0k8d9~*q$W8o zw_8B#WVv6}4Bvb)ztQq4lI+P^V6 zzgr8w(YtRBJUun{-cUrO9-|IrtnbE5+!d_d-N8hZwO*v~vu&J=;IQ2p$D6-5ux3_~ zH0;2Q1k2ZW+nEoIEq#ijnrroMUv+-_le}YhGZ3lcu<(`0r!vanv&z}PfN;hMQ4=3S z%-%2&%en80c-GquAHnSiG51fdMCM{W8XfPfOb8$!1Nv)&Tdij+H=%<>tq zItz{WM=T}&dQ-(Y^qD(Lxrz?ml2q^KHt^gAZoXVv7aN^HMV0SaefJgGEfxKphsm-G z%6v?GHLg$Bbcr0&@|9X2F3JW&VI{Ju^K|2-WKi=wjI#|oLELGW zg%SOo$Kj>t^E>m0e)^lJTjQ~m+w%1)&^(4wm8TNA+il7rUHPvFvm{s+{b(#>ee7Q@ z;U<`r<8Ad&u7By+uv~tg4ie31KT)wX$0;fCZ&$^$o!Q0u6xL(aS}(7M;8UTYD0RcD zj?{lRJM;t))J>W%=ZGdqIAcYespI5u+j~g@Et)Us7paltWdFZN2u~b%FqHo&Xyq03rALQP6P|Mm3_XHaOw(>xXAt+FS0E^M)0L5$j^h+eH0X*3Zc^ zzZe>7A|La|*{j^i_rCY4$C}ijTPyFk+|x|CWC0E$G3zsm`mubDpHR%UuRYPS0okSJ zneWoPmow8kAINwhbi@F%#o`>cK9XIB6i4Xk^Da6BYBm0;Jj*gZV_Xx8p3&r_zn5|QA#MW0~eJrm4xJ#co) z$Y?Cxll_Ek!;}5^X5X%DLwhHNrSIq!MVA@jL5kGy^VVfnv(n)P^>gJFHJDI8s-E*b zlj^NR4XdFc3AO4UH+#l3PWH-rQk4Zh(Hxc>i=m0z3}&>;?Lg|h+(g*-CjgO(?#xG!xpD@~68p!ihpAE8Owlerj>n1C=Iw&&iE@oipk4kym zPqde(e_S3)AHAqFZ-*|wBw8=G=ao&DngX(#>*0G63er2ZV3aWE+>bkOtg>9T+7e3| zXQA(K0u$}U0f4QPv6tH;^8{tAR^P5%8a$1Kg`nFde!%f9rrapaj89jOdg=o~F?{ag zMWv=P8-x7e0zhe9wZYa^*8H@?$NjPd=^YOY5=HpSi-Q;ykOZ7YvlIh7_HQ^l%$B(|7(Ntee1+czPJY8-?Df1A>()7a zywtypzWY%8xizC-(T9Xlz8+2)n*%u_YZy|jy?*v z4V^XRPw@_&MA`DJ^>#Rn|HA_0FarE7Rl&Rr_kvF{yc)2Sz!WFno~*sSfnm@ESr4Q8 zW8SMCR@leE!PzFd$4`4G!jOuJ#>W}n)eYWHio;opLYN`9RFFzMK0>K}l-Gt&e2giz zp%IR$MiD=3dqRut152=cbC`M@GSE;0P)4@nrf-qqp%g)dI5_ZrN~jQ@EKqJrn53&n z3ib*mH9K_1tx_xdoAB?1%^=rU(FS-uO%>+X8a$0TK;uR^qQ^6ggBHxHwso7^8R>{Q zE~yx|uBR%W4L*L4Y+J&sj1MqpP#*9e4NYnT_lr-C-d#N%i(xAjq12} z)zACerP}?`;xs<_!Nh8zlW5jzc`XULBvkB0{G{(?9X}RuMXnb5CL|0b=qTYeKL?pW z!DA)TYIWMYR~*e4kCr4Usvkk!F1HYSAS0HIY}0F9b!LL0SV1z%bG6sAn*`t{u09>R z2KJ%ABQ8hy!Y{9ugS8+LGah8CugudXd;c7cpsL+h8ZW*rtaPbL?~RPKorufvec7T< z$_T!zCuyH{Z?3dfw%3`hNpuzm2qG^8ZB`EAxx8V}d+mEe2x9x}6E2oC!wfsV)Xy6e z>D0HmS5pHb4{G#d8AD9fG0Zl2R z79p4yn=J~vhm!L_CWgrZC!k~)fUccD@^T`TFf-OE@tv$D4T&py(g3{5O3?=R5uo9v| zy>y;#l;_hFYvo7JDPwz$?%RHPy`r$=azx+3^`>aE^njsOOzSC;wu__o*t(~?v$gwm zc4Xg3hI_%Zck-uF9m!Zv*@rl+B9Hy}BS*Fur?YkSdWV?;o&~-K44CG^e;J9EgrO<{d^ALvBV?{4UNK7G+wsjdED5p2ekWeGC>pIB@g$~y5aj!&5j}W7$W7hF-dc8qVczQ#QjwU{xhk}yMYl?PEJc}kK zoM-Ws6pJkGN18th(l>-yyr6uv&ye|lB*^q|X4A8i(|{wpK0VkZaq!Y17$6*HG*_!= z&djO3pN+neJ-fC^tLQbZl9u(Fa`ZG?e4jSrTYCtn0IrJV^s~R-$NQBpUk_+qs8;LT zxZTXU7z`35Z3%qxphtpOKYGC8)2KI%J$!EPsyBM+EeUM}5_Vg3>lA zPYFw^D7*=HpZikSc)F?01-#8jnY$Sz{V6(eES~bCBidOFAgc0tCvlqp$>~7g(J7dMQkreJ$g*1zS-%D1uEYw zPh7(caGO9dac;BrU~&W%I<0yvZmBi8B4Cg1CbPhL2<6YVgYrbD(r9U4e$nw_q=c2A zOrKKg_I_Rd(o=hYfchC8PV*P(9TSEd81Z~lC8jT2CJ6716x>AW>pOCX^&+n|gIjvr z3P#*?vP5?^EKU;~Qr+ENkE*lRh6DDn`S5Y#1qMxXaZx&7RLTO_sj4kiHnMBIB|45f;)b&ZKdU+ zlf&a=%vgHh!L0^S2Pt4P4L%&b2g;>!Zh_)=veF5r5nK=nC)4d!fQ=WOmu~$(E$d;& z!#7axD+kJQgvxNrsIDfyA-KaZA-}#dib-()`645ho&kArym%DTQO-voyRn&Gnq@c}vF*q^fLRP|aEtyIg8*$2?u~_87RDePZ6r2Gv^IM?~S6x|X(r_KIO! zgWLQn1@oU}MDq!QGBx!oUNf+!JfyH*ZqSC5sZD~FZQ+OMjbsP;zR>G7!< zR9EUY`S8W&c`J-QUao+wZ8=h*sb(z}LPXNLd zPGJ5?A_WkjOGim%rK$Q|p)Im8@4!$a1%F|`q-R=TBj_5j??R$WV;X+GY={G5m9kq6 zUfV;RmWGC59Ub6L*Z8;>52XS?`5ivbd%P;&QG)&W*z9UATVZZ&Nlr^gcU4Bi;8lk& z6Kl`1ll`8;fqe$bThXqlH6IVz{T<%q;FZ(y&C@$ObV@ z=yX!aH`tm>Ua@b|9YN8kPH=1#;icymR`2fNN&i8_G!Ji-?9yP)@UV3(xC#>S5$?H; z%$HZ`XlRlGpV@6wPE|3&19648f6qQ!D*26BF-^c=q}@DBs-yD}?>u>^`tz%tVa0k= zjm4qDgx34@@sp7co(vk>xK3^VcLfz~1^9wnn8f{-My@n|rVS6}c$vsn=Y@g;%;m9# zHRA|DG$Nk{YWcWVSH*YBla29old6cuzKBfSkcfh~XLs)Q^IDy{%!?yfr6<7&_e6@K7|@xONUNPb5Zz7tBUH1;WRe`5ZFkv%q+Ql*=L2psIE zWiJL8{N)gJ;QLGMi_V*mFG!RNQ2rT&C{L9q|I0^64>AKj7-AZ*7dm?H6l%YJXldJR zuO0a%8mwAi`e&N{&UsSTjNr!JIa3?|A0*%mIpn&V#%4X5a!*zWD?Z#v`qu=EP*Tk# zY6N*<5(AIv#)Z#1mPcWB(PvX^r7YI2ZIiXNKb7N?-glq(hOiN)Hc0Wo8AFk&`yrbi z8=IG8=F@l5Dx$&(ys~t03?!tZP;(sN*m?;bYL2gk|D`1c$zEB7OVWf1tSNP)E{o?A z_aab+bpgSv-Xf+e5#)(eK$^{pbjBZbqV^x#hsCjNdMM|NURyR|i@yVVVO~T(d#>}w zu#C73J5rUc+HR!zHfqD$ro`k)2$BiEedVtV=m&)6p+FBagNO(Hk@>FA>IXG1hu8g9 zlvH}IIqvBPQX${8z7Iz<$BN0Rcu=T~g_;K4n`ZM9V*~&vqZ4xr(Qa6SFm3AoYHy5Uvr=lI>=)~Y;G&Z~JbmL7fl$aJ^s6TlKZ4vBc&I5x zUlJjr5tqBXAF9FlY~6X0o=%uOrL%hdBLv8buRw{2E(*2{&Gi*?xGD@>&_`iee7Ei6 zt+VO?6_teev`u##W6GZ86 zys|<7mk#{-nWSBbosrdd?y>hv7d&o|-q*e&n}9+5U%8k;FbU`Z^i-@}LCrSa(d)o1 zMh2;=h;ca)T0f^CSV00$B8owomouDm)D@51<|c(IKLsWf~bx` zw+!@=B*5!*D5m?{e~O9OL|p$@h~)ohpZwK=|L0f~;r}aL@>g6@O;}C1TH`-4lS6S( zhIxei2O|7$Qmo|&c*|c8a+4E`sB~|~A(RoR%~#1#$bFP?HAfGhEMAXx)t(`c6TCkX z6vm%RjR~I?OnLLMm;XD}#y93X-pu$cxfy9s0{#P6>)6&CVZoXtho!5wUz9p2zbGl0 zDbWVel!XuE8fMwjE((T`+eV5XAFPVYe9)lP15%}f;%Y0r_J7UA4&F&BU~{nwrs($cIqmk;F7xX(Y9OQDOo~9-sc3$ygG3 zDbjuux}Td48V`m!5QxaMBUDmq*}nyBMn^U*r}8d+_ZbDQDM`o;mpqG|&|&locj|a= znXMUI9;sq)KH6NLnE`Vf)h6q4X`!e;V%m(gl!>?nkYh`u@7P%H@{N-4*4JOOVMM4> zT?##iMr}jIkpA!wRQI1{-i9oQCN4@IjhstKu-XtK)itE8dUbgw$CyW1KArx#C(R)A z`QwVr%TZmsTt1Rw5`~p#)mVDn^(oYO=?2E!QU4|QV5R3PHb?F4ucU;1{*ymy;ehUn zdo3bDp2=(gU@tB>nxpf!qLxl3z?N#nZub4u+?4C;Px)Bu|5Lcrf z&8LKc4lO$LaWG&v&Jovkfe6O2>SzX`^TBJg6C}R-dfOrTz7HKT5*9t_H@iID)Gj%g z$-y_0bMLW36dhqV_uu2a!JZ(Q><&K_v)F$<1)-Jca1$n$iA9udI_vqpPaG0^1AK}zQ-bRN}h@ZpyCtm$I+ocG1D^W;zRKER;ee%*RMd0Bu@ zP2K+bXD1Vn`?Etq`MV#hoo2XLKHp1KB+vKGr?&!wwb$D+DjW-qa*c>@=`X9VgZKW9 z@%6HIiMe*?lF9Qc&)*se>;ba9h-l(ZQ5TCZ z>Ti8s-lKJFfmC7-1C<>cY6~S_jAbT>7M%0)8GxwjP!F#T7UGU$-2~zc0d&R4#$sMu zCf0>PW$HWi2O7sM23Q{kP7Mx5Gf}zp$$^K(=I>Me%~4A8_@%9RnX&0si4&?sR?jC_ z6{ajZZtEW-DeVXDYEdZA0H2^0f`JED1g_XPPwS4Gi-DJ(0Fd(O+n7iD$>tV^xm?2} z&-I05h?!$L!euT;Tc%tJdpBX}nW>q_&E`-nn4**0upfrO%Ty2ta($D_3AlSs!`*H1 zyR~8am@n)yhM>+4yh|1eY%e7^_{yD@c(fiSn z^T7U|+~iurw&$E2!;igD+R-Sz&cNZu_Pa-ekA*}HP8K+ZFMszlB6A>~`x&jf-l6h0 zjEWcuZ5$xAUP5>X6FF=)yj5kbfuOjk4iPNRuD+;$bP zDG{}~JB|b%tgKsBm+>qdGt3Tu(%EuHau2Y%bR1hB{NQ%eNQrKD|L(hUxb|=G@M15ss0)GTC_IkHz3E{tX|1IpN)QkJc4Yoo)K`j4 zE)GUeR*MiPJR9%|Yd6x-dG`0qLyO0(if4Ecl?2HqBiNjr`CWT)@o0+C6=RvI+l=Lo zlbeJn-}&0ix2rdm5b2>%SdrPsSI(vC3*E6LLhE4Tg^K4OZ4x#t=tTJIebMOAp{;T2 zrMN-9zlp3)Ek)z7eFMXYE`RO7+^AVTp$nRWQaO5zAFf^r~fO{#m$fySSk6$Bbmp_PU8A-%7 zyuF6iO6{5>+qvsX+4R`54r663CU@>Hadn}xqz-$?7$W5&!G-Y6v)@}rAYJHCpm!Ol zX&%5S05E{r->%Lbf}*M+eej66vQurqVw z<#FIBx=SZf`9e~@j9pa$dX!ay*jY;MV}p1r8aLyac=`jfa*}n0-@MN&>Vi7YH@v=8 z|J*H0>YZ(GEnJ<$Q$Pq$pd0>w2>a`}tiGsw6y5Ygr$~pAk`mI5DBays(p}OmpmcY4 zNOucJcXxMppRM2D`<{D0=YH7%|_q&E1U((9HfA89>O4?UmM3~RVR*@iF7odQtlzqVctXfgL|(yr z1NuJtkS@7S0HYnMYoULp-c{u8n5z7D?}&EmH%I*>c?wN~}f`ETK+s0g>=wEY<>t0+#aNBYZ+^`8F)}>IU`*puIOq~w%MDw zx*Cc`_LkLEYOf+Rp+z1Sv!bQ~rh9bxH0Du&U;7;a z__=O6gG3f_COac(1vW6=O}8CM&C)!e$L1+lEq{|xO9XluE0z~&b6a)Cu+q#(SqUOu3wfC9VWdRDN! z7d>wCeNv{i8g|du?ljyNAUrgwIgte!bQ*StY-TE{)0j5(fCJplGT0ye|zJJkNWu=gO89V3BC+%FAn5*taOw zI({wtqIx9XYO}i)MV-E4?Yh1d65<#@)mvM+WC;M4JgR&zxHu&%wWVK%v}||gQKwpq z?bn`B&7I-xW>lM7OC1XJUwWcSO~guLyY3G-mgg=r5Z6QNS}yjLD=&sV(@ckzP4OL)j$h8?V=fuSBd)^Weaog+k?J+ z;D1Vj(~HNM2hL3>iFuyZf785ZbD?c*4oUTXKV(LCrIxBov&QKc6O^EtQ@21x#TSFI z(|(zbR?ptrbr)v7`n^=XavY8F7UpF!uj3@?SLQ5mpYASRm0eD~TBx9xA~V>Uhc8P5FOJBjok z&ML7U>Y#T1mv(@(Gs9^6Ad^#>ro5l~1Eas-wsrAjp=L0N=x!oguRR7ujbVICpVPbL z@ZA7+M@niHNBWZZZmwef0O`oo$|@p@M2C%oZp1(Ekla%3? zaet$Wjli&@GOI)XYOVoe4TEgd!imbbxtiq-YRyi6yRnO7@pR%L=+TTXf0AMw4v&BT zo~;Njq*bRPI6OjrM=omu&`-ok5yvMa{MyZIs{CP2uyBE!q&)g2CVuk%2u^Yk`);g`2R9DTU)HL)wWqQ2Fv*Y-8VqSh zT-jhRxXNwM6+`nR4&;CRPc6XQMvvNh)a#dt zY^F_hcCZnk4idL{7EJXMp3JT@hPtvOG6q`kGXcbxk(T_!*l%bDRgU{=TIZK_a2OKa z2h*~u;P9O*v7mn$QDrB3BEBW8JGwS0*U{FK{roxkMe0ne!Zu$K79bf94Mjfe>$~=) zMrP3aqtn2$l9rO9F2}YqI(0}O#T&R7J2EIMDKkv3mSzI2xZJ;WF%cDA6^}dT>YS|# zJEpEY7guX1t#2$WY)MmI^i%bt2$(3~PuL&zP5Te#nopM#5j7E%s`$1e1Ay;Y z(u3$PK5&{(^gpr{bCKKcVG-7cHzH)4Kc2Jy`>g>+4Ho=)f)>@%R_qeEgLgXWih8ol zniEKI#^=Xkb)_G4e~Q=P zGF0Km1bI9?cwC$^M`DeRK5~`aOoC?2M{ierxF`RkUDZg&(2g7!Ve`wtBfZGrEy=JKkXxI&^ej#{AL1O^5{@ zQg_~lhOi^6`FQG~fpvUc@7!|o6)uow`N)gEmEOy2On|~~)4o~@P0ZFz@XAxAF4&l{ zf%+hz2@i6`NpNi?u!!u7hGI}f^)pB^KkWAFA4kK9)=SDN6Fv?};N3S_ug1b{yYFMw z#{##E96VlY&Gc{T(yYo3qz2xH2L}%5W|J07o(HV0eY{b3Avol1+Zg$ziQ~iUqkTdg z=1F64CW|GsZ|}bTwMO=*#CQJ@gg^ob@6Ta;Zgj7W88jl2%gH;2r}wo{n;2PQ-p*H? zsYkPQh?x|-Tzx0h&z!hx5|}W$nNNQxgcp7)%_sbD+$`|UOXfN2frKjO zVLXx8n&SiPq+=i~1epl?etnYkMm=3KqUN{u#XbI~yRy+JH!6WEHE!=szKz++lP}-R z1osR0mlL^p4jSH@c-^GSEaf1oo+l=$46LW5yxJj1dpV#ysc4M<+7ng6 zHDbg}c3n#(pyo&gE7~m7Wy^bd(zjtF33XD0U|!yAcyZT((%vOki}3>*l9!3;p7vTW zCeZKCsICiC`&Z&Y3tuwO6&T_f&q~%HNvf^Jt<~Ipgiz0t$wq$Cx0ssS9h%Hi$!d3j zbdFR4-JUpR?kFP0%BITORMt92C`ZSt)vAXf_M7=E>C~Va>3C?Qyx8#@j9DlZ43KaX z@ZqI4>BD=W`6J*ViESf3?ThF;)?^rVBiV8@2gkzhL>9f>ADuH#r9sSWa~&y9n|{ia zl%Za6{9eb8i_Oixce>>?9bbuxeB}WQC{b$z!rx34sIdkzvK(+p+MeG@pXv~->I{F) z4R$eLmdR#yy(Sh=_#5!4x|omy{pA7?C@=f=!qm(~C31}2aS$?4P%hJ~(K-EyY!)3) zc7%0P<|?0Xw(EnCSn0zPNPVD zp9!GLXTALH;DNo#2!Mw5_H6Xir=^Q%yzx}0gDIz^2O1RkpaG1MV)x=OjQ%qXz}s`A z*HP09&9@ON3fp_b8@SXiDRFPIbCHY<4}+lw27Z2}Mb;|NKUoemb7g*2#cM+#oDgCE zQbpa>juhj4Gy2e0LRx}I?qBJ?n`J-X)Vo^58we+ZjDi4=A(&l1)`&$SJpA19F%X}v z+Pisyqen=A=j?F%vQj0@a;njP&R06jP?lHB?N8ZGQ~K$ePm>9%OFoSHo#uBJm@m9@OGO4z@}@{A)yk>7X0(?=w4$If7`cMECM-O^*B0FfbcOdbD~A`fS{3XfYy%;l-a z`;OZ1Fmz^=UO5Tx8R%jZF`PiCP7L9KB&R?p8~ig80DQ@^FT>#9V8;l;*4qepiK$do zpI`0fll!P25u<&@-5|Zj9c=|7C@IKD9z(5@c|4#&!Z&1m~iQY zQDTbg(!0e$g>r=aHiT@kHIlT7Aq~C0xyRq);QRWgK<=Gki6EoB@k8IuLEo%q)KFDr z;`5;q;u;l>qPSiD%^0i@WY$t}KRwSqWAmLtX9sm8q$=zm8ECd>stY;^+Y8su|~zit45XJI)^;{RbaAeM<%CJk6aoJI?(z8}{P{VQ0Vn zVK6SH!}O4r)`m|WLh;pH?O+Nqvmi3_c~8C!W(?;-Nw2I7y8e>Smm5-ne){2%cDoFe zfU*utUVN5$**kxIG2NBVWlDh<@UsWY*o~*hD_QY|Cj9Z4G6+wGijJD-W6>RniHCX? zgzB5@TR)yjuJ+tj+gzU9%8HgpvhAy=-Y~OWL)(S;1x@ z$^ceI?=Q|Z=_ciWh zK-fJ`d0wNTX)H$HVaBTT(iane)zmLD?cS~|&0E*1s&lf>eLZ;F_gCCu#$VRpY!+f} z8iJgqJvmJ5h5Nkod#jXkttqglIz>CVe0zBEah1J&{m8#na%{BKP7zU8rNXM42gvJl z?WP3F7H%v<1OFcd6WUj+5OUYM9xPjt?)h~~tkbw3)Vf-!rm)`f=5W)Cl=jY6i}jr? zh6}}S#fD1YD2r1L`XyD5))?^N0`|(@l`kM%ms>qNvYQi88f{V5=t+3ln3lOEckN+c z3_*L(=|l|k1gs&9gnNca9ZV^|(@;IssdHQkdB^W*wT7jsteo77Zdx}RF#Z3d{K8w0 z>0LFSrgCMca^pt#Am-R;ih9gzU4@D-vE~zmvdc8sCgpSWMeYXOA=EH>-$!V`>QP=H zxn%Xl`m(GX7eZ_Ck%3w^u1WWo!Jb$j$K;t;s%LROnxz!0kOerw5giT3T_aJu;wxfQ zCe8O;qVIp1e%B}X$`O}lS#~A5i3a5hMvmU?s`)J8Zm%?vPJ97Bm7VJp9UQ04U;o7? zh=YSe!jS4y`3oO1tG_;E09%GEMG!B{9bq~LGmw%#yaI##vL!UYw15DC{<} zW-lL*pHF4`DlSiwv}toYb5aC&S(#E5t*k35)Nh{Fc37#Froa3j-8BKFO!~fr`?9I1@xqs49pU|C0~y~l z{&>ys=izKJgUW2(RkIQl7s~m}*Dz+Q>mCzaUYuMlQWosvh8J{!^hiP5X0U2u8&Ip ze09NFa%%qZ1HpSSb8?vcg+?Z9;;$}x>N4`3NU@JT20G7Hp;Q6rY(eEngu+t&l@AI> zRA{2QB8s|ZfemX%Ehmo5F|5X0gZ=4xl@JV+TcV(F<=WezunPW18!;8(7+iP_frra* zgyt51$cAwoKh}hu6Paz6y4&^WMbO~Ofo<{*lUr@IB7o78OFtk#GCnhI_vHafb|jwt zcLKY$if2*Z8^O_q)`Rv67-FQY61udcY`*(MYJP@+PM_HwPCJ(Y6L6m95g`Ti| z^xNcHn78;mOdjNUQL9R^xjiCTNVSuXP9Nxmpmvz&v;VT#RGci^Jke^nT`&3;;Y<34 z+Qzl)H&J20TP&POBf_js^sCT$nxnGEt_5a!BStW*z3Sqtv2*>aI9yC`LPnDUYQO)d zxJpc)SjB%OPJ`%17OZLLjcG|9{oV#R}Nbs>ZZi}A!xXkIWy&| zA%FX8auVNJpIH|n8c|tb-@q|J{MS{o)#75F^J`a30gHcA9P-2r3g;|3=&L7uq|?5j z_WC+92L|9K!`A-ge9{1=YvE4`whJMV`@y)z)G%ts#Le%Ol-RnmZJeK^k(6F~)6<4n z-TS6w)ral3O>^9S9X~wGf=eVhX(b>90JW%+pP%Z8cBiOh8In@3kYAQphz}4x!UxDs zr7cx#oaTCZeHZn8)1UoIR-LZFTT3L(;(O{lDYas zEvxA+do0nqof`$bb?v)^;M=pQFr<4z5NHa1!e6>X5Iexw$XVe}L7^7-wwKD}+jC19YFwr^s(#+F6#-sptrQE< z%c`GQ+py=&;-lMZLpVmIlhU$t^P`*LAzhpNjTd%L#tpIh|L&{Dr=@xH1Ek>1Sf30m zR?qO%;wijCwH|v9jxFgb9c!Ye> zkR5^LoAKla=hUO?>q~a`$#rFv=xlEVq?pd!K!NExP+H{LM_2VEkx0QY$z-8HqInMV zKt(;`E9HZw0h9$JX^j-CsMNTL7m7z}9AGt*!z~3crNH+#jFk)&Afn4cc=$Qh>}wYm z)(Y=dCseE~WQgS6`DMAFd;OF3va62us#M?Sh`}hoxyax1ODA1icFC;CuF8BqEn~s~ zW!4136maL9&#&MZNtTyqm+!j;A%l0U*=rYm3kM6DZr_N12GynPN;b0^VbOic&70*q z3DZvJ=7!f8Nn2_yZipo`Fq+y5(7OEHq(YCkVOelz5KRg}W_xEcJiD5YK$px|d;Rwk zryL1(7V$sg<95%hX<9MnIBRO{Z<{e7wBe6S@sg&ObM%&*L}5rq0*Y(6RZ ze^V7>P(F6;a-v>pf8Cq%&VZ8e$@Rkwh)A=t`X;knxk(e+?)Szo3-%ShH#9jJZM(Vm znh>HJBZ{Cxb*$nyz}w%i65a(BXsEOaL;Am^I6S$T8S%i~vFp>E7_+QiG5MbJ+3^=S zgb#(#N}wAf00-Rx1%Nmbh8~bxHPrj5;`43fUbqYcPAdWYv_^EgPig~9h zRwkIN98smVqS26@*MSZ1(TOZ;1f%SYMoH6&5t!NTE$AIYw@`)w4-qMoaT7E>ee95a zX!11^&PHOMd>gr!%_g)&l9zwa^g!4cl!XKMPdeJdLSRs!vU&udW1wjSX)$o|;+Ro# zyZTPWcHoZU9Wv+HglTC0YK?x~(8&H!5;a|#+svRk31kqlCiH=hnyYvAe8Jf9OZLys zS5I%qmE^p~r~R7h(sKp>=&^6wKsb-2wI>LjKU-`wAz}HVUNIfnxQR%8(OI(>cPJnb z(axcgf^PpMs77X!YyUs#&Zyz%1-G0SHIb0z6O_xD+S`pcYC3U@4xt${KRH+wRs@@} z;EwxKrjBc&5{P0A-&lI=Ba384vd+MWmB$YSCZS5SPggC_BtDz`MAOv__BJQ$>a3c!BT znzCH`?PiZFTcP%a{<_4KiGF0@eKeu0$6=Avwb{freX^+@y+gG;|3 zTYdVEe9vfOF(D7R<#1)<^z2uW{pu1Ur_!6-zBuNIiN!;VUV0r)NKli>?# zI4VHxE?z3E%h~T75Vy#BSJ*oaMR9`P8|U#_#Njvjq@HZZNQhan)iLt>FI~q^%wF4B zt_@rSSeG7SzfQ8b)9t!i_3=*D8W|q7Lw5}MJ{ek@Yf9?+Yd=O^=p^=t(;B3*kq>mv z5L=xzw9by~e;6C2yfJLCc@2|E@~Lb2D9Fuc#&><`SvM$dQ6PJ_f)*?+%ulXWNw-)H_>~on?*c@L+J#j z?4v5~WN`mY?iG7~H@&G+BH34Po#YWY|433Q1wE)3AD@i6x2q_2sw6*|&z~q@VX_)m zWTOl~?2F5KeKt>!urafuEbdota1y5h{>)kkB9HSON*<*Wv0jr5|Ahv!Gfa22yk5 zP;e3lO_yIgpbyda2DYl(&;5c578(IS)*HGY6mS(<;t0SH26;bYo8s6tOC>dE(R`~C z5ZIw0_{uP>upBJ!P&u4%I_x*=eol&w#2(Y#*+s_mVLsg5p(N0A)l&ml@U*6u)L|Kb z0%S}?@)&)ezoaA;x0odwlrRluAh(I3J)0m{*(40vaslg`gyA)NwRF*pI9DA7X_;ZY z@k>T*(7)n2=BsCkbsX@3O__k$7La&QcJ-@J4Fw?Y5^YwRgO9=KK+Ih$$0r9Aox#T#SUfoPh7Iuxv|mH zv9O6Zrv&WCnJ4$Je!u^(Ci-&2=_z6DNIXz?C&&)J^UWVDIU^g+&it04DH?)64aHN znhFC0lSKm!bTP*$1nLWCM#$tJ?Css%ZiIXAlXfwOWEEJ~pAW#v?JQ$mNq&@fNsFft zmyfaC=ow1kQY@dTq9;TPnySM`2~0@9i|bzD|A&Dyt-HOth-5mM>+Y+6oCtElc0vVq zkUG=n#Dw9qilO?OokkmR;UIyZ01du_4L@qky zmMQlc1Ga4?Jt5(?htQgWni|1R=%?7*0hTTlnZY@mDouZ-9TT+?RE zYA`V|eaY15<3e9E@jo0^QOl-Her0=ldP3>?o>dSyGCVwNtu$9#=Xn(!5IQscU{%=H zx}Oi4+ucUjpka#cY^O75-QJ!Mdp2YLOE8%6-&}4?&CKM>U{m_r5aokzGdfqjFlYAh3^~UNku84^R6CnR0&&S=iawnjg;xz>y*NDHcTm z$l-hh{o-E;Dc`?eJ(C#SI%>3(O~ZN8LH8aB1;Yl&cI*cEb}5-RTaz6*IXz(Sr= zRdsRG_VNUp(0?&7m?9TtX9I^u=8ZCIS`wCeoN^HMlw%;k%*>oIOz<--Y`MmK=5Vem z-Sgg59>+CJ_4S(~zi8d$i0cE8#=ifla&cr<_ul>~>>X*sP!E$^JkeJkl^1dIaM&Nq zERMq|eFm@qP|XX_$AS(`-vzLTqBzghjvZX)w-K94X`HmS48 zb&B{HXDYa(5jb4YLnGetmiK!ctih(TTZ_kwXoQ$hj~g^j5wBNqm} zVbW4kQqt1W5)$KPHBl6p!i?IDmmLVCTJ<*M7?52DZh0JCx1$=+v2Mn=N<8Yf?c$K- zBt`8J6H{@4=`r*w1AYLVD$@vC=-)ymGw8GK@-~fC&*#Xf?1CvNjiLs|H_W= z1ucphHC5#g&`!@HMO;GurxpPJLV7qUPw?9wSnm`@^7OmMgp|S5x9?#2?&gp%uxoh& zfzV_6FzCF*=FY`(DN=FzA^#IXlECc3;E&+rljxX(sGOa4w<`}!gV|Oxo=fS5i`&SF z^G&#b=<3wo8)9C&@o!$=D3)FRAzQE^;(nM?#PLB+qHthq|Kx-N4`n}M)rLT+7m=Mn z`pcIu8XEI4w2D+RDV+M9{=2)oddvkfj7NKWnK9tQHL-IcFEM3l0h;r9UL>#VIy6Q; zOuMTy@>bR4RQC)lY;Siz9GHiz#Kt7(dgZRp*NICj^DxxHM$b%b%`4V22-w#Q)woXe z%rgQa&B_jwY~ppx9CpkZKb!0;m63r8?A|@?)(jNAgoKAbhNX)-56dQ9)`z^;9UbkL z>4Tx6iBHj9qm@g&0tKijsx{@BAqg=UL(spex=lx%Zw4@evjhM4DrMyI1JPdkDi6U& zb>T<_=VPjFeJ|o@Unziw|HUAv?j({notw=ywqEii!&7CC8Zx zgI>_H5&5J1(ZtXZ~f}-0Pxng zYJ9!o;BTwn{Mx>E9=fi{4hjYc9If}}O=EQrdz4#cnn&axKyUTK)fE_GVg&~Uf3RW# z7br`@84$~t8j1M=3ydPoxT9Aa7iX?aP4f-s9r2$;zEODdAMFd#XA#|P`r=Y;b2}hM z<8Zd#9Vwd+2@tNN565SvdjH;bf3grCA75NtTr4|M9}kR1n3x^5DLUooL0y@0G#HQ{ zqynBjKk(Dt&--kC#TcnCxosy+EPWr-iRj=Upt7N{&5HQ5zdMA`>^?n2{S&F zAafENfG9e)<0J{dKRmL%1t3(-D5H9>?;r=V#BWv&;P|R7!CI0nbNm=OuQ~r6hUCxJCnv zntKjZ(X=cq3dK`Mz8O}+*;Yzjwu_U6if`Y(eRz1_3PT2;;0u&Cv6{gdMFVB}5SET@(2cCDco`9fl&Id4DEy{vTxozx%?A%r{k zyIlM`v%ka1Bdo2-`IyVypFeXj6{J=WiZWzu|Lt32K%IXaRDnNHYn^M}sd4FUP~f1H5lBuyZyby~6v|Ah&2{;r?k8Kau1WQW;dg7rR zovMMfagZ>D z>2W2sv{ERRJ=Wl4Ffoi{tML;qgvCw*@1_oBAI(*jcq%e|w z1znDAO{m8++_&vBM4T}^vLtPIQLCeFeq7P-P5A4{_U`qlojFL&QHDbjUvo&XvCVD| z?(^G${u-3PPcBLx9+`F?^nYvM!tGidnDQUdNrz1ZRO@F-ceV$&HvMlxTVt*DePF9{ z&SHNzy%9%FK1TOxU)8$psaB_)BYB9HmKHZOKtCZEn>sHq5A+QtK!K0$%P|I9D{-PI z-lJsGNa*UOubil+>&dIC-kc9G6|38V-lCdyR(~T>j^b6$icIko^ZgX{xGH;?Kxu?^ zAtl&e=3*vu>BIN3!+N&8Gf(dDVBMVw=VMjZR8ynuvFV|p5H)9Ue0+=+APjcAUyKOI zf(xUBL=wBXilO1=sUF$L#Xi_i3gJ#Y?hHU~X=y=3L{!X^;&Q+JMFyFhn~RK$+>iUP zV#PY|6c=M*PqL?9g3Wn4c+k@iIrj5>Plz{JVQ(xIH|zhHg>`jbb>8xLw!3Pj)2Vb#Lu%Hd{EaBN!lBbgY^2=I7_bNClqj+MX=I1pvHn zkrKJ=?Cjdw+Ms(eA0Hn|7nr^lD(yRPn3~HreCQ4b1pvvHOECxgXevSV(us8wtIEM!-@FvBnM%v z#8z8WJCfwNXd(l(n-B>(rN;WOz|<)CpjMU+d3&2d9BoFjePO}&)^MxLxQz^Q z-}zA>U2jfa{*E3pJb>G<0)o63e!2TA~nVRIj99WxY7x8sJYaud7qdRp255 z@r|)m8gHVJIwTR{pQ;PVtVlrdad=cLBIM40Y*mFyT3!)w-!v5gyx&)VhAADlM;mm= zbhxs=B*F+DMZG#PX}Wr16Y=Ac7<37w#}g<&M%OeG*8?N0fj<(N2IG`SI3LA}HF@5* zxpX*KpZHiVMS(k@z53*Ic-wm>kB6N=+5S$tsQr8?^cvvwhChi04_wlBH8A-s^JhJcM`lN$>zYZzZM zF3)wF`H+UWBH3ZlatUL)7thN9C!q7$sBf-MRyK_gc}D{d0L1F-9M`lO@0QSICv6pc zppUNRXL9JpxA$8)>#N=au%?V$B{NLvni$V_XsoBaF3EL=yqbOQ_4wO3>>nrO*W{ar z(%5J@N(>edOz5}>U^lk?Y|G1}`Xg$lbMtn_w;6awRKDTuS}h({U&N*!Ap@7SDcehUUM&*wb}vLDCiD5c^lf}ep|G$C0I+)MSg8z}I8!kIQr zOGLfzQCMx)e}i$Zd`5D@0bI01-+-p-@l3kQRVLw6W`B*?@dNvYhJOC|F*rP&#;os~ zfY^QQ$8lQu_TP=Eh)02H1_UF360u`A>&szqQ%u|gXI5>E;J4z1?4tmg;ORjL*;j+y z(HWhc2wzboUtlu!&Va^90WW_@`+h}{h77Xmiotn0VJ7V_Ms^im{$O3PPjgCkY77TO z20-rjK1x!EN{XxJszU$p$I#ooh7&59+J)OGJO-Fq$Y{tsVoQ%H_cl=6%!V%4K5@O3h4O8 zMa!(kgcc-`iv_Dc zUu{}bQzMffO$NzTNK8o~A|YwDm}7~RctuRSG&w06MIk+Lc6O#v$c6zyLGoAQ`maL7 zfCc~l)y@$!$Fdd1oA8)?Hi7BecoUF?Yi5!AaB}a&>TPHeFf0RW5)9TY0njudWVAx7 z2zjq!A!HD6uWf6q!x1~OQ|N;md=|l9U<*z4pcCbLXz!7g6+G**LzEG1Ii*pz%0(e0 zXy?>xur&@ijbw{p6T!Zx0a` z8W5ad8@YfL`p!WU(wX!hAJr&gWsjF^ELlpB#rRAg$66;n^fK^+l%(I?e&k1r^Y*rT z)WvpT$w|x0X!MYN=BJ99Z-Ry5Na)5Sc`q;8Xo|q)`*+D*=1#YR9-dX{%nx66%cszi z5bc<6?gr7)=kS>y)LEG@-=;S_-Zps&C~Z%?W|9iWx+SbWIjBh>r&oO~)melhg2&k; z1l7M18@65HM$k@(WC++FDlR^}j^wO9eEt)(PH+j3 z$%wy;AAo8LQm>=&vl9*u#PC*trOPn6>y2s1K4AYy>|wN{#WvF#H9{ zFd(oLSi!T08IQsLFv#evWFUp>^I!~vjO^LINL%nu%W%DOYyab1Zh~aB)PVm<3EqoI zXwN6f?>-+J5t}OV#z`yez6Ti4q+o*TmV@6sxr=_-*K1036&R8f*h7@1*m&0B0${%S88aGSJ zT!HoAkJ!{713!N3dBrp|Fja5qX(jjNm%4?HSX&M=!&|D_jIT1b1TbLNxG%5OMyHFq zWOta=Xn`_8t`@NvCM;BroaWq`@@{o&To)feG0exB7jS)H_&0|J8P)*dwKErpFGfDa z)x#6-NYj#4X!rQS0-cpDcPhBrm8yjHt^DQ03YFf0pp27f9X7us1wUmi?`6m2w->!l zoTt~=zN*>dZO=b6ok_m5jlxD@6L?~oTC{XJbwm1anBKS^t`+B&TekQ+Op8|ix_h5X zj21J=1_I4_u`N4dsTHOCs73%=66?66gUS#nW#7HV;cse=jO4}g6Sgh;cyY{9OdvvZ z?pPs#!*MGmXj=lY{K{_5#~`SbcN7o=grKDF8Fe2gpt@wi4lv7w8_x~7BW&0RpMJiF zTKact4Xc@y3Z3Srb4^tiCe*G=eFBKkE*Ej(GT(NL1S-rjf9P4})u!qy)dJ$D+e4(O zYE2FjXB*f?7|b*2Ud|_Qte?v@lKcQ&gSoiMPU^hvHs;i7M|^bEfjGm$EB$6#Dz12A za?g9&4+>-|$WO#4&u!-tK9`P!bWey4s5Op6(xZQKjrXV_2jURl_R7N__^d_6#dVeo zViVO1N3HI6l}lFf16%y*BYO_#yt*nXJ+@lz?#;rP%y=m4Ke8F)i@{Vdd#qlI5yZ$h zAORBk{W}C1+0T5sxPAS9VguycT)5TF9rOsy0Zi*ovi*K*`doCe9@OXPxnCE>Khm{B zswc*Ul+k>4d`^9Onb06HGHQ>yk^z=4_O}tT5)h(ao~yHT25_bsl+Z$$yvQZ!E@cA0 zL>Ot+X8JjGSF>E` z;^R4F80`^)XHR_*6h36)z8Dbr&y`-s_}~NQ0u=%XFMAOJc=!-r3<~n#7OMxpg-r0< zVWIG7A;MlK(!Q`_NYH>dCM@|V7TF$MUjz{K27(2_fFMRFy&ST`B2s+B@&`~Na4=MR z5TbBCZ?<0mo$YdBXBOh`40GK8UmU?S9KuM=gw);U`a2dF6kL>E?(p7;(a}+G>#3?a z2kumrVpL>gdrl&v-aB{xq&#rVl9WUikK#_1$yI=AzdhR+7#Q$+d008Px(D;!&@PC* zot+fb#NI@HZ#b!JR8IF7Fm1?``#vRnR>f8zyEi1P*JWb;WIRBgjf_)>{_177`_n{> zs(|PHkcloo$;-K0`Ow7L!`~WMa(^*u{OceQVQ8GCbYJ1~1q@vik0Ty5vzg(f=V((b zjK}T!^5x|PGwM!=Eeg2n5tmCLyf2w|MmavFxYiVAOa?#$U|5YmuR7hMbMLCbI0qeD zac?^L9ts2%YqZ{PUFwFJ>%9Fs{-I1_Mopvkkk^{33j!UzrlzW*a{c^pa&vik%FD#4 z$rSk+R>+1sbsaTW6x2+9f1jP5#UmutR8oqGj2xT%du*P$C@3g^f=6_8^ufOa1lSs- zPTZ*=*D8@4wZZv!&&JK}HY1dH#}g)<*~zBcE$KEXR3*>zeruiEfOWqWMno||udZH! z`|kMunql5sFEFU zTc&;hHX~PXgC+0=DzsZcQ&Vz+?W4R^U9ypS*v8i+G<0-o@$n-kx>yNcvi0@#MXQ_R zr6%>bR8|uiC8fz6@n{mSN86ArXdiDWs)OTWT-MAfGsgxkA3-t}7M29~ZnHH8927!+ z&zEMap}d`)TyX$}>3Q7c9^BvGT>G5(J$#acuIoYhw0hg)hV%F@McRKN8NrjG3v$QL z99Rvc$=Co`al4F%t*6mv;sz>Matv@n0;4PXuYS6&&k8hX9XmCFgH|6v_Fa&S%yYR} zr+ncE96->ZIfd8t90XeYx2t~Ok_0B12?+^lX^g|7NeKxB6ML86TEwy|<}8SM#d8&G z@w@ami9D?p@*8>vbA}~$M?9kZ)e{G=lRi-I0_~2ELo2Y*g-o7qxN*q;xRg;onLset z-?S{xc41oRwHLE7f5iziXQz)XMg@8l#+V@+LnL@~Jp7cffU6-btNoy_a ze-h&8jQ^Awd!iKhEgPIQ8pN+(gQ<3}C`dR%kr@kzZ2*GwXTg%o_C(anwF^hELYJ49 ze-$To_9;E)>bg1;BcoTixbI^7CF2?U3@ZbWUsF+2hnnNTLqpXqq((%Lp~+E*v*2O+ z4Hzt5mc-mkd9406#onX>fLl#jLYVvRvvnM{kRZ>;Vp6(V-iJla^24F0BP^KK;D4l{ zZjhSG-gxe+c2Jiss3L&$T(h@`D=g!VfEG(?cZ+rulAl0?!;N;}Ay}2nWCU*biSw9{;2}(quwix4*ksQ=j z{b@#e_Gy~QEB^kxQL5nXcIs#tk%>_juz?1=VJS?z+a9ljt=q1)j~7=MdoBLOhRY1r zM5!4o3v27wGoQP_-OqOYyG9jsz8c9&1%fN(&P6~_(18PYjmFbvwCub^Ey%c~kHn{> zq=4gcO^XT(jT^dET;9r(D8*_#C|9V&7%y3ZkK{`>joz)s`NJwVaI5@j`ei%Wny;=G zE@Uz&?cpfY4?2TFe~Brb=kiFP`FyT=MIdDEKM}NJ+lI4jY1gg+6kyrRDwx@b0?Qc4 z#W>S;;Dmmu(Qj>S`I2pJZGm^Gx|*%RNmf3lcjL^37o0>Oa+;c&0;l-y(UB3}cJj)j zG01-Z!?B6ut?UwpB3hb z3|z+bTK<|8_n88`yx9r^kh&Wh8ZtFCHLC$}M>ruz*v=ieF!uNNgMzb8vrA;2X`JHH(tc~4VMgkMQs9ifl^rrBQ^)<9TChoskb-7tquI@IG+chK*Q&+<3}mAoUN;UR9dAS9}( z3EqIm4~+aw;n|j+MH8qGmIZvKpdVmC>0*}h@OUcsdOGL|LKgrpARr(BXuoJyDEv(q z{%;leJ2)y*>HOLlu<-*Q|K?QiKvJHcvM8vEgdp)#3{zqc{`|rqpDE|UOAW3|u;C*rA*qCPOLzBCQd*?DyYm22BBFGIbazQhg9u1> zw{&;I;Tiq?pZC4qZ}0xZITw4M*)y}&thMI8?^)}Ki4eKj;%&Vi2ncwRije@=-+vu5 z*d!(7RAEpxHa6DO)HF8EUa-R~v!%;xd`;fQ7Ai;MERZTR)Mru&oSBGHzt0~m@rdr# zbI(^Vq}c=z)md?@Lk$fL-5PZ%qrS#T@5%p1i1^#qjh`!^cz!JKAFu%l5|r>?i1C-D z6HXIMPAA&d_kZaV`i&-Z?^LqhRFKQp(5cqbsWx-*+sN=yU>{hC<5Xim>^JtcCW|8@ za9eJlz*?g4ULhmcUcpa`eTCAVKj|<2Zv-f~s+I7~>Dc7nq{vBKl?by`F=Ay{q)I-2 z$udQMXG-Fe?@%XDA^_5ybB{(Zgds@xqeG;$$Kgn6PX{smA?mEWU;cG8mZ*hGbS7kN zT%&N%zT9GOf5U=Y8fzM(xcE&r{a1Ay@uwJxPYw>mIcn?nOfVyHkP$%riWnII0v;lS zG*=b54 zOj>1h`LMXS;rn%L4@L&7&e^FnTn0Plc{#`7(s6p;p1x3`)s5Fsy4LlZP5QC?mx_rR z1_o_Q>K;35jjAmE#A5D@j@90@sq$ou1FwFBF;xc`d3d;Yw+#lY?OXT8G3CDYT|2tbz|PTT zXwjFLwd$Glbye_7Io?Ffy{c7D$N$X=xxl&r+HthQic_XnsuBz_)GZf0+Uas}1PYJ8 zqa9&Dx2O@Ak%=Ec$dUbN_=OX;7mg)75>p>#*;n!2O>|F?ACZGf4f%I+1zhaC=g<7> zcIW4`b@S}jb_e%)K@rJh9S9=HVvc`H>q^XK8Z%ugM36vBf86a!bT?iW4#Fz zxpLiNe;yn(%}nfclhlXVv{F$${e=AOX+^^;a9)tbvTU-S>Hl;bhd&V`SbA2+P#lp% zBB>$2rAal)>xazGWyh+i#r$+cM{yo84LuX}oqqAewgl&9c9-~lxRNR5I6L4NK0`kfn*u*bol zFiXPbfJdP6e0hN>_3NLkF>nl?SOpVSUpm+=j5Rc--}OXp+EL+G;YluO0D8vhbpl86ptZ7ir z)rt7pOQvlOx*U0qKm_?nWJE^6#Ea0+ZQd);41v7hM;7`HpKBnzTJkF(I&8W64&B%NWW^k6-3(n~*nD*m`!<0TuF2wvTB&iKA6}_&)AwAMUdY2vfIl`D(0MXGfPX?Ze^cR*O2# zTQkj*g09rr!Vh1Y=8+BUrHvf3S?UOZuh`MyR=*zu2ejh6R* zS~cjpD>j6o`bO3|Yswg-*pHKoHzH-t-H)F@dJ6m+=U4Zz=`!5?Pf>{>e&k2BvsIg< zNp((!W%<>eIpfTUxK!9BSVzx3zE*C0TuI9!E#y2{n#9J;o3LV&qKJIvnz$b+d>n*Q z)^YH?r@sE_v%x+Tgk4-dyeDb~%?RBn{*aG;w7E2goCjhR4K&H$-a&+ypS1XnQn|odh1KCk=Mg0j4fmH- zv2~HtX@XS;_m`yH5I?)oB%`2qa)Nu#82pV=Muk)Z{Dl&JhmFfS{eb??-Qc+6UUrz# z)Pu^~KQGI*H~WbvX*)gcZmso3?l(^L*JTbyLcYhhTu)NCudUZ5izS!ZYy95@T?LQjaS&dN*2C1i?Fzx?H2wS@tAh`I?n*kWd|J>UDZvx}lIoGpY zg1np5s-}3AR%Lnz#7XOAFB%!EEK@U?Nphu>NU3jh1bP-{ub(|Z_?HR1!8)?~*A{Pi ztS4{Aszoym@HcppUp)Cp{&kq>(v-t%eCAj~|I5cy^jW)QFT_D41N}dNzO~#*blZ5Y ze;n%vr8%zHMKRIXu^DilCFLE?MmQ=eMzkBWh5QR;TuGKATSUAcjBsFADKarH_+I=yT1F zaDpMSEFAEOWs6^%U0sn~>Je_hCG?6j^LJjZ((GuGLDp_;rVfRa5-o=+vU%4T~kA0(Pi=peGQN4x>Id^9y#HpV-jt9l2;er0Qb zBN=o8c8}p9G%}t#copiI-CzH!BVaY?XRYGf>|oG{(e^ZzD-ipnk4EMG>efk(s23QL<~}Tb zG1S9##V_{X6j^B1_;4RIdJdQg)=TvEJedf#xSSJN8R>c9Z8&;g0p3Ce(Mf z<0*EHjK`K_@>o@V$xZer+)N_<+ri$HHH+hmH06n8Hxg74mDtpiF?*(Gi{9I;jYUZU z_BSuYRpoVA?@jaFX?9<(Eu2+0!ADw*UlM-tqN8BAo57Wcd2fVh3tgJN9%+Ae94pS> z!(Q%fE^%~lYHw@3e}HTM;IfdFm4b78QBl-21zm*ge@xR>I(uuVwzckgQp21nXya{} zE$MOknLXiQH@#~sLbwk>e(dV@A1nqrXbH2iuhx!#cFcEZpU%G6x>vu|P@x~am1D8K zcg4a-xir?w+@rjaMdFvg$8*%p2yM1>wc@f5JXUc$zMc=M+{M2hV3XrXb%)=H>CW9; z0yjEfjYD>7v^Gk#7!PP6PVeo{EZlY!TPrLETklx#Enj5)jJR7OL+f={cMC*E&9fDD z*hpVm#A~?UI`oN*A?9?kpzrsw>)hjiIBERI6^El6>%AWP1X(^1s#`~Q6}hmEV)mV= zHNZf*{glk&L6Wt}@wdsCQVwfW)22$BBlPMA*mDvCX@;6BI9++WlMeh2^ z=-DgFP?^T?^#?7jc({?aq$In^wCvrYGiP6f`TeDKAa}7H7HYXvB0t6X`a_IwhRJAr zE5@261Twv4aUXMCtfYe|Rvi1V(n;$NdpP=uE!Ooj1H3n`X?{Rg{cfk|NKWjx^fGO( z(1Q3ENf6$BA-78?0paJn*4Bq#VV54~bBtWit_z3{W_R&C4G-0AU^A1@LwM0ZzHDEr z05>CZ^llN$%*o=*a~81hftDL5)!p|mEqUC-UgZgLo)^>=*P4GFn4B&9a4zr2W&P4~ zP>>G03lB=5eYb`@x;$LL?Azeh=c0YRJqd$bFdn8aa4|36*eXt7QaMXn2Zap(oN{>P zA~93g?my@7v)|zYMLxnUfwnr{eQJ$bYKadwDe!D%dz`{ z7NkCqJGmVP`okG0tn0tu#zgOsXd6xhnr=V43k&(1jc_6ICoAs5n{p-*A+tS|+6rGNVqG#2u(&2B{Am0Hi%Z1rYP~sZe-x1Yw*L$Bp^cS?`PhCy2PS5k zCHEx^=9R<7SZ(&|!dUL>Gt32FV3hKW;Rt?`^q8gSfq6;8)Rr(0|C*NJ3;QIVa%OxC z!W+IdS!C6T`6U!*#hKS;vcq4>)1l1nm*)|Ph_~p8LP)sB7b!(}w{BLkC!1zd#EkwL%pi)DmV@^Kae#w;Gn+q7P0wSY006 zqpRcT=64eSt;T@H?{~|oe80A+J5*XZU5ws$B&pJ~-kVg*d=`@dvoPt-@@4DgV@IE) zYQJ6e_#`q(g@(^2?#puDCt-X3j+cx>h-9O5CJ;6{f|j$X)b{157#!zSy=$9(Mf?pax~_=C;!f_-c4{&4$-=oX zd@B-p>#$|~Ipkmd<UTtC^eIsW@w(Xf`>*%ok=1k#u(Wi zqou@R?-VRnoQLF%97rp0cwN3y{+-{o zq-_6(0P$aXJUpCvbn-d6^=<=37EJ<=-<}u3#*tZ;6Ln?v-%t&{aN5198^?g&*ok}O2bE`LOZMkE@-$cQ&m2--SVwi zx5J|ERzbHTY@Ee1>^O|CDa~$)W$+LZeUgQNLA@3%nG1E_23*p)?@S)! z3}141=!?qX(LFJdOlsc3d9n*wiA6QzNSBVTDa_?;7w#S${gK?+Y@DJ9ZRdo2imCRy zs1O1?evxvA_tnIZy9Mt2-eP$>QhZf8H6QpDG7991IiZ)aNYM5XxoK447;3(F-y?{S zu6aayS)J#bJlWs`m+{+Eb=J^0h(mZ@u(Ij^4=Y>ImGtN9!WA6&yw`_aglH9$q1zpWzb#rS;uZ-tj zVNLfmlYF$@C!N_SiySAR%lycIQ zf~j}2rY2Cks`v^d#fgztZ&z?wdu#iKkdD1V#T68x#P8zkOB{_MsVw0KCEDL1PAVky zhewa6K3rIQmgcr>AI(KQq137AR;=-a-07}&7ZWR8qsFs%)5(rFAH0>|MOwBL*7Gb= zOsLz6lEPaj(mC%|gk3#qGZpfwUM%fPZZ>E?d*YkCE%Tu2tA73QSqP6gcqXQ4p(jJQ zng-uLm)&rg`Tf3s)Aw$G42sz$y1(YS#L%SU)XxRLQuQY8*d>i)JI>m=ylJL^H9Xbl zT-Xv(O(#>SV1I7KUvO&nCO{q$k}^j^UUM9XT=Qgn%$(hp zCGc^ixLjJDN}g&TJw!sy%GKGsE+hoqMW>SExaw3n`xWH*wMSlR_dNtsR$Iiw;HsqO z#P>8~u+MVAb2?oz}Fyt*R*TQfUy21Vdw?m6c>lmHVB8+TkZ|&Q#DrE}|723*9 zk8W|2pjb$xR;~~QgO|+!pJy@GOmWD{Dd@AtOH(G@ByGL-^$#6G6x75%kFG&iMLjFG zk7ckFLfSc&HVl)@rgDBU;n+hHl3tcOPYihqNhxlOz&sqM_N_c&I@2S_*Bf$tgXI*c)4c(wpxU`!ShxT@oyxsRd!mNesg#DCm84PQeY+7!{iRvCLDTT z*HR>xFHd-`LZSNhk(U}7wUmT(=4MhHBb{z6f)|VaLmG@*bz$RF`SHE?B=EcC>TD(? z;qfr|R!J!?4Al*eCSv8aFK;h}1i_yy87$jrj zb;L<9(cJD|8grn9eePhw4;;*AsN@%xCh}p&(;KYWbXzdNAN>eq2S|%K5P9)T^L^Zp z`tR>|H)Z%r82Q;v_?R9L% zZ=ZuySZ}~&K(m%y=1o0|cSZh%nR!mHCL1FU-(7+c&JP#FzuC;e^NW*uW%W)`fwC=a zMV3%wRMQ3xV(b(kvMhFy7MHDaaQ`T$WP^wS&No8Ev!H9 z`=mOc`&e-PVRu0v<%{fCPIyB!_TpV`y@38H91{vP&otgRi{PKXk=DGlaHCeI&9Q18 z*c_U;EPNj$nxLO)^4xH_)`P$m`dKbB(y#dZZbp_zQ^jecI;%5;w%Ddi7BAcxe<;oN zgdt0rc6~^*iClM5*?MpNu2zjmT<&ey`*)Bwk4`W`Un4*EjZf)ctzE&1Vkt!*>4oU? zI0z*Y?|%Lpo;Ij&{aA-y&0wbKh%if|LV8h()9)vL^37I1d}`%&FTb`U;k{X>5fJee z#Xln!9$lMQEA_UqI%|7LWqCHwpC}b+ZpgwJynp+#GZY zD)0`!I=$?N)#k}q`_GK3yveB<+?#^tz0kdpX^LpWJ?70XL^w5jEQihaZ8STs5jbWG z@MkBN>Ktg{Y&P85NN#U~eO~MBM8=6VTpjN*F38mRh`uZz2*J-Kla}x*I?$0&e9g`O z#(U!N$#lt;vlL@^TJFjF8iRTj$HAm(cSj+O&`qt!{h=sIImI;{Pb)PDB$RX%y(KWE z*25ymZ<9VWVdcds;aHe9RWvlj1?Spyoz~bHxRbtqF8Brpck%F0fj?oMQdS=6_=Ev@ z9mUoD&iiKk`1Cp^M&)DL&dKSbwCv`q-+xuoMYr^F#cXG**Dc55JyXe*N0&?PZ;>df z1_PdSI8t4ixm5{}l5m(3IzmcL=hJUD-|E~_VfNE z3^vZ7;be;pMiQ3>{%C1gX~AYV|Gm_?>!NW!Ly~J(e_oe0$Y#RIZ)$~vS*vXd2FUQG3;I*Y!-6p4(dl#FMDVMq2Q}k8VC761k(21%+*5u zJ>>VzVVwYvuK^=ezIZ%PN*z7PnC9~SQp=~cXKv(8@wg*VdTeJGh6mwA?`iwoCUw&D z)|4se?Bz}O?ZHI%$$7*@sXiO?kG)%G#*j2$>pAp`a;qKUswn!i`MtqR#zex;LRT)k_u&C2OW`KH2T1&RakGor`E$cvd8->`7uUtZoa^6=zu z_Dt2HJ+~|Gmm(BOKR?ZH2BjkQA7&kjQ_SFy%!TUR>95^l8`S#Tfk&QH(2z>y?!D1) zDvU4pvYLC-d)il5qdiI-_S)A$q<&ZKB;Ktp3?4t%O45RhMqjXEhVqCUX5P`I_~ZQb zF2)bZiE{K~3VQb@QE%=DC9TJvCFJ9>w1&}qNuM!!-ZMj3Agr|cwRf;jA@8t_;y{l> zh$h0}MeO@!NXB|9bZe@Fu+qkT(}8%(BZJFeM=@VNaQn-(ctyd)>;h2|+Tm~$D~i&J z#0)P1tNO$=ePGA%sfXSA-iWT6j|z@y{uBK{P|kX;Uy-bbt>or(_V|kNZA^0mumfhx z>DKks`#(Gko{K-ZX6|p33XaC_J{MkJ9iskQuZzn~Eq8rxJ}KFsn{f-P@0TfJ@HFy4 zAd}sXxO`i-FO9fjx`wnHZvs2e4#nHCBux>MhGOr9g*2s>I(>bPS-O9Ap}v%ZKERI4 zVlqTj7iOt*OBb3mCF%{$;sm=7P6Ak#F2g)L2sUOieM3o-jCH)=p+PYF5df%!x z&^Pc_MyB_7>gBX@HZSLY2%ClkyZCv!&!VN<`s1=M0osV5aJMyktPuBXpIc>4Ye<`#&&{ap0}s4Lf9Z4I!qn81rA;+_`Aa6jgfvIp>|h0I7Z~{QqJ#K z{}`G1sY7XETytWapd??oF>A}ShfUCOD=B$ly*c+YuT!)!*Rz?pY?!XcwfcIsdTa9^ zGSdkN78$Mx1EVyx_~$Qb2U{Bx@s&u|2sXAh1rn(@y~H!n?@@I zum0ak_p`u`0x5ONd_|)3F#v`&tC}&Yc-#1)gcVH%HOyst2*@~UCU+N==~1o7cv!uA zH}lSBj z{C#q=-pI~DU%ba8RtOe!Yv(hOX-Zq!J6&n#%zV{oE>*pAe}v8-%&H;O)YE54Y{=0s z9aMkpiebwy$Zv)QPg!LZ{M%WX<@L#V-0Z~R_Zoaj;6U<}U*8!b@j^PcU2g8-$<-S! zT1@c(Ap-Cwf1x7v^)r_Hal}F<9w+p-=IIe?Oij@Th`oWCV(9ueyJbZA*~Y3}!+PPo zx+Ymgg{S8cfi-Mhd8v-8LG@=MSNSZBtH1)c%mtwMPnXjz0bik4VZnEq(iEPp_v72Arse|mnEv7q>^lvUd@kAi-P)mNyKLis=K4M#Lcqt z^=cUp3%-h;dT7C)wy21(&B2n0V!TKtU)l#5-B8}_tZ&!KKOX(g?4hho)p zD+E0}fY@ar(5nLW@gJ0kFbvW6f2C(z{#1p}qK;z=zjS#0{b)tj56;x6ww?|}sA;Fe zQdCfwAj4J@{U@uRNYCAcfaZZudc>@6WO&%;9~vTZq#1PKn_{r+x6vzn5b{~UA2*2h z*93|aSQVM?vwWy1JH&gAR=-O2H(u_~c{KE`8)@<|F@@%BH%``9=jV4Duq}W12Nn6> zMway0nM3qSjiG(D8xec)MA6u`XkDn*fJ0#)Qdu zo>y)dD)dVBO0=mlhNXxL#?L-eVj+LMc2H@Ez>MiJ`T4({GE4x9H4_aqlswY;G1{qe zhe1$67hHGvD<`jmU7+V(4^qpv1W>f5R1rwg^kecf3Ed!)+os#cP{t|b)GYj zZaZeT34$h}#3Wk{`%&v-Q|}4?wp#g>*JWEF`Vly(>I>?>4F|vzzfVP@{jlF!t%J6R z{;h#oQN*=5RX)}whUfg75CZFsZtl?CL3EHbJjC8t$GEHb<6qNm^xyQTo7+G4)QrC; zZ1D=tT66Ny(7>0DcK0T2g0bnHNM^)O0uxHI?-1=TlgVi=`}L6skyl5B=2c*w!}Qh z>3b28+FUemiKuPr-B(b0ps)$O`8}V+x>S<+iJ4a9%z-`S=A2>|J&h;D``?h*8w03n z+*@j^nwz{3KWL;z{QrZ`oRUOs61lt;yvk@Oow_dMa1(QZk0~j`GvxVMLJDFFo2&X3t*{N9r#Gc)i>Q5U%d!= zUx?O4nmll^^5rkK3~lywYa|;m3F{{=q%KMXfs)AHeElhaetoJP<0@5Q0C&volMbFg z@&gdqy`@&DOWlf1J*}0Mm5hu`mznh^E*>7AlOEc3Y4$Jm>v@OEpMois^Onr8n`3h% zvslnW=8M_9@`4w#6y|e7XNuW~6C#SE3R0=z6ee7+1~r@5C+aR&b;)?NcUZX8@aHi1 zpi_~Nw{L43vMVS0_0OXQHH3U^o1ApKbSUj_di!Y=lCOUjZ5QV$GO>MkO(wWNvrJb>z(&tWgUU(?0x?#&wi87(@#2O*z>_eElnXY9t)*(K+^u< zQOol7* z`OtVGKCkw~`(MH5k7VcX2-@SB1JCLaT@S|TBZOm98SB)z8vo!y@B9~Cat1Kv_F(CW zr6q-R-FZXu!w=~hz+y6G~?L569Qi&=L&T=oc3k02n)G@B6D1UD@58?+sQ0i!PXBgz)&}mQM=# z%1xOn;XaNXMim;RY5?l;5-!5MB^FY#-|};7!>qU6-m;?7%(?sZkYWtdnPUj{mW;7Q z`up00zU(jPr{}r)@cOW)-ftXP_U2D4b7kWmw*KUsYx#H+LNuJW(|G4JEWMsXvIm$L z((tB_9W@s+Sh61h`nFFAkNL^@6^rf#@LYGDKD3% zZR1S`Z?Dg&y$9kB3gz~&F$=Zb4zFB^OqhJuEOn2F%dPmI<3qZ^@c=b+oDa4OIrFQx zfrLaoeyx^$-P~ppqp*-uwTU}pB8&_G5P1Slin6r@WAhg(s;Z>qc&k6#+t=6GVgd&9 zMG!Rwg(2Til8ASMXy!7X-2?nS0t&y1y!|GZcXxNUJP6yox$IrqTIpuJR?qXDH$;Gj>hsBMV<35IejZF0N7&Xk z4{s2Fo=Kva_tEwC^aMpjkg2q+@*M!3B!)N!N+W}^$fkdnlI7na1B{?a$MYqB&nl=k01{;7Xp@^- z0KA&0P1kbg;YS}%k0NWHHSCZMhQ6zk6Zj+N_3fN36Qnw&jCVbc2p=0_&7tK55h?CK zG<@uvInha=voAQO0kPm|cmr!zd(5N!K^D@s&Gsl;)!$>wyWb4rP?L~+ibu3&aIsAL z7zEdl0+ph)w6yT>aIjPYEVN_I7Enw8!1hog-m-#%w=^*T5bb?Fp>9_v$iPta{W}|1 zoGT2LF61$Kcp2hb`tk`-Qpl>U1(;w!dCJMl!`LM5H*@~*;e(CMULvQtdm1YvV=}w3 zq_T3%h{c(^5U^@~e*TZIGs?>q^T&b&H`mv%@8JN$51z`2#tCF);$%!Y5?OS9EFZh0 zA$FW?Q|+y|ZuBSC*75{rRaRDZg%QE_rr8tvYJ4By0Ap{r(7;VY1Gt1>1gNCKOEfAd zuS#NQ0Y6Cd-8+K{4KQ8!!OwY~= z0P@k^o=vHmAl)M7rY5jRA&<)XdQHkGz~<+tqB8!CZDC_mQcwUG&Ft*#A$ZJx_zr#r zVFNt3Q@s~xAox-t|FrGnV}*Q9&>*i~Hf>T=gpX}29bY#46RD!!LY4tNN3FP~yqpy{ zgxp+H_}w*H$KGs>b!RXxargZy*@H&2r>nU5uZ*XYAU^;tf3*BN3cM7t$6AyW=#0ry z?Pk4l9TxpopL==5?1lybDk`zi_Gh2}%s!n*ssS00$o<(^PEHO8@Bt;``gHU0Yjg9> zo)}tPmIS@>bm0#dHMmW?B*%7tJm8?EU>yq$3qx=A1J=Zm7;5+pu&=<_10&M#`l~d- zl3)$U#DKE(M=?<*Hwg?Q@OZAS+0xK)M_SZyMkgqWd%ut0QO^8P@gF0* zJPdLJr$svQp1={$(h*L>n_s^KoevhHptw>6Ap9Z3D^=?|^#U~Tt5zdkg*chGgamV* zvLGgwmPEtYw zeUn%~P!LR)c7v}WA$@>44w?vq)y>$XL485*o`Pp~A_G+&X`nw+1?bSZxt`5F*C*>h z>I2McmV{j(Qv?L)^lEK1)zzndO9}wm7`RF_tIPn!0`N<$YCJFYW}baE0uXScgMq<8 zyjG7d0v|3)mJWx8hBiImU`U-e`ZZg;>a|MC3JVDqcxAIk!2LAUFJ1*lM1YgM3W|yd zkE;NKP*6~Cb09e(F3$Dt>X@S2`QrSXM8u1alF|q?)yNtU001!-SRX*~gNA;5y$oK! zt+6>Hqs^)YQMp@QyX6ZZA>pqG7D)BKD}aVQNSwoNo)2K;0ka!S;S|KNv9Zn*8$G>6 z;J$vbltc)f{6?pA+~NjDy8%K7PWOVv{7_^mJx(yNmb^Tg#syO3Co;0KtAGCBvFhy| zyO)vZdlpMIDJKR~1L7DV5fSWgQCDAo$T6kUh@CL(@AINx$(CI*g|CJa^S^)h?z_{v z%%}EuYHIOd$%>1^B_o3ZLlV5_bZ0IhSky21!bn1Zk~WWvY0j16c^NQ~|2M3i?^%Js z^QcOB8QhXX@iau()g4Plb9)EEzH_T2trQ*f>8XzmF6_JR;=P29!@DSo50jw6=)nmh z${(sIVRm<&wzf8Z&RoRotLPz9BuNIgy!1|}e^_g)-@Lb)4%2SgDM`uT{+$cS2w{Va zKZ3AnebU2JtDZUg*=6LiRjze+3D!apZoV>JuK^O(*R}# zSlXXK07((3@qoZluUx%E((U2l;^0+Ym|(=?E8i|2cL!qQWc=g=S-GUIN$R4gbgt6c zxmLeu3ah_VTXj0-E_CQ!OdIDmt2FQBzAx5$$GBe>TP<6d%NHk&5`pl@D44umNRC)k z2ocCD2pdOS9@*!IQ-o(mzFZpWNxR#ON=#3@9(d?HQQe7M-$=a@2K^(r8R&ruYo zQ=F0_IBRN`nUS&4VMUZjkOUv!K(iJ&RWKVsI%ro1=)^!@5PoB=1(-H1nPh9P)XVka z>d0B;808qZ3bLglJcZI;lN<0PTU%KfRZRc-^$RcyVX$1BXP?^*rnTyfYqWTIc+AYq z+?pqU{zNDx%tbi@k<=uMw$PAl^!W7jw}b?BEiIX;N)0BSWcmCtU{WlstY1VkfizEW zaPYu@yq0VHKzw?zIOWK~f-pBXP-e8OdCwFNr^}zP(u|jXB`KpoT}<>Vwe*KkB>cn` zRMWD{E=9BMW28$V_y9hI_`AgOfXE|75-}LZAnkKhG;j8i>Dil2wHNxw5xyghk}BH9 zE~UG-nX8AqdP#0I*JD0fh7sx2Exz$O^^*$8?!l+FEUQaP^;eo0L4gPNn?<~@t0U%{ z`IdZ|*I0cUt_Wtlu-?C*v}-gSia$q4b5xXAg+9n+MIG7Kgd4?v)7EAjAUrY1YD7;( z1IT{~;GDg?CRUdzg;&sz}8$t`6IQ7yDPDWN>86?< zhJbz6_rX#DPW@qmlGE#;q`u5$a6*L_KUUXAG$6M===h>tNzvl==f3U3?Y^^DS>0{S z;+M)AMQHj1xBVH+cOGP!)PHVI81-cm+YjQ zDJkQ-=j{eZV8Nk@kuFq$1K}~AWLrQajP1&;`3{-r%#`ra7_xn;>Fh0(a8~; z0(4nq{{=e`rC}lGxN$W3K8P@^5N?2MV%FehE-Nl3 z01HSru%@J@dLJ#n0TgRP!xg|KmQYfm!$~BXjf;;5VpBi2{}vJfRr?Lr#^z>7NC*(* ziS98`QhGiR$;iM!np`3h59A5RkpUk$qPNoG^XUA1N{>nJ&`>`2+r%l3DOCHLy? zR8j<70Vo@M=Hcbdca!KFW)4&9Jr*Jh5`X`)l1UH>Eg#$7Ny-};41n5& zs;VkDrj3Y*2*_^D93BTnQCotXGfrJEYUu=|8brKyDypjValI20s;LUyY@sr_;8&(B zxInKEcaKEsX=!l~hUt}08C49sM5+0J{<6PEr{oOaN`?vD!?wDAdnH@L>-j8P4Lx=f zJzc{&2#?^GANrLsfdcYZx?o=WMXp3SkOYC)lsFu)T!B)RzrTN1SJ!wnC{Pja z0@2_;C1=inxTO;xJG+va8eWiiih{YGo*p0ZH*#w>=GY^@OEEbNr17b$y_m zWL49Uoh|lHLF}5}J-Zsovb&P)pw|f5NQP?6a#YFE7W$ zz@T}70z?sP(=sNkl9Q9c{dYc4Z{qTj5*O zfwSmH1zZXW3xm4ufN-0yudkR`M++RW&M4OY0sRtDIe`sYvov28hBQCj4gsno7j$5|=t2OAm%b)p>DaFEDW`b9*( z2suXlzU%%NGEEyw7t9m_<@(O4cQ_98I+3N#=%}Q73?g4XY0sF#76tm)478iSpJV?) z$Flcxe?0Bl^a!$tZ7RefgVMAbkow%HLR^R?*eH+#WM#jfkCjFldeW|XwA3C@|L=|~ zs$)dRci%+A6w{G8EH?&ed{K@T;+LzG9UT7Tcb=!%Po!o3HRvm^AM}Mi1akZ2l5KkF zRyVI4@|E{>)1y7gMF`~L;|pIq1ATjy9+MlS|L+?-AZcVQ{_)?A``g11X$b}KGEoEn F{{x8PAQ=Dv literal 47452 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 MNlUR-!Rqz@0LOf80ssI2 From acd4a47a3912ea57e08a8a9ab1e14de5c9f9d12f Mon Sep 17 00:00:00 2001 From: erikmaarten Date: Mon, 28 Sep 2015 20:28:16 +0200 Subject: [PATCH 012/114] Added category "communications" to metadata Communications seems to a better fit than productivity since this is primarily a chat app. (See specifications of categories here: https://github.com/sandstorm-io/sandstorm/blob/master/src/sandstorm/package.capnp) --- .sandstorm/sandstorm-pkgdef.capnp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 0041c47145b..2c0b0f50c61 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -50,7 +50,7 @@ const pkgdef :Spk.PackageDefinition = ( website = "https://rocket.chat", codeUrl = "https://github.com/RocketChat/Rocket.Chat", license = (openSource = mit), - categories = [productivity], + categories = [communications, productivity], author = ( contactEmail = "team@rocket.chat", From 394dde0402024ab5334e7913acd563ed1aeaacf8 Mon Sep 17 00:00:00 2001 From: Asheesh Laroia Date: Mon, 5 Oct 2015 17:15:39 -0700 Subject: [PATCH 013/114] Remove auto-generated directory This commit removes a directory that is automatically created as part of doing `vagrant-spk up`. --- .../default/virtualbox/action_provision | 1 - .../default/virtualbox/action_set_name | 1 - .../machines/default/virtualbox/creator_uid | 1 - .../.vagrant/machines/default/virtualbox/id | 1 - .../machines/default/virtualbox/index_uuid | 1 - .../machines/default/virtualbox/private_key | 27 ------------------- .../default/virtualbox/synced_folders | 1 - 7 files changed, 33 deletions(-) delete mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/action_provision delete mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/action_set_name delete mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/creator_uid delete mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/id delete mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/index_uuid delete mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/private_key delete mode 100644 .sandstorm/.vagrant/machines/default/virtualbox/synced_folders diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/action_provision b/.sandstorm/.vagrant/machines/default/virtualbox/action_provision deleted file mode 100644 index 6aad4c25eaf..00000000000 --- a/.sandstorm/.vagrant/machines/default/virtualbox/action_provision +++ /dev/null @@ -1 +0,0 @@ -1.5:1345ca5b-3c86-44b9-98c3-6a6f3a6574c6 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name b/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name deleted file mode 100644 index 991fdfbedb0..00000000000 --- a/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name +++ /dev/null @@ -1 +0,0 @@ -1443070908 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid b/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid deleted file mode 100644 index e37d32abba4..00000000000 --- a/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid +++ /dev/null @@ -1 +0,0 @@ -1000 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/id b/.sandstorm/.vagrant/machines/default/virtualbox/id deleted file mode 100644 index fa709b2a089..00000000000 --- a/.sandstorm/.vagrant/machines/default/virtualbox/id +++ /dev/null @@ -1 +0,0 @@ -1345ca5b-3c86-44b9-98c3-6a6f3a6574c6 \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid b/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid deleted file mode 100644 index df17d5233f0..00000000000 --- a/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid +++ /dev/null @@ -1 +0,0 @@ -7506910154f049b6bfaf858c95fbda9c \ No newline at end of file diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/private_key b/.sandstorm/.vagrant/machines/default/virtualbox/private_key deleted file mode 100644 index ef084242f4a..00000000000 --- a/.sandstorm/.vagrant/machines/default/virtualbox/private_key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEogIBAAKCAQEAuN+C01kgL0/h0UXiUMJ2lDfTi4oMlBozHEvJxKI+o3Z9o+43 -+qxPpGLhCofYUBl5I6hQAjEbfS5Bq4gNoRga3A3YyAMYVWsZKqY3/57uxfwXlDCq -FhjC6qQpmAm4lXNF723L/oEQKOUuIVcHB5Lxnjza9c7PVnx8a/einpzqqc4VwqPt -Zy3FIp9gni9aUAqkMxK1GAtmaogj1bCMTaAx7nysKIYRKU+UpDsOcXrdCzr8pvCd -IJPX03dWYLaI2SVGMsTpBoC94AemvUESzEmNkjAD/AiPKvfHefFjFe8N8HXW1uxc -LEe0NDu0sNK7L8KNtRKUETnlJovxddvauqZXDQIDAQABAoIBAEF7QY50mhbH95c1 -ZpTuXCvhnjdlnVDz+riCC6RvRzqE5LmkzgUm9Uqnj0g4l6C/dQ3xNu2f0TnEoZQN -K66sqA7bhLZLilnvBkn5+Am9lJth0EQ3/Ha5LIkJvoXQo6Wj39iPjlrGAiBKFM3Q -UngXTyeaLIA2UXAzxapEW0BNGj0sXD9xnKJXkePVssy8KYwhXb4ZJgPxATgr7VIM -wSVPEJJQhEacDglu4fg+TC7BdvgRRvclURRuO57pDrSmTi1I1/NTrq2spv3/YuHw -2nvxNHRQmuCwgjLNvS7e75qnF6eR4qWjwIwH57zu6M8RJYbhFqvEvIZ57VctuKxn -jvPayS0CgYEA6Xl3YRt9qdwSmsYKwbfLs6ARpJ7VPbPAko4EG1Kthtl+SyVU6lg2 -mAts4FInjlVLLpdbWzzBqpKvpbFzEMto+j+czAcwnqdNa7NlI2GJbWRk6j5h5yuv -RSJdwbIjbUmMbWqM1cSM8g/mGYiuj2rCCil4v0aMujXyWu8cb5aNY68CgYEAyrWm -Y0r9qoG4pb9GSNAPoTWeINEB9damVXOhr8OBnlRARDz82Sk/anhyBeEm2CleBXwF -b06o5bMoepJsporfm1GS9JXvE5oD1bfHQ3R1da/FtKFN0xH/u8gkKYF0MRfpr2Ri -XkaNKKyBNv990EGjGRoJuJyu9NKip6bkhlqzlAMCgYBSV968xv9ZCx8cq0Bb9kDH -x2qxjrtSmbUPezsDj/NXnhmm0zHRvO70TQNHUnJVBswPUJ6N3S3IxRdh7uXQRI1v -xUO9ycNiEUuC8rB2/A2GIWReIUZSS9vzHB3JFNTd1JTMeknVkw7KyMS0uLooJtTs -1JebjnxPqHsjizWSPZz8TQKBgHXJYVp227j00Zc18qAijcJtxmlpKUtxI4upufzI -jIu0hvdfvMhuyFOUkyTJdGnMd76WFw5bVZbLKK04YfvP3CiDGPIYIShxqOLJe/a9 -N/dfYHEZ/X+1CLVTkXewqhRQwc/Rc7s2IZXNzvNnN/MIAL54O8fS+3J05mCmgEl1 -cL2DAoGAXK9cPG2UpT0vGoRPvBHkAunIQ6JNZL9F9O+8W4pp8Fgpy/lubw7Lu+UC -RLaEuxTEPXYFG5RWbOlDcvWQ6yrx/Xhnfi49F9r5A79RADlPAygK7xtqx0dY3y7S -39SyHDsDVUXokHp8tiyOxDfqcahAodbfcROdyhvklB1o7UYVXwA= ------END RSA PRIVATE KEY----- diff --git a/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders b/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders deleted file mode 100644 index a01b299f5db..00000000000 --- a/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders +++ /dev/null @@ -1 +0,0 @@ -{"virtualbox":{"/opt/app":{"guestpath":"/opt/app","hostpath":"/home/sam/projects/Rocket.Chat/Rocket.Chat","disabled":false},"/host-dot-sandstorm":{"guestpath":"/host-dot-sandstorm","hostpath":"/home/sam/.sandstorm","disabled":false},"/vagrant":{"guestpath":"/vagrant","hostpath":"/home/sam/projects/Rocket.Chat/Rocket.Chat","disabled":false}}} \ No newline at end of file From 5bfeeb4376d49bee07cd8d5cc3d419f50d7854a8 Mon Sep 17 00:00:00 2001 From: Asheesh Laroia Date: Mon, 5 Oct 2015 17:20:22 -0700 Subject: [PATCH 014/114] Add VirtualBox/Vagrant state to gitignore --- .sandstorm/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .sandstorm/.gitignore diff --git a/.sandstorm/.gitignore b/.sandstorm/.gitignore new file mode 100644 index 00000000000..8000dd9db47 --- /dev/null +++ b/.sandstorm/.gitignore @@ -0,0 +1 @@ +.vagrant From ea4f88a6f5cbe844eed301cb4b1dbc76752b69cd Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Sat, 24 Oct 2015 16:28:16 -0200 Subject: [PATCH 015/114] Added user sync data setting and reverting indentation. --- packages/rocketchat-ldap/config_server.coffee | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/rocketchat-ldap/config_server.coffee b/packages/rocketchat-ldap/config_server.coffee index 7d54c412493..83527605789 100644 --- a/packages/rocketchat-ldap/config_server.coffee +++ b/packages/rocketchat-ldap/config_server.coffee @@ -2,11 +2,12 @@ MeteorWrapperLdapjs = Npm.require 'ldapjs' Meteor.startup -> RocketChat.settings.addGroup 'LDAP' - RocketChat.settings.add 'LDAP_Enable' , false , { type: 'boolean', group: 'LDAP', public: true } - RocketChat.settings.add 'LDAP_Url' , 'ldap://', { type: 'string' , group: 'LDAP' } - RocketChat.settings.add 'LDAP_Port' , '389' , { type: 'string' , group: 'LDAP' } - RocketChat.settings.add 'LDAP_DN' , '' , { type: 'string' , group: 'LDAP', i18nLabel: 'LDAP_Dn', public: true } - RocketChat.settings.add 'LDAP_Bind_Search', '' , { type: 'string' , group: 'LDAP' } + RocketChat.settings.add 'LDAP_Enable', false, { type: 'boolean', group: 'LDAP', public: true } + RocketChat.settings.add 'LDAP_Url', 'ldap://', { type: 'string' , group: 'LDAP' } + RocketChat.settings.add 'LDAP_Port', '389', { type: 'string' , group: 'LDAP' } + RocketChat.settings.add 'LDAP_DN', '', { type: 'string' , group: 'LDAP', i18nLabel: 'LDAP_Dn', public: true } + RocketChat.settings.add 'LDAP_Bind_Search', '', { type: 'string' , group: 'LDAP' } + RocketChat.settings.add 'LDAP_Sync_User_Data', false, { type: 'boolean' , group: 'LDAP' } timer = undefined From e16b4c1a6c6db1cc952a567d82160ad213867cc1 Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Sat, 24 Oct 2015 16:29:13 -0200 Subject: [PATCH 016/114] Syncing common user data during login based on admin setting. --- packages/rocketchat-ldap/ldap_server.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/rocketchat-ldap/ldap_server.js b/packages/rocketchat-ldap/ldap_server.js index ba571b8b071..895d593e8b6 100644 --- a/packages/rocketchat-ldap/ldap_server.js +++ b/packages/rocketchat-ldap/ldap_server.js @@ -203,6 +203,9 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) { // Instantiate LDAP with options var userOptions = loginRequest.ldapOptions || {}; + if (RocketChat.settings.get('LDAP_Sync_User_Data')) { + userOptions.searchResultsProfileMap = true; + } // Don't allow overwriting url and port delete userOptions.url; @@ -287,6 +290,24 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) { throw new Meteor.Error("LDAP-login-error", "LDAP Authentication succeded, but no user exists in Mongo. Either create a user for this email or set LDAP_DEFAULTS.createNewUser to true"); } + if (userId && RocketChat.settings.get('LDAP_Sync_User_Data')) { + userData = {}; + if (ldapResponse.searchResults.hasOwnProperty('mail')) { + userData.emails = [{ + address: ldapResponse.searchResults.mail, + verified: true + }]; + } + + if (ldapResponse.searchResults.hasOwnProperty('name')) { + userData.name = ldapResponse.searchResults.givenName; + } + + if (_.size(userData)) { + Meteor.users.update(userId, { $set: userData }); + } + } + return { userId: userId, token: stampedToken.token From d0c81f9bc4809186db903cd232e455695c38f671 Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Sat, 24 Oct 2015 16:37:11 -0200 Subject: [PATCH 017/114] Added translation messages --- i18n/en.i18n.json | 1 + i18n/pt.i18n.json | 1 + 2 files changed, 2 insertions(+) diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index f725b4f8b1e..9197358c9e5 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -185,6 +185,7 @@ "LDAP_Dn" : "Distinguished Name (DN)", "LDAP_Enable" : "Enable LDAP", "LDAP_Port" : "LDAP Port", + "LDAP_Sync_User_Data" : "Keep user data in sync with server", "LDAP_Url" : "LDAP URL", "Leave_room" : "Leave room", "line" : "line", diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index a3008e91087..92f93a4ea49 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -171,6 +171,7 @@ "LDAP" : "LDAP", "LDAP_Dn" : "DN LDAP", "LDAP_Port" : "Porta LDAP", + "LDAP_Sync_User_Data" : "Manter dados dos usuários sincronizados", "LDAP_Url" : "URL LDAP", "Leave_room" : "Sair da sala", "line" : "linha", From 6bf476b49ff99aca22166e7586f5a019d9f65ac9 Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Sat, 24 Oct 2015 16:52:01 -0200 Subject: [PATCH 018/114] Supporting single and multi e-mails addresses --- packages/rocketchat-ldap/ldap_server.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/rocketchat-ldap/ldap_server.js b/packages/rocketchat-ldap/ldap_server.js index 895d593e8b6..b54011c73aa 100644 --- a/packages/rocketchat-ldap/ldap_server.js +++ b/packages/rocketchat-ldap/ldap_server.js @@ -293,10 +293,17 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) { if (userId && RocketChat.settings.get('LDAP_Sync_User_Data')) { userData = {}; if (ldapResponse.searchResults.hasOwnProperty('mail')) { - userData.emails = [{ - address: ldapResponse.searchResults.mail, - verified: true - }]; + + if ('object' == typeof ldapResponse.searchResults.mail) { + userData.emails = _.map(ldapResponse.searchResults.mail, function (item) { + return { address: item, verified: true}; + }); + } else { + userData.emails = [{ + address: ldapResponse.searchResults.mail, + verified: true + }]; + } } if (ldapResponse.searchResults.hasOwnProperty('name')) { From 2a3bb638eadc8dd44be78623abb420c3423fbbbb Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Sun, 25 Oct 2015 15:15:19 -0200 Subject: [PATCH 019/114] Added admin setting for fiel mapping between LDAP -> RocketChat --- packages/rocketchat-ldap/config_server.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rocketchat-ldap/config_server.coffee b/packages/rocketchat-ldap/config_server.coffee index 83527605789..1782d782b4d 100644 --- a/packages/rocketchat-ldap/config_server.coffee +++ b/packages/rocketchat-ldap/config_server.coffee @@ -8,6 +8,7 @@ Meteor.startup -> RocketChat.settings.add 'LDAP_DN', '', { type: 'string' , group: 'LDAP', i18nLabel: 'LDAP_Dn', public: true } RocketChat.settings.add 'LDAP_Bind_Search', '', { type: 'string' , group: 'LDAP' } RocketChat.settings.add 'LDAP_Sync_User_Data', false, { type: 'boolean' , group: 'LDAP' } + RocketChat.settings.add 'LDAP_Sync_User_Data_FieldMap', '{"cn":"name", "mail":"email"}', { type: 'string' , group: 'LDAP' } timer = undefined From efe01c6e502c1f629448a825f43435ba24020540 Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Sun, 25 Oct 2015 15:16:35 -0200 Subject: [PATCH 020/114] Refactoring - added support for dynamic field mapping --- i18n/en.i18n.json | 1 + i18n/pt.i18n.json | 1 + packages/rocketchat-ldap/ldap_server.js | 54 +++++++++++++++++-------- 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 9197358c9e5..3925308acac 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -186,6 +186,7 @@ "LDAP_Enable" : "Enable LDAP", "LDAP_Port" : "LDAP Port", "LDAP_Sync_User_Data" : "Keep user data in sync with server", + "LDAP_Sync_User_Data_FieldMap" : "User data field map", "LDAP_Url" : "LDAP URL", "Leave_room" : "Leave room", "line" : "line", diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 92f93a4ea49..b54800e035b 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -172,6 +172,7 @@ "LDAP_Dn" : "DN LDAP", "LDAP_Port" : "Porta LDAP", "LDAP_Sync_User_Data" : "Manter dados dos usuários sincronizados", + "LDAP_Sync_User_Data_FieldMap" : "Mapeamento de campos do usuário", "LDAP_Url" : "URL LDAP", "Leave_room" : "Sair da sala", "line" : "linha", diff --git a/packages/rocketchat-ldap/ldap_server.js b/packages/rocketchat-ldap/ldap_server.js index b54011c73aa..68b8beb8c50 100644 --- a/packages/rocketchat-ldap/ldap_server.js +++ b/packages/rocketchat-ldap/ldap_server.js @@ -3,7 +3,7 @@ Future = Npm.require('fibers/future'); var slug = function (text) { text = slugify(text, '.'); return text.replace(/[^0-9a-z-_.]/g, ''); -} +}; // At a minimum, set up LDAP_DEFAULTS.url and .dn according to // your needs. url should appear as "ldap://your.url.here" @@ -86,7 +86,7 @@ LDAP.prototype.ldapCheck = function(options) { var bind = function(dn) { dn = dn.replace(/#{username}/g, options.username); - console.log('Attempt to bind', dn) + console.log('Attempt to bind', dn); //Attempt to bind to ldap server with provided info client.bind(dn, options.ldapPass, function(err) { try { @@ -127,7 +127,7 @@ LDAP.prototype.ldapCheck = function(options) { }); } }); - } + }; if (LDAP_DEFAULTS.bindSearch && LDAP_DEFAULTS.bindSearch.trim() != '') { try { @@ -290,29 +290,49 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) { throw new Meteor.Error("LDAP-login-error", "LDAP Authentication succeded, but no user exists in Mongo. Either create a user for this email or set LDAP_DEFAULTS.createNewUser to true"); } - if (userId && RocketChat.settings.get('LDAP_Sync_User_Data')) { + // LDAP sync data logic + syncUserData = RocketChat.settings.get('LDAP_Sync_User_Data'); + syncUserDataFieldMap = RocketChat.settings.get('LDAP_Sync_User_Data_FieldMap').trim(); + if (userId && syncUserData && syncUserDataFieldMap) { userData = {}; - if (ldapResponse.searchResults.hasOwnProperty('mail')) { + fieldMap = JSON.parse(syncUserDataFieldMap); - if ('object' == typeof ldapResponse.searchResults.mail) { - userData.emails = _.map(ldapResponse.searchResults.mail, function (item) { - return { address: item, verified: true}; - }); - } else { - userData.emails = [{ - address: ldapResponse.searchResults.mail, - verified: true - }]; + emailList = []; + _.map(fieldMap, function(userField, ldapField) { + if (!ldapResponse.searchResults.hasOwnProperty(ldapField)) { + return; } - } - if (ldapResponse.searchResults.hasOwnProperty('name')) { - userData.name = ldapResponse.searchResults.givenName; + // restrict field mapping to a known list of fields + switch (userField) { + + case 'email': + if ('object' == typeof ldapResponse.searchResults[ldapField]) { + _.map(ldapResponse.searchResults[ldapField], function (item) { + emailList.push({ address: item, verified: true }); + }); + } else { + emailList.push({ address: ldapResponse.searchResults[ldapField], verified: true }); + } + break; + + case 'name': + userData.name = ldapResponse.searchResults[ldapField]; + break; + + default: + break; + } + }); + + if (emailList.length) { + userData.emails = emailList; } if (_.size(userData)) { Meteor.users.update(userId, { $set: userData }); } + } return { From b8d0e284d90a7c0d520e3d7e3c590b6a8c1b6d45 Mon Sep 17 00:00:00 2001 From: Carsten Date: Mon, 26 Oct 2015 11:55:26 +0100 Subject: [PATCH 021/114] Update readme Added Firefox OS to WIP --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4c5013e8d0b..47dfcf1217f 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ It is a great solution for communities and companies wanting to privately host t - Support for PostgreSQL: [Issue #533](https://github.com/RocketChat/Rocket.Chat/issues/533), [Issue #822](https://github.com/RocketChat/Rocket.Chat/issues/822) - Native iOS Application [Issue #270](https://github.com/RocketChat/Rocket.Chat/issues/270), [Rocket.Chat.iOS - HELP WANTED](https://github.com/RocketChat/Rocket.Chat.iOS) - Native Android Application [Issue #271 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/271) +- Native Firefox OS Application [Issue #1204](https://github.com/RocketChat/Rocket.Chat/issues/1204) - Off-the-Record (OTR) Messaging [Issue #36](https://github.com/RocketChat/Rocket.Chat/issues/36), [Issue #268 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/268) - API-enabled methods: [Issue #202](https://github.com/RocketChat/Rocket.Chat/issues/202), [Issue #454](https://github.com/RocketChat/Rocket.Chat/issues/454), [Issue #455](https://github.com/RocketChat/Rocket.Chat/issues/455), [Issue #759](https://github.com/RocketChat/Rocket.Chat/issues/759) - Scalable WebRTC broadcaster / media-server integration, [Issue #1118 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/1118) From 78c7822c0d7c7b59bc69ceec38454c8f254446a3 Mon Sep 17 00:00:00 2001 From: Oliver Beddows Date: Sat, 24 Oct 2015 14:27:17 +0100 Subject: [PATCH 022/114] Resetting TabBar on render. --- client/views/app/privateHistory.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/views/app/privateHistory.coffee b/client/views/app/privateHistory.coffee index 91d0aed6e00..b04ecd4f803 100644 --- a/client/views/app/privateHistory.coffee +++ b/client/views/app/privateHistory.coffee @@ -30,6 +30,9 @@ Template.privateHistory.helpers when 'd' return FlowRouter.path 'direct', { username: this.name } +Template.privateHistory.onRendered -> + RocketChat.TabBar.reset() + Template.privateHistory.events 'keydown #history-filter': (event) -> if event.which is 13 From 5a72c5a15e3eb0766bebeba367d38e38e126c23b Mon Sep 17 00:00:00 2001 From: Olivier Beddows Date: Mon, 26 Oct 2015 11:19:11 +0000 Subject: [PATCH 023/114] Fixing 'undefined' button titles. --- client/views/admin/users/adminUsers.coffee | 8 ++++---- packages/rocketchat-lib/client/lib/openRoom.coffee | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/views/admin/users/adminUsers.coffee b/client/views/admin/users/adminUsers.coffee index 3883baba47d..098901fb5b2 100644 --- a/client/views/admin/users/adminUsers.coffee +++ b/client/views/admin/users/adminUsers.coffee @@ -37,7 +37,7 @@ Template.adminUsers.onCreated -> @filter = new ReactiveVar '' @ready = new ReactiveVar true - RocketChat.TabBar.addButton({ id: 'invite-user', title: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 }) + RocketChat.TabBar.addButton({ id: 'invite-user', i18nTitle: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 }) @autorun -> filter = instance.filter.get() @@ -49,11 +49,11 @@ Template.adminUsers.onCreated -> if Session.get 'adminSelectedUser' channelSubscription = instance.subscribe 'userChannels', Session.get 'adminSelectedUser' RocketChat.TabBar.setData Meteor.users.findOne Session.get 'adminSelectedUser' - RocketChat.TabBar.addButton({ id: 'user-info', title: t('User_Info'), icon: 'icon-user', template: 'adminUserInfo', order: 2 }) - # RocketChat.TabBar.addButton({ id: 'user-channel', title: t('User_Channels'), icon: 'icon-hash', template: 'adminUserChannels', order: 3 }) + RocketChat.TabBar.addButton({ id: 'user-info', i18nTitle: t('User_Info'), icon: 'icon-user', template: 'adminUserInfo', order: 2 }) + # RocketChat.TabBar.addButton({ id: 'user-channel', i18nTitle: t('User_Channels'), icon: 'icon-hash', template: 'adminUserChannels', order: 3 }) else RocketChat.TabBar.reset() - RocketChat.TabBar.addButton({ id: 'invite-user', title: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 }) + RocketChat.TabBar.addButton({ id: 'invite-user', i18nTitle: t('Invite_Users'), icon: 'icon-plus', template: 'adminInviteUser', order: 1 }) @users = -> filter = _.trim instance.filter?.get() diff --git a/packages/rocketchat-lib/client/lib/openRoom.coffee b/packages/rocketchat-lib/client/lib/openRoom.coffee index 9176289077e..c4dae8c00a1 100644 --- a/packages/rocketchat-lib/client/lib/openRoom.coffee +++ b/packages/rocketchat-lib/client/lib/openRoom.coffee @@ -51,12 +51,12 @@ currentTracker = undefined , 100 RocketChat.TabBar.resetButtons() - RocketChat.TabBar.addButton({ id: 'message-search', title: t('Search'), icon: 'octicon octicon-search', template: 'messageSearch', order: 1 }) + RocketChat.TabBar.addButton({ id: 'message-search', i18nTitle: t('Search'), icon: 'octicon octicon-search', template: 'messageSearch', order: 1 }) if type is 'd' - RocketChat.TabBar.addButton({ id: 'members-list', title: t('User_Info'), icon: 'octicon octicon-person', template: 'membersList', order: 2 }) + RocketChat.TabBar.addButton({ id: 'members-list', i18nTitle: t('User_Info'), icon: 'octicon octicon-person', template: 'membersList', order: 2 }) else - RocketChat.TabBar.addButton({ id: 'members-list', title: t('Members_List'), icon: 'octicon octicon-organization', template: 'membersList', order: 2 }) - RocketChat.TabBar.addButton({ id: 'uploaded-files-list', title: t('Room_uploaded_file_list'), icon: 'octicon octicon-file-symlink-directory', template: 'uploadedFilesList', order: 3 }) + RocketChat.TabBar.addButton({ id: 'members-list', i18nTitle: t('Members_List'), icon: 'octicon octicon-organization', template: 'membersList', order: 2 }) + RocketChat.TabBar.addButton({ id: 'uploaded-files-list', i18nTitle: t('Room_uploaded_file_list'), icon: 'octicon octicon-file-symlink-directory', template: 'uploadedFilesList', order: 3 }) # update user's room subscription if ChatSubscription.findOne({rid: room._id})?.open is false From 1216405a17e37ef5ab297e5da53650a32e5cb52e Mon Sep 17 00:00:00 2001 From: Olivier Beddows Date: Wed, 21 Oct 2015 11:59:08 +0100 Subject: [PATCH 024/114] Chmodding files from 100755 to 100644. --- client/lib/customEventPolyfill.js | 0 packages/meteor-accounts-saml/saml_client.js | 0 packages/meteor-accounts-saml/saml_server.js | 0 packages/meteor-accounts-saml/saml_utils.js | 0 packages/meteor-streams/LICENSE | 0 packages/meteor-streams/README.md | 0 packages/meteor-streams/lib/client.js | 0 packages/meteor-streams/lib/ev.js | 0 packages/meteor-streams/lib/server.js | 0 packages/meteor-streams/lib/stream_permission.js | 0 packages/meteor-streams/package.js | 0 packages/rocketchat-favico/favico.js | 0 packages/rocketchat-favico/package.js | 0 .../client/stylesheets/utils/_keyframes.import.less | 0 .../client/stylesheets/utils/_lesshat.import.less | 0 packages/rocketchat-livechat/package.js | 0 packages/rocketchat-logger/package.js | 0 .../assets/stylesheets/utils/_keyframes.import.less | 0 .../assets/stylesheets/utils/_lesshat.import.less | 0 .../assets/stylesheets/utils/_octicons.less | 0 public/fonts/github/octicons.eot | Bin public/fonts/github/octicons.svg | 0 public/fonts/github/octicons.ttf | Bin public/fonts/github/octicons.woff | Bin public/images/logo/android-hdpi.png | Bin public/images/logo/android-mdpi.png | Bin public/images/logo/android-xhdpi.png | Bin public/images/logo/android-xxhdpi.png | Bin public/images/logo/android-xxxhdpi.png | Bin 29 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 client/lib/customEventPolyfill.js mode change 100755 => 100644 packages/meteor-accounts-saml/saml_client.js mode change 100755 => 100644 packages/meteor-accounts-saml/saml_server.js mode change 100755 => 100644 packages/meteor-accounts-saml/saml_utils.js mode change 100755 => 100644 packages/meteor-streams/LICENSE mode change 100755 => 100644 packages/meteor-streams/README.md mode change 100755 => 100644 packages/meteor-streams/lib/client.js mode change 100755 => 100644 packages/meteor-streams/lib/ev.js mode change 100755 => 100644 packages/meteor-streams/lib/server.js mode change 100755 => 100644 packages/meteor-streams/lib/stream_permission.js mode change 100755 => 100644 packages/meteor-streams/package.js mode change 100755 => 100644 packages/rocketchat-favico/favico.js mode change 100755 => 100644 packages/rocketchat-favico/package.js mode change 100755 => 100644 packages/rocketchat-livechat/app/client/stylesheets/utils/_keyframes.import.less mode change 100755 => 100644 packages/rocketchat-livechat/app/client/stylesheets/utils/_lesshat.import.less mode change 100755 => 100644 packages/rocketchat-livechat/package.js mode change 100755 => 100644 packages/rocketchat-logger/package.js mode change 100755 => 100644 packages/rocketchat-theme/assets/stylesheets/utils/_keyframes.import.less mode change 100755 => 100644 packages/rocketchat-theme/assets/stylesheets/utils/_lesshat.import.less mode change 100755 => 100644 packages/rocketchat-theme/assets/stylesheets/utils/_octicons.less mode change 100755 => 100644 public/fonts/github/octicons.eot mode change 100755 => 100644 public/fonts/github/octicons.svg mode change 100755 => 100644 public/fonts/github/octicons.ttf mode change 100755 => 100644 public/fonts/github/octicons.woff mode change 100755 => 100644 public/images/logo/android-hdpi.png mode change 100755 => 100644 public/images/logo/android-mdpi.png mode change 100755 => 100644 public/images/logo/android-xhdpi.png mode change 100755 => 100644 public/images/logo/android-xxhdpi.png mode change 100755 => 100644 public/images/logo/android-xxxhdpi.png diff --git a/client/lib/customEventPolyfill.js b/client/lib/customEventPolyfill.js old mode 100755 new mode 100644 diff --git a/packages/meteor-accounts-saml/saml_client.js b/packages/meteor-accounts-saml/saml_client.js old mode 100755 new mode 100644 diff --git a/packages/meteor-accounts-saml/saml_server.js b/packages/meteor-accounts-saml/saml_server.js old mode 100755 new mode 100644 diff --git a/packages/meteor-accounts-saml/saml_utils.js b/packages/meteor-accounts-saml/saml_utils.js old mode 100755 new mode 100644 diff --git a/packages/meteor-streams/LICENSE b/packages/meteor-streams/LICENSE old mode 100755 new mode 100644 diff --git a/packages/meteor-streams/README.md b/packages/meteor-streams/README.md old mode 100755 new mode 100644 diff --git a/packages/meteor-streams/lib/client.js b/packages/meteor-streams/lib/client.js old mode 100755 new mode 100644 diff --git a/packages/meteor-streams/lib/ev.js b/packages/meteor-streams/lib/ev.js old mode 100755 new mode 100644 diff --git a/packages/meteor-streams/lib/server.js b/packages/meteor-streams/lib/server.js old mode 100755 new mode 100644 diff --git a/packages/meteor-streams/lib/stream_permission.js b/packages/meteor-streams/lib/stream_permission.js old mode 100755 new mode 100644 diff --git a/packages/meteor-streams/package.js b/packages/meteor-streams/package.js old mode 100755 new mode 100644 diff --git a/packages/rocketchat-favico/favico.js b/packages/rocketchat-favico/favico.js old mode 100755 new mode 100644 diff --git a/packages/rocketchat-favico/package.js b/packages/rocketchat-favico/package.js old mode 100755 new mode 100644 diff --git a/packages/rocketchat-livechat/app/client/stylesheets/utils/_keyframes.import.less b/packages/rocketchat-livechat/app/client/stylesheets/utils/_keyframes.import.less old mode 100755 new mode 100644 diff --git a/packages/rocketchat-livechat/app/client/stylesheets/utils/_lesshat.import.less b/packages/rocketchat-livechat/app/client/stylesheets/utils/_lesshat.import.less old mode 100755 new mode 100644 diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js old mode 100755 new mode 100644 diff --git a/packages/rocketchat-logger/package.js b/packages/rocketchat-logger/package.js old mode 100755 new mode 100644 diff --git a/packages/rocketchat-theme/assets/stylesheets/utils/_keyframes.import.less b/packages/rocketchat-theme/assets/stylesheets/utils/_keyframes.import.less old mode 100755 new mode 100644 diff --git a/packages/rocketchat-theme/assets/stylesheets/utils/_lesshat.import.less b/packages/rocketchat-theme/assets/stylesheets/utils/_lesshat.import.less old mode 100755 new mode 100644 diff --git a/packages/rocketchat-theme/assets/stylesheets/utils/_octicons.less b/packages/rocketchat-theme/assets/stylesheets/utils/_octicons.less old mode 100755 new mode 100644 diff --git a/public/fonts/github/octicons.eot b/public/fonts/github/octicons.eot old mode 100755 new mode 100644 diff --git a/public/fonts/github/octicons.svg b/public/fonts/github/octicons.svg old mode 100755 new mode 100644 diff --git a/public/fonts/github/octicons.ttf b/public/fonts/github/octicons.ttf old mode 100755 new mode 100644 diff --git a/public/fonts/github/octicons.woff b/public/fonts/github/octicons.woff old mode 100755 new mode 100644 diff --git a/public/images/logo/android-hdpi.png b/public/images/logo/android-hdpi.png old mode 100755 new mode 100644 diff --git a/public/images/logo/android-mdpi.png b/public/images/logo/android-mdpi.png old mode 100755 new mode 100644 diff --git a/public/images/logo/android-xhdpi.png b/public/images/logo/android-xhdpi.png old mode 100755 new mode 100644 diff --git a/public/images/logo/android-xxhdpi.png b/public/images/logo/android-xxhdpi.png old mode 100755 new mode 100644 diff --git a/public/images/logo/android-xxxhdpi.png b/public/images/logo/android-xxxhdpi.png old mode 100755 new mode 100644 From 066a3687293dee1a24b6626be9b9154162cb4b95 Mon Sep 17 00:00:00 2001 From: Oliver Beddows Date: Sat, 24 Oct 2015 13:30:33 +0100 Subject: [PATCH 025/114] Fixing spelling error: 'sportlight' -> 'spotlight'. --- .../views/app/{sportlight => spotlight}/mobileMessageMenu.coffee | 0 client/views/app/{sportlight => spotlight}/mobileMessageMenu.html | 0 client/views/app/{sportlight => spotlight}/spotlight.coffee | 0 client/views/app/{sportlight => spotlight}/spotlight.html | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename client/views/app/{sportlight => spotlight}/mobileMessageMenu.coffee (100%) rename client/views/app/{sportlight => spotlight}/mobileMessageMenu.html (100%) rename client/views/app/{sportlight => spotlight}/spotlight.coffee (100%) rename client/views/app/{sportlight => spotlight}/spotlight.html (100%) diff --git a/client/views/app/sportlight/mobileMessageMenu.coffee b/client/views/app/spotlight/mobileMessageMenu.coffee similarity index 100% rename from client/views/app/sportlight/mobileMessageMenu.coffee rename to client/views/app/spotlight/mobileMessageMenu.coffee diff --git a/client/views/app/sportlight/mobileMessageMenu.html b/client/views/app/spotlight/mobileMessageMenu.html similarity index 100% rename from client/views/app/sportlight/mobileMessageMenu.html rename to client/views/app/spotlight/mobileMessageMenu.html diff --git a/client/views/app/sportlight/spotlight.coffee b/client/views/app/spotlight/spotlight.coffee similarity index 100% rename from client/views/app/sportlight/spotlight.coffee rename to client/views/app/spotlight/spotlight.coffee diff --git a/client/views/app/sportlight/spotlight.html b/client/views/app/spotlight/spotlight.html similarity index 100% rename from client/views/app/sportlight/spotlight.html rename to client/views/app/spotlight/spotlight.html From 20881c7493a23a268b0fe91e1d07f67d1ccbc288 Mon Sep 17 00:00:00 2001 From: Oliver Beddows Date: Sat, 24 Oct 2015 13:30:51 +0100 Subject: [PATCH 026/114] Removing seemingly unused html. --- client/views/app/flexTabBar.html | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/client/views/app/flexTabBar.html b/client/views/app/flexTabBar.html index 01a5b3014aa..60f0bde69ba 100644 --- a/client/views/app/flexTabBar.html +++ b/client/views/app/flexTabBar.html @@ -4,22 +4,4 @@ {{/each}} - {{!--
- -
-
- -
--}} - {{!--
- -
-
- -
-
- -
-
- -
--}} From 8e87d96c8fede14c0b42e5de3601cc19363b54b2 Mon Sep 17 00:00:00 2001 From: Oliver Beddows Date: Sat, 24 Oct 2015 14:29:43 +0100 Subject: [PATCH 027/114] Removing disabled code. --- client/views/app/flexTabBar.coffee | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/client/views/app/flexTabBar.coffee b/client/views/app/flexTabBar.coffee index 53d12dae07d..0177eb907c6 100644 --- a/client/views/app/flexTabBar.coffee +++ b/client/views/app/flexTabBar.coffee @@ -25,15 +25,3 @@ Template.flexTabBar.events RocketChat.TabBar.setTemplate $(e.currentTarget).data('template'), -> $('.flex-tab')?.find("input[type='text']:first")?.focus() $('.flex-tab .content')?.scrollTop(0) - - # if Session.get('flexOpened') and Session.equals('whichFlexOpened', $(e.currentTarget).data('target')) - # Session.set('rtcLayoutmode', 0) - # Session.set('flexOpened',false) - # Session.set('whichFlexOpened') - # else - # $(e.currentTarget).addClass 'active' - # Session.set('flexOpened', true) - # Session.set('whichFlexOpened', $(e.currentTarget).data('target')) - - # # $('.user-info-content').hide() - # # $($(e.currentTarget).attr('href')).show() From fb6673656377e5aa8d84aa4877618aae4ba38485 Mon Sep 17 00:00:00 2001 From: Colin Shea Date: Mon, 26 Oct 2015 23:02:15 +0000 Subject: [PATCH 028/114] Use user-select: text; to re-enable selections Firefox interprets user-select: all; to mean that any clicks should result in the entire element's container being selected, regardless of the user's gesture. This results in the inability to select only a subset of characters in a chat message. Fixes #1242 --- .../assets/stylesheets/base.less | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/rocketchat-theme/assets/stylesheets/base.less b/packages/rocketchat-theme/assets/stylesheets/base.less index 7961f37d9cd..5ba2377c46f 100644 --- a/packages/rocketchat-theme/assets/stylesheets/base.less +++ b/packages/rocketchat-theme/assets/stylesheets/base.less @@ -2291,15 +2291,15 @@ a.github-fork { min-height: 40px; .body, .user.user-card-message, .time { - -webkit-user-select: all; - -moz-user-select: all; - -ms-user-select: all; - user-select: all; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; * { - -webkit-user-select: all; - -moz-user-select: all; - -ms-user-select: all; - user-select: all; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; } } From 8db4d65053bf5f2f914bdc7d023892baf6f68db4 Mon Sep 17 00:00:00 2001 From: Muhammad Mustadi Date: Tue, 27 Oct 2015 15:48:56 +0700 Subject: [PATCH 029/114] fix typo in function getPupupConfig --- client/views/app/room.coffee | 2 +- client/views/app/room.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/views/app/room.coffee b/client/views/app/room.coffee index 35f2083b865..a3e30778731 100644 --- a/client/views/app/room.coffee +++ b/client/views/app/room.coffee @@ -159,7 +159,7 @@ Template.room.helpers else return t('See_all') - getPupupConfig: -> + getPopupConfig: -> template = Template.instance() return { getInput: -> diff --git a/client/views/app/room.html b/client/views/app/room.html index 6189f9058b1..3c2380b3929 100644 --- a/client/views/app/room.html +++ b/client/views/app/room.html @@ -86,7 +86,7 @@
- {{> messagePopupConfig getPupupConfig}} + {{> messagePopupConfig getPopupConfig}}
@@ -154,4 +154,4 @@ {{> Template.dynamic template=flexTemplate data=flexData}} - \ No newline at end of file + From b4a24a2b73dd9dad6809d362000cb12177282d0d Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Tue, 27 Oct 2015 12:08:32 -0200 Subject: [PATCH 030/114] Explicitly declaring vars to limit scope. --- packages/rocketchat-ldap/ldap_server.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/rocketchat-ldap/ldap_server.js b/packages/rocketchat-ldap/ldap_server.js index 68b8beb8c50..dc82e57db7c 100644 --- a/packages/rocketchat-ldap/ldap_server.js +++ b/packages/rocketchat-ldap/ldap_server.js @@ -291,13 +291,13 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) { } // LDAP sync data logic - syncUserData = RocketChat.settings.get('LDAP_Sync_User_Data'); - syncUserDataFieldMap = RocketChat.settings.get('LDAP_Sync_User_Data_FieldMap').trim(); + var syncUserData = RocketChat.settings.get('LDAP_Sync_User_Data'); + var syncUserDataFieldMap = RocketChat.settings.get('LDAP_Sync_User_Data_FieldMap').trim(); if (userId && syncUserData && syncUserDataFieldMap) { - userData = {}; - fieldMap = JSON.parse(syncUserDataFieldMap); + var userData = {}; + var fieldMap = JSON.parse(syncUserDataFieldMap); - emailList = []; + var = emailList = []; _.map(fieldMap, function(userField, ldapField) { if (!ldapResponse.searchResults.hasOwnProperty(ldapField)) { return; From 3f2338151800a7f5d24ac5e929e8d3444dffe424 Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Tue, 27 Oct 2015 12:34:20 -0200 Subject: [PATCH 031/114] Updating to Meteor 1.2.1 --- .meteor/release | 2 +- .meteor/versions | 52 ++++++++++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.meteor/release b/.meteor/release index 5684262a835..3a05e0a2f70 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@1.2.0.2 +METEOR@1.2.1 diff --git a/.meteor/versions b/.meteor/versions index d6c44e8a020..b2a52c59f3e 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,15 +1,15 @@ -accounts-base@1.2.1 +accounts-base@1.2.2 accounts-facebook@1.0.6 accounts-github@1.0.6 accounts-google@1.0.6 accounts-meteor-developer@1.0.6 -accounts-oauth@1.1.7 -accounts-password@1.1.3 +accounts-oauth@1.1.8 +accounts-password@1.1.4 accounts-twitter@1.0.6 alanning:roles@1.2.14 aldeed:simple-schema@1.3.3 arunoda:streams@0.1.17 -autoupdate@1.2.3 +autoupdate@1.2.4 babel-compiler@5.8.24_1 babel-runtime@0.1.4 base64@1.0.4 @@ -22,36 +22,36 @@ caching-compiler@1.0.0 caching-html-compiler@1.0.2 callback-hook@1.0.4 cfs:http-methods@0.0.30 -check@1.0.6 +check@1.1.0 chrismbeckett:toastr@2.1.2_1 -coffeescript@1.0.10 +coffeescript@1.0.11 cosmos:browserify@0.8.1 dandv:caret-position@2.1.1 ddp@1.2.2 ddp-client@1.2.1 -ddp-common@1.2.1 +ddp-common@1.2.2 ddp-rate-limiter@1.0.0 -ddp-server@1.2.1 +ddp-server@1.2.2 deps@1.0.9 diff-sequence@1.0.1 dispatch:run-as-user@1.1.1 -ecmascript@0.1.5 -ecmascript-collections@0.1.6 +ecmascript@0.1.6 +ecmascript-runtime@0.2.6 ejson@1.0.7 -email@1.0.7 +email@1.0.8 facebook@1.2.2 fastclick@1.0.7 francocatena:status@1.5.0 geojson-utils@1.0.4 github@1.1.4 -google@1.1.6 +google@1.1.7 hot-code-push@1.0.0 html-tools@1.0.5 htmljs@1.0.5 http@1.1.1 id-map@1.0.4 idorecall:email-normalize@1.0.0 -jalik:ufs@0.3.0 +jalik:ufs@0.3.3 jalik:ufs-gridfs@0.1.1 jparker:crypto-core@0.1.0 jparker:crypto-md5@0.1.1 @@ -68,15 +68,15 @@ konecty:multiple-instances-status@1.0.3 konecty:nrr@2.0.2 konecty:user-presence@1.2.6 launch-screen@1.0.4 -less@2.5.0_3 +less@2.5.1 livedata@1.0.15 localstorage@1.0.5 logging@1.0.8 matb33:collection-hooks@0.8.1 -meteor@1.1.9 +meteor@1.1.10 meteor-base@1.0.1 -meteor-developer@1.1.4 -meteorhacks:kadira@2.23.6 +meteor-developer@1.1.5 +meteorhacks:kadira@2.24.1 meteorhacks:meteorx@1.4.1 meteorspark:util@0.2.0 minifiers@1.1.7 @@ -87,7 +87,7 @@ mobile-experience@1.0.1 mobile-status-bar@1.0.6 momentjs:moment@2.10.6 monbro:mongodb-mapreduce-aggregation@1.0.1 -mongo@1.1.2 +mongo@1.1.3 mongo-id@1.0.1 mongo-livedata@1.0.9 mrt:reactive-store@0.0.1 @@ -101,22 +101,22 @@ oauth1@1.1.5 oauth2@1.1.5 observe-sequence@1.0.7 ordered-dict@1.0.4 -pauli:accounts-linkedin@1.1.2 -pauli:linkedin@1.1.2 +pauli:accounts-linkedin@1.2.0 +pauli:linkedin@1.2.0 perak:codemirror@1.2.8 percolate:migrations@0.9.6 percolate:synced-cron@1.3.0 pntbr:js-yaml-client@0.0.1 -promise@0.5.0 +promise@0.5.1 qnub:emojione@1.5.1_1 raix:eventemitter@0.1.3 raix:eventstate@0.0.4 raix:handlebar-helpers@0.2.5 raix:push@2.6.13-rc.1 raix:ui-dropped-event@0.0.7 -random@1.0.4 +random@1.0.5 rate-limit@1.0.0 -reactive-dict@1.1.2 +reactive-dict@1.1.3 reactive-var@1.0.6 reload@1.1.4 retry@1.0.4 @@ -157,10 +157,10 @@ simple:json-routes@1.0.4 spacebars@1.0.7 spacebars-compiler@1.0.7 srp@1.0.4 -standard-minifiers@1.0.1 +standard-minifiers@1.0.2 steffo:meteor-accounts-saml@0.0.1 tap:i18n@1.7.0 -templating@1.1.4 +templating@1.1.5 templating-tools@1.0.0 tmeasday:crypto-base@3.1.2 tmeasday:crypto-md5@3.1.2 @@ -172,7 +172,7 @@ ui@1.0.8 underscore@1.0.4 underscorestring:underscore.string@3.2.2 url@1.0.5 -webapp@1.2.2 +webapp@1.2.3 webapp-hashing@1.0.5 yasaricli:slugify@0.0.7 yasinuslu:blaze-meta@0.3.3 From ed8a5c0581f2a4e1b5b3d36a0b85259a27dba8a6 Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Tue, 27 Oct 2015 13:22:54 -0200 Subject: [PATCH 032/114] Fixing typo --- packages/rocketchat-ldap/ldap_server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-ldap/ldap_server.js b/packages/rocketchat-ldap/ldap_server.js index dc82e57db7c..d12d9346940 100644 --- a/packages/rocketchat-ldap/ldap_server.js +++ b/packages/rocketchat-ldap/ldap_server.js @@ -297,7 +297,7 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) { var userData = {}; var fieldMap = JSON.parse(syncUserDataFieldMap); - var = emailList = []; + var emailList = []; _.map(fieldMap, function(userField, ldapField) { if (!ldapResponse.searchResults.hasOwnProperty(ldapField)) { return; From 61ef96ce24562f7e517be29f7d90dcc2c59f26e3 Mon Sep 17 00:00:00 2001 From: graywolf336 Date: Tue, 27 Oct 2015 15:59:28 -0500 Subject: [PATCH 033/114] Allow the avatars to be set via a provided url, must currently be a jpg --- .meteor/packages | 1 + .meteor/versions | 1 + client/views/account/avatar/prompt.coffee | 9 +++++++++ client/views/account/avatar/prompt.html | 11 +++++++++++ i18n/en.i18n.json | 4 +++- server/methods/setAvatarFromService.coffee | 23 ++++++++++++++++++++++ 6 files changed, 48 insertions(+), 1 deletion(-) diff --git a/.meteor/packages b/.meteor/packages index 21af9041330..af3ea3e5a99 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -109,3 +109,4 @@ yasaricli:slugify yasinuslu:blaze-meta # sanjo:jasmine # velocity:html-reporter +froatsnook:request diff --git a/.meteor/versions b/.meteor/versions index ff18b148896..9b746e8d5ce 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -42,6 +42,7 @@ email@1.0.7 facebook@1.2.2 fastclick@1.0.7 francocatena:status@1.5.0 +froatsnook:request@2.64.0 geojson-utils@1.0.4 github@1.1.4 google@1.1.6 diff --git a/client/views/account/avatar/prompt.coffee b/client/views/account/avatar/prompt.coffee index a73f8da8f27..21fb3435d54 100644 --- a/client/views/account/avatar/prompt.coffee +++ b/client/views/account/avatar/prompt.coffee @@ -43,6 +43,15 @@ Template.avatarPrompt.events toastr.error t('Error_too_many_requests', parseInt(err.details.timeToReset / 1000)) else toastr.success t('Avatar_changed_successfully') + else if @service is 'url' + if _.trim $('#avatarurl').val() + Meteor.call 'setAvatarFromService', $('#avatarurl').val(), '', @service, (err) -> + if err?.details?.timeToReset? + toastr.error t('Error_too_many_requests', parseInt(err.details.timeToReset / 1000)) + else + toastr.success t('Avatar_changed_successfully') + else + toastr.error t('Please_enter_value_for_url') else Meteor.call 'setAvatarFromService', @blob, @contentType, @service, (err) -> if err?.details?.timeToReset? diff --git a/client/views/account/avatar/prompt.html b/client/views/account/avatar/prompt.html index b38fdae3468..86ccb8b6d8c 100644 --- a/client/views/account/avatar/prompt.html +++ b/client/views/account/avatar/prompt.html @@ -58,6 +58,17 @@ {{/unless}} +
+ {{#with service='url'}} +
+
+
+ + +
+
+ {{/with}} +
{{#if suggestions.ready}} {{> avatarSuggestion suggestions.avatars.gravatar}} diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 6bb56e8686c..c7bde60e951 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -265,6 +265,7 @@ "Please_wait" : "Please wait", "Please_wait_activation" : "Please wait, this can take some time.", "Please_wait_statistics" : "Please wait, statistics are being generated.", + "Please_enter_value_for_url": "Please enter a value for the url of your avatar.", "Powered_by" : "Powered by", "Preferences" : "Preferences", "Preferences_saved" : "Preferences saved", @@ -386,6 +387,7 @@ "Use_service_avatar" : "Use %s avatar", "Use_this_username" : "Use this username", "Use_uploaded_avatar" : "Use uploaded avatar", + "Use_url_for_avatar": "Use url for avatar", "User_added" : "User __user_added__ added.", "User_added_by" : "User __user_added__ added by __user_by__.", "User_Channels" : "User Channels", @@ -428,4 +430,4 @@ "You_will_not_be_able_to_recover" : "You will not be able to recover this message!", "Your_entry_has_been_deleted" : "Your entry has been deleted.", "Your_Open_Source_solution" : "Your own Open Source chat solution" -} \ No newline at end of file +} diff --git a/server/methods/setAvatarFromService.coffee b/server/methods/setAvatarFromService.coffee index 6083c8ecc21..efe29b838d6 100644 --- a/server/methods/setAvatarFromService.coffee +++ b/server/methods/setAvatarFromService.coffee @@ -11,6 +11,29 @@ Meteor.methods RocketChat.models.Users.setAvatarOrigin user._id, service return + if service is 'url' + headReq = request.headSync dataURI + + if headReq.response.statusCode != 200 + console.log "Not a valid response, #{headReq.response.statusCode}, from the avatar url:", dataURI + throw new Meteor.Error('invalid-avatar-url', '[methods] setAvatarFromService -> url service -> error on checking the image type') + + if headReq.response.headers['content-type'] isnt 'image/jpeg' + throw new Meteor.Error('invalid-image-url', '[methods] setAvatarFromService -> url service -> Invalid url, it is not a jpeg') + + image = request.getSync dataURI, { encoding: null } + ars = RocketChatFile.bufferToStream image.body + aws = RocketChatFileAvatarInstance.createWriteStream "#{user.username}.jpg", headReq.response.headers['content-type'] + aws.on 'end', Meteor.bindEnvironment -> + Meteor.setTimeout -> + console.log "Set #{user.username}'s avatar from the url: #{dataURI}" + RocketChat.models.Users.setAvatarOrigin user._id, service + RocketChat.Notifications.notifyAll 'updateAvatar', { username: user.username } + , 500 + + ars.pipe(aws) + return + {image, contentType} = RocketChatFile.dataURIParse dataURI rs = RocketChatFile.bufferToStream new Buffer(image, 'base64') From 5500a0cf651e5284d3c2c2cbbff4c94bdde1280b Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Wed, 28 Oct 2015 11:04:51 +0100 Subject: [PATCH 034/114] Removed (coming soon) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47dfcf1217f..ff9f9466ded 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ We are developing the APIs based on the competition, so stay tuned and you will ### Documentation -Checkout [Github Wiki](https://github.com/RocketChat/Rocket.Chat/wiki) (coming soon) +Checkout [Github Wiki](https://github.com/RocketChat/Rocket.Chat/wiki) ## Production Deployment From 50c2858256c7fdeedddc581a9e6aad2be48d2190 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Wed, 28 Oct 2015 11:33:01 +0100 Subject: [PATCH 035/114] Allow add variables to theme class without persistence --- packages/rocketchat-theme/server/server.coffee | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/rocketchat-theme/server/server.coffee b/packages/rocketchat-theme/server/server.coffee index bea1fac137b..8958ab46563 100644 --- a/packages/rocketchat-theme/server/server.coffee +++ b/packages/rocketchat-theme/server/server.coffee @@ -90,18 +90,19 @@ RocketChat.theme = new class process.emit('message', {refresh: 'client'}) - addVariable: (type, name, value, isPublic=true) -> + addVariable: (type, name, value, persist=true) -> @variables[name] = type: type value: value - config = - group: 'Theme' - type: type - section: type - public: isPublic + if persist is true + config = + group: 'Theme' + type: type + section: type + public: false - RocketChat.settings.add "theme-#{type}-#{name}", value, config + RocketChat.settings.add "theme-#{type}-#{name}", value, config addPublicColor: (name, value) -> @addVariable 'color', name, value, true From ea05977fad4579d2c2e0a68e9b3e3b09cf45f1d8 Mon Sep 17 00:00:00 2001 From: acidicX Date: Wed, 28 Oct 2015 15:53:02 +0100 Subject: [PATCH 036/114] added Firefox OS /fxos route and install methods as well as a few language strings --- client/routes/router.coffee | 6 +++++ client/views/fxos.coffee | 13 ++++++++++ client/views/fxos.html | 48 +++++++++++++++++++++++++++++++++++++ i18n/de.i18n.json | 6 ++++- i18n/en.i18n.json | 4 ++++ 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 client/views/fxos.coffee create mode 100644 client/views/fxos.html diff --git a/client/routes/router.coffee b/client/routes/router.coffee index 94845492369..951fba47212 100644 --- a/client/routes/router.coffee +++ b/client/routes/router.coffee @@ -97,3 +97,9 @@ FlowRouter.route '/room-not-found/:type/:name', action: (params) -> Session.set 'roomNotFound', {type: params.type, name: params.name} BlazeLayout.render 'main', {center: 'roomNotFound'} + +FlowRouter.route '/fxos', + name: 'firefox-os-install' + + action: -> + BlazeLayout.render 'fxOsInstallPrompt' diff --git a/client/views/fxos.coffee b/client/views/fxos.coffee new file mode 100644 index 00000000000..b8626a03db8 --- /dev/null +++ b/client/views/fxos.coffee @@ -0,0 +1,13 @@ +Template.fxOsInstallPrompt.onRendered -> + showPrompt = () -> + request = window.navigator.mozApps.install 'http://' + location.host + '/manifest.webapp' + request.onsuccess = () -> + # Save the App object that is returned + appRecord = this.result + BlazeLayout.render 'fxOsInstallDone' + + request.onerror = () -> + # Display the error information from the DOMError object + BlazeLayout.render 'fxOsInstallError', {installError: this.error.name} + + setTimeout(showPrompt, 2000); \ No newline at end of file diff --git a/client/views/fxos.html b/client/views/fxos.html new file mode 100644 index 00000000000..34418ad7ddf --- /dev/null +++ b/client/views/fxos.html @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index f970e861837..27f18d58870 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -133,6 +133,10 @@ "hours" : "Stunden", "Incorrect_Password" : "Falsches Passwort", "inline_code" : "inline_code", + "Install_FxOs": "Installiere Rocket.Chat auf deinem Firefox", + "Install_FxOs_follow_instructions" : "Bitte bestätige die Installation der App (drücke \"Installieren\" in der Aufforderung).", + "Install_FxOs_done" : "Super! Du kannst Rocket.Chat nun über das Icon auf deinem Startbildschirm nutzen. Viel Spaß mit Rocket.Chat!", + "Install_FxOs_error" : "Schade, das hat leider nicht geklappt! Der folgende Fehler ist aufgetreten:", "Invalid_confirm_pass" : "Die Passwörter stimmen nicht überein", "Invalid_email" : "Email-Adresse ungültigt", "Invalid_name" : "Der Name darf nicht leer sein", @@ -400,4 +404,4 @@ "You_will_not_be_able_to_recover" : "Sie können es nicht wieder rückgängig machen!", "Your_entry_has_been_deleted" : "Ihr Eintrag wurde gelöscht.", "Your_Open_Source_solution" : "Deine eigene Open Source Chat Lösung" -} \ No newline at end of file +} diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index feca05d095a..3347c25b98b 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -149,6 +149,10 @@ "hours" : "hours", "Incorrect_Password" : "Incorrect Password", "inline_code" : "inline_code", + "Install_FxOs" : "Install Rocket.Chat on your Firefox", + "Install_FxOs_follow_instructions" : "Please confirm the app installation on your device (press \"Install\" when prompted).", + "Install_FxOs_done" : "Great! You can now use Rocket.Chat via the icon on your homescreen. Have fun with Rocket.Chat!", + "Install_FxOs_error" : "Sorry, that did not work as intended! The following error appeared:", "Invalid_confirm_pass" : "The password confirmation does not match password", "Invalid_email" : "The e-mail entered is invalid", "Invalid_name" : "The name must not be empty", From 1b671cb2fe499cc1a40b524a8b56d4fb8f255c26 Mon Sep 17 00:00:00 2001 From: Carsten Date: Wed, 28 Oct 2015 16:25:44 +0100 Subject: [PATCH 037/114] Added Firefox OS support to features --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff9f9466ded..ff41d8e0db8 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ It is a great solution for communities and companies wanting to privately host t - Native Cross-Platform Desktop Application [Windows, Mac OSX, or Linux](https://rocket.chat/) - Mobile app for iPhone, iPad, and iPod touch [Download on AppStore!](https://geo.itunes.apple.com/us/app/rocket.chat/id1028869439?mt=8) - Mobile app for Android phone, tablet, and TV stick [Available now on Google Play!](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat) +- Native Firefox OS Application (also for Desktop Firefox and Firefox for Android!) - [Check the wiki page for install instructions](https://github.com/RocketChat/Rocket.Chat/wiki/Native-Firefox-OS-app-%28hosted-webapp%29) - Sandstorm.io instant Rocket.Chat server [Now on Sandstorm App Store](https://apps.sandstorm.io/app/vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0) @@ -110,7 +111,6 @@ It is a great solution for communities and companies wanting to privately host t - Support for PostgreSQL: [Issue #533](https://github.com/RocketChat/Rocket.Chat/issues/533), [Issue #822](https://github.com/RocketChat/Rocket.Chat/issues/822) - Native iOS Application [Issue #270](https://github.com/RocketChat/Rocket.Chat/issues/270), [Rocket.Chat.iOS - HELP WANTED](https://github.com/RocketChat/Rocket.Chat.iOS) - Native Android Application [Issue #271 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/271) -- Native Firefox OS Application [Issue #1204](https://github.com/RocketChat/Rocket.Chat/issues/1204) - Off-the-Record (OTR) Messaging [Issue #36](https://github.com/RocketChat/Rocket.Chat/issues/36), [Issue #268 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/268) - API-enabled methods: [Issue #202](https://github.com/RocketChat/Rocket.Chat/issues/202), [Issue #454](https://github.com/RocketChat/Rocket.Chat/issues/454), [Issue #455](https://github.com/RocketChat/Rocket.Chat/issues/455), [Issue #759](https://github.com/RocketChat/Rocket.Chat/issues/759) - Scalable WebRTC broadcaster / media-server integration, [Issue #1118 - HELP WANTED](https://github.com/RocketChat/Rocket.Chat/issues/1118) From 9dd9d3c90732e300e639b7abc80ace4c54a2907d Mon Sep 17 00:00:00 2001 From: Carsten Date: Wed, 28 Oct 2015 16:32:04 +0100 Subject: [PATCH 038/114] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ff41d8e0db8..952137a5bac 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ Get the app for your Android phone: Now compatible with all Android devices as old as version 4.0.x - [download here](https://github.com/RocketChat/Rocket.Chat/wiki/Build-the-Android-Cordova-Web-App-and-connect-to-your-own-Rocket.Chat-Server), even on BlackBerry Passport! +Firefox OS support has landed as well (no Cordova required!): +https://github.com/RocketChat/Rocket.Chat/wiki/Native-Firefox-OS-app-%28hosted-webapp%29 + Host your own Rocket.Chat server in four seconds flat: [![Rocket.Chat on Sandstorm.io](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/sandstorm.jpg)](https://apps.sandstorm.io/app/vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0) From d5771492478dbac10a6f50dc571d0431f79d85f0 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Wed, 28 Oct 2015 16:46:57 +0100 Subject: [PATCH 039/114] Fix spotlight search --- client/views/app/roomSearch.html | 2 +- client/views/app/spotlight/spotlight.coffee | 5 ++-- server/publications/spotlight.coffee | 29 +++++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 server/publications/spotlight.coffee diff --git a/client/views/app/roomSearch.html b/client/views/app/roomSearch.html index 4f7f3ee0c3e..fe3610237e2 100644 --- a/client/views/app/roomSearch.html +++ b/client/views/app/roomSearch.html @@ -1,5 +1,5 @@ From c0148b9bcc3148959caf20a014fd6a8d463b1e16 Mon Sep 17 00:00:00 2001 From: George Secrieru Date: Wed, 28 Oct 2015 19:09:01 -0200 Subject: [PATCH 047/114] Small fix for searching same string again. --- client/views/app/tabBar/messageSearch.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/client/views/app/tabBar/messageSearch.coffee b/client/views/app/tabBar/messageSearch.coffee index 9f9a520abd0..59d128eec8e 100644 --- a/client/views/app/tabBar/messageSearch.coffee +++ b/client/views/app/tabBar/messageSearch.coffee @@ -13,6 +13,7 @@ Template.messageSearch.events "keyup #message-search": _.debounce (e, t) -> value = e.target.value.trim() if value is '' and t.currentSearchTerm + t.currentSearchTerm = '' t.searchResult.set undefined return else if value is t.currentSearchTerm From 1cf277225c7fef14ad8f3a02fa83be991b5be1f7 Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Wed, 28 Oct 2015 22:10:39 +0100 Subject: [PATCH 048/114] code formatting --- packages/rocketchat-lib/settings/server/updateServices.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/rocketchat-lib/settings/server/updateServices.coffee b/packages/rocketchat-lib/settings/server/updateServices.coffee index a8f8f2e0d88..da290e2d081 100644 --- a/packages/rocketchat-lib/settings/server/updateServices.coffee +++ b/packages/rocketchat-lib/settings/server/updateServices.coffee @@ -9,7 +9,6 @@ updateServices = -> serviceName = service._id.replace('Accounts_OAuth_', '') - if serviceName is 'Meteor' serviceName = 'meteor-developer' From c531e9ae176b7b57880a779c7dca456744ba32b6 Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Wed, 28 Oct 2015 22:23:21 +0100 Subject: [PATCH 049/114] rollback avatar changes --- server/startup/avatar.coffee | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/server/startup/avatar.coffee b/server/startup/avatar.coffee index 3dcda869241..a2949af98fd 100644 --- a/server/startup/avatar.coffee +++ b/server/startup/avatar.coffee @@ -1,11 +1,8 @@ Meteor.startup -> - storeType = 'FileSystem' - - - # Sandstorm must store avatar in mongo - #if RocketChat.settings.get 'avatarStore_type' - # storeType = RocketChat.settings.get 'avatarStore_type' + storeType = 'GridFS' + if RocketChat.settings.get 'Accounts_AvatarStoreType' + storeType = RocketChat.settings.get 'Accounts_AvatarStoreType' RocketChatStore = RocketChatFile[storeType] @@ -21,7 +18,7 @@ Meteor.startup -> transformWrite = (file, readStream, writeStream) -> RocketChatFile.gm(readStream, file.fileName).background('#ffffff').resize(width, height+'^>').gravity('Center').extent(width, height).stream('jpeg').pipe(writeStream) - path = "/var" + path = "~/uploads" if RocketChat.settings.get('Accounts_AvatarStorePath')?.trim() isnt '' path = RocketChat.settings.get 'Accounts_AvatarStorePath' @@ -32,7 +29,6 @@ Meteor.startup -> transformWrite: transformWrite WebApp.connectHandlers.use '/avatar/', (req, res, next) -> - console.log 'avatar called!' this.params = username: req.url.replace(/^\//, '').replace(/\?.*$/, '') From ef9d28bdbe6324d2a650bb519fbfc3bf0e8fb921 Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Wed, 28 Oct 2015 22:26:06 +0100 Subject: [PATCH 050/114] added sandstorm --- server/configuration/accounts_meld.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/configuration/accounts_meld.coffee b/server/configuration/accounts_meld.coffee index e03c09e36b3..4cd8d92f9d2 100644 --- a/server/configuration/accounts_meld.coffee +++ b/server/configuration/accounts_meld.coffee @@ -1,6 +1,6 @@ orig_updateOrCreateUserFromExternalService = Accounts.updateOrCreateUserFromExternalService Accounts.updateOrCreateUserFromExternalService = (serviceName, serviceData, options) -> - if serviceName not in ['facebook', 'github', 'google', 'meteor-developer', 'linkedin', 'twitter'] and serviceData._oAuthCustom isnt true + if serviceName not in ['facebook', 'github', 'gitlab', 'google', 'meteor-developer', 'linkedin', 'twitter', 'sandstorm'] and serviceData._oAuthCustom isnt true return if serviceName is 'meteor-developer' From f6a58ab903c3fc878bc5d8c63602966eab72cc3c Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Wed, 28 Oct 2015 22:39:37 +0100 Subject: [PATCH 051/114] added sandstorm --- client/views/account/avatar/prompt.html | 2 ++ client/views/app/sideNav/userStatus.html | 3 --- client/views/username/sandstormshare.html | 7 ------- 3 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 client/views/username/sandstormshare.html diff --git a/client/views/account/avatar/prompt.html b/client/views/account/avatar/prompt.html index f43f9c8fd1f..b38fdae3468 100644 --- a/client/views/account/avatar/prompt.html +++ b/client/views/account/avatar/prompt.html @@ -58,6 +58,7 @@ {{/unless}} + {{#if suggestions.ready}} {{> avatarSuggestion suggestions.avatars.gravatar}} {{> avatarSuggestion suggestions.avatars.facebook}} @@ -86,6 +87,7 @@ {{> avatarSuggestionLogin 'twitter'}} {{/if}} + {{else}} {{_ "Loading_suggestion"}} {{/if}} diff --git a/client/views/app/sideNav/userStatus.html b/client/views/app/sideNav/userStatus.html index 1e5261484da..5bac582d2c1 100644 --- a/client/views/app/sideNav/userStatus.html +++ b/client/views/app/sideNav/userStatus.html @@ -18,13 +18,10 @@ {{_ "Busy" context="male"}} {{_ "Invisible"}} - {{/with}} diff --git a/client/views/username/sandstormshare.html b/client/views/username/sandstormshare.html deleted file mode 100644 index 090a89d8a45..00000000000 --- a/client/views/username/sandstormshare.html +++ /dev/null @@ -1,7 +0,0 @@ - From 35416302e549f90acd4476fbfef0919b0e76b2cd Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Wed, 28 Oct 2015 22:43:35 +0100 Subject: [PATCH 052/114] added sandstorm --- client/views/main.html | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/client/views/main.html b/client/views/main.html index 41f7573c800..9eab99a5bec 100644 --- a/client/views/main.html +++ b/client/views/main.html @@ -41,18 +41,11 @@ From f3976ad7aff23081413035c2a2e05f0ab5b571c7 Mon Sep 17 00:00:00 2001 From: Mark Hurwitz Date: Wed, 28 Oct 2015 17:29:43 -0500 Subject: [PATCH 053/114] webrtc: fix deprecation warning 'MediaStream.stop() is deprecated' --- packages/rocketchat-webrtc/WebRTCClass.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-webrtc/WebRTCClass.coffee b/packages/rocketchat-webrtc/WebRTCClass.coffee index f2b22be0240..ffa9785b84b 100644 --- a/packages/rocketchat-webrtc/WebRTCClass.coffee +++ b/packages/rocketchat-webrtc/WebRTCClass.coffee @@ -447,7 +447,9 @@ class WebRTCClass @active = false @monitor = false @remoteMonitoring = false - @localStream?.stop() + if @localStream? and typeof @localStream isnt 'undefined' + @localStream.getTracks().forEach (track) -> + track.stop() @localUrl.set undefined delete @localStream From a8cc313156d5752af6600defef087ee3c202c96c Mon Sep 17 00:00:00 2001 From: SingLi Date: Wed, 28 Oct 2015 21:11:01 -0400 Subject: [PATCH 054/114] Improve FirefoxOS announcement Also add beta announcement for host/provisioning. --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 952137a5bac..656a3c4d28e 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,15 @@ Get the app for your Android phone: Now compatible with all Android devices as old as version 4.0.x - [download here](https://github.com/RocketChat/Rocket.Chat/wiki/Build-the-Android-Cordova-Web-App-and-connect-to-your-own-Rocket.Chat-Server), even on BlackBerry Passport! -Firefox OS support has landed as well (no Cordova required!): -https://github.com/RocketChat/Rocket.Chat/wiki/Native-Firefox-OS-app-%28hosted-webapp%29 - Host your own Rocket.Chat server in four seconds flat: [![Rocket.Chat on Sandstorm.io](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/sandstorm.jpg)](https://apps.sandstorm.io/app/vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0) +Also available as FirefoxOS app: + +[![Firefox OS app now available](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/firefoxos.png)](https://github.com/RocketChat/Rocket.Chat/wiki/Native-Firefox-OS-app-%28hosted-webapp%29) + + Try it on Ubuntu: @@ -100,6 +102,7 @@ It is a great solution for communities and companies wanting to privately host t - REST APIs - Remote Locations Video Monitoring - Chat-ops powered by Hubot: scalable horizontal app integration (early access) +- Massively scalable hosting and provisioning (beta testing now) - Native Cross-Platform Desktop Application [Windows, Mac OSX, or Linux](https://rocket.chat/) - Mobile app for iPhone, iPad, and iPod touch [Download on AppStore!](https://geo.itunes.apple.com/us/app/rocket.chat/id1028869439?mt=8) - Mobile app for Android phone, tablet, and TV stick [Available now on Google Play!](https://play.google.com/store/apps/details?id=com.konecty.rocket.chat) @@ -127,7 +130,6 @@ It is a great solution for communities and companies wanting to privately host t - Anonymous use of Rocket.Chat: [Issue #604](https://github.com/RocketChat/Rocket.Chat/issues/604) - File Sharing via P2P and Scalable Multicast: [Issue #369](https://github.com/RocketChat/Rocket.Chat/issues/369), [Issue #370](https://github.com/RocketChat/Rocket.Chat/issues/370) - Anti-virus checking on file uploads: [Issue #757](https://github.com/RocketChat/Rocket.Chat/issues/757) -- Massively scalable hosting and provisioning ### Issues From 01797cd89c74ec504601eff0fc3e515b9da58f0d Mon Sep 17 00:00:00 2001 From: Making GitHub Delicious Date: Thu, 29 Oct 2015 05:40:42 -0600 Subject: [PATCH 055/114] add waffle.io badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 656a3c4d28e..e096dcf2258 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Stories in Ready](https://badge.waffle.io/RocketChat/Rocket.Chat.png?label=ready&title=Ready)](https://waffle.io/RocketChat/Rocket.Chat) ![Rocket.Chat logo](https://rocket.chat/images/logo/logo-dark.svg?v3) The Ultimate Open Source WebChat Platform From b0ee3e58ccd2186250266f1438fb935882ad3e60 Mon Sep 17 00:00:00 2001 From: Gabriel Engel Date: Thu, 29 Oct 2015 12:44:17 +0100 Subject: [PATCH 056/114] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e096dcf2258..2b559138dc3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -[![Stories in Ready](https://badge.waffle.io/RocketChat/Rocket.Chat.png?label=ready&title=Ready)](https://waffle.io/RocketChat/Rocket.Chat) ![Rocket.Chat logo](https://rocket.chat/images/logo/logo-dark.svg?v3) The Ultimate Open Source WebChat Platform @@ -47,6 +46,7 @@ Download the Native Cross-Platform Desktop Application at [Rocket.Chat.Electron] [![Coverage Status](https://coveralls.io/repos/RocketChat/Rocket.Chat/badge.svg)](https://coveralls.io/r/RocketChat/Rocket.Chat) [![Code Climate](https://codeclimate.com/github/RocketChat/Rocket.Chat/badges/gpa.svg)](https://codeclimate.com/github/RocketChat/Rocket.Chat) [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/RocketChat/Rocket.Chat/raw/master/LICENSE) +[![Stories in Ready](https://badge.waffle.io/RocketChat/Rocket.Chat.png?label=ready&title=Ready)](https://waffle.io/RocketChat/Rocket.Chat) Rocket.Chat is a Web Chat Server, developed in JavaScript, using the [Meteor](https://www.meteor.com/install) fullstack framework. From 32050432f6be6cfb1be5bb7074a8e92527e29a6f Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Thu, 29 Oct 2015 12:45:11 +0100 Subject: [PATCH 057/114] added a division to list rooms with unread messages --- client/views/account/accountPreferences.coffee | 1 + client/views/account/accountPreferences.html | 7 +++++++ client/views/app/sideNav/channels.coffee | 4 ++++ client/views/app/sideNav/directMessages.coffee | 8 +++++++- client/views/app/sideNav/privateGroups.coffee | 8 +++++++- client/views/app/sideNav/sideNav.coffee | 2 +- client/views/app/sideNav/sideNav.html | 4 +++- client/views/app/sideNav/starredRooms.coffee | 8 +++++++- client/views/app/sideNav/unreadRooms.coffee | 14 ++++++++++++++ client/views/app/sideNav/unreadRooms.html | 13 +++++++++++++ .../rocketchat-theme/assets/stylesheets/base.less | 11 +++++++++++ server/methods/saveUserPreferences.coffee | 3 +++ 12 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 client/views/app/sideNav/unreadRooms.coffee create mode 100644 client/views/app/sideNav/unreadRooms.html diff --git a/client/views/account/accountPreferences.coffee b/client/views/account/accountPreferences.coffee index e948afe3858..d8171ec2f97 100644 --- a/client/views/account/accountPreferences.coffee +++ b/client/views/account/accountPreferences.coffee @@ -40,6 +40,7 @@ Template.accountPreferences.onCreated -> data.convertAsciiEmoji = $('input[name=convertAsciiEmoji]:checked').val() data.saveMobileBandwidth = $('input[name=saveMobileBandwidth]:checked').val() data.compactView = $('input[name=compactView]:checked').val() + data.unreadRoomsMode = $('input[name=unreadRoomsMode]:checked').val() data.autoImageLoad = $('input[name=autoImageLoad]:checked').val() Meteor.call 'saveUserPreferences', data, (error, results) -> diff --git a/client/views/account/accountPreferences.html b/client/views/account/accountPreferences.html index 2eabe151307..331a1764cd2 100644 --- a/client/views/account/accountPreferences.html +++ b/client/views/account/accountPreferences.html @@ -61,6 +61,13 @@ +
+ +
+ + +
+
diff --git a/client/views/app/sideNav/channels.coffee b/client/views/app/sideNav/channels.coffee index 3e4dd131a7a..28da6235546 100644 --- a/client/views/app/sideNav/channels.coffee +++ b/client/views/app/sideNav/channels.coffee @@ -13,6 +13,10 @@ Template.channels.helpers if !RocketChat.settings.get 'Disable_Favorite_Rooms' query.f = { $ne: true } + if Meteor.user()?.settings?.preferences?.unreadRoomsMode + query.alert = + $ne: true + return ChatSubscription.find query, { sort: 't': 1, 'name': 1 } Template.channels.events diff --git a/client/views/app/sideNav/directMessages.coffee b/client/views/app/sideNav/directMessages.coffee index 8260e0e91df..2451177750e 100644 --- a/client/views/app/sideNav/directMessages.coffee +++ b/client/views/app/sideNav/directMessages.coffee @@ -1,6 +1,12 @@ Template.directMessages.helpers rooms: -> - return ChatSubscription.find { t: { $in: ['d']}, f: { $ne: true }, open: true }, { sort: 't': 1, 'name': 1 } + query = { t: { $in: ['d']}, f: { $ne: true }, open: true } + + if Meteor.user()?.settings?.preferences?.unreadRoomsMode + query.alert = + $ne: true + + return ChatSubscription.find query, { sort: 't': 1, 'name': 1 } isActive: -> return 'active' if ChatSubscription.findOne({ t: { $in: ['d']}, f: { $ne: true }, open: true, rid: Session.get('openedRoom') }, { fields: { _id: 1 } })? diff --git a/client/views/app/sideNav/privateGroups.coffee b/client/views/app/sideNav/privateGroups.coffee index 1b577816fe4..6b30d7b4849 100644 --- a/client/views/app/sideNav/privateGroups.coffee +++ b/client/views/app/sideNav/privateGroups.coffee @@ -3,7 +3,13 @@ Template.privateGroups.helpers return t('Members_placeholder') rooms: -> - return ChatSubscription.find { t: { $in: ['p']}, f: { $ne: true }, open: true }, { sort: 't': 1, 'name': 1 } + query = { t: { $in: ['p']}, f: { $ne: true }, open: true } + + if Meteor.user()?.settings?.preferences?.unreadRoomsMode + query.alert = + $ne: true + + return ChatSubscription.find query, { sort: 't': 1, 'name': 1 } total: -> return ChatSubscription.find({ t: { $in: ['p']}, f: { $ne: true } }).count() diff --git a/client/views/app/sideNav/sideNav.coffee b/client/views/app/sideNav/sideNav.coffee index 49a02a7f80a..66d6bbada55 100644 --- a/client/views/app/sideNav/sideNav.coffee +++ b/client/views/app/sideNav/sideNav.coffee @@ -93,7 +93,7 @@ Template.sideNav.onRendered -> AccountBox.init() wrapper = $('.rooms-list .wrapper').get(0) - lastLink = $('.rooms-list h3').get(0) + lastLink = $('.rooms-list h3.history-div').get(0) RocketChat.roomTypes.getTypes().forEach (roomType) -> if RocketChat.authz.hasRole(Meteor.userId(), roomType.roles) && Template[roomType.template]? diff --git a/client/views/app/sideNav/sideNav.html b/client/views/app/sideNav/sideNav.html index f44faababb6..605c277d14e 100644 --- a/client/views/app/sideNav/sideNav.html +++ b/client/views/app/sideNav/sideNav.html @@ -38,7 +38,9 @@
-

+ {{ > unreadRooms }} + +

{{_ "History"}}

diff --git a/client/views/app/sideNav/starredRooms.coffee b/client/views/app/sideNav/starredRooms.coffee index 859ed21b6f2..38a3aa889d3 100644 --- a/client/views/app/sideNav/starredRooms.coffee +++ b/client/views/app/sideNav/starredRooms.coffee @@ -1,6 +1,12 @@ Template.starredRooms.helpers rooms: -> - return ChatSubscription.find { f: true, open: true }, { sort: 't': 1, 'name': 1 } + query = { f: true, open: true } + + if Meteor.user()?.settings?.preferences?.unreadRoomsMode + query.alert = + $ne: true + + return ChatSubscription.find query, { sort: 't': 1, 'name': 1 } total: -> return ChatSubscription.find({ f: true }).count() isActive: -> diff --git a/client/views/app/sideNav/unreadRooms.coffee b/client/views/app/sideNav/unreadRooms.coffee new file mode 100644 index 00000000000..afe1ac54e24 --- /dev/null +++ b/client/views/app/sideNav/unreadRooms.coffee @@ -0,0 +1,14 @@ +Template.unreadRooms.helpers + hasUnread: -> + return 'has-unread' if Meteor.user()?.settings?.preferences?.unreadRoomsMode and Template.instance().unreadRooms.count() > 0 + + rooms: -> + return Template.instance().unreadRooms + +Template.unreadRooms.onCreated -> + @autorun => + query = + alert: true + open: true + + @unreadRooms = ChatSubscription.find query, { sort: 't': 1, 'name': 1 } diff --git a/client/views/app/sideNav/unreadRooms.html b/client/views/app/sideNav/unreadRooms.html new file mode 100644 index 00000000000..79f532749b7 --- /dev/null +++ b/client/views/app/sideNav/unreadRooms.html @@ -0,0 +1,13 @@ + diff --git a/packages/rocketchat-theme/assets/stylesheets/base.less b/packages/rocketchat-theme/assets/stylesheets/base.less index 5ba2377c46f..d858917f161 100644 --- a/packages/rocketchat-theme/assets/stylesheets/base.less +++ b/packages/rocketchat-theme/assets/stylesheets/base.less @@ -1503,6 +1503,17 @@ a.github-fork { font-size: 12px; } } + .unread-rooms-mode { + max-height: 0; + opacity: 0; + overflow: hidden; + + &.has-unread { + .transition(max-height 1s ease-in,opacity .5s linear); + max-height: 5000px; + opacity: 1; + } + } } .new-room-highlight a { diff --git a/server/methods/saveUserPreferences.coffee b/server/methods/saveUserPreferences.coffee index 8d9c86442ef..5cf457a2315 100644 --- a/server/methods/saveUserPreferences.coffee +++ b/server/methods/saveUserPreferences.coffee @@ -23,6 +23,9 @@ Meteor.methods if settings.compactView? preferences.compactView = if settings.compactView is "1" then true else false + if settings.unreadRoomsMode? + preferences.unreadRoomsMode = if settings.unreadRoomsMode is "1" then true else false + if settings.autoImageLoad? preferences.autoImageLoad = if settings.autoImageLoad is "1" then true else false From e8ca004e6042508d3c620ea19cbefa93750869ca Mon Sep 17 00:00:00 2001 From: graywolf336 Date: Thu, 29 Oct 2015 09:56:25 -0500 Subject: [PATCH 058/114] Check the content type of the downloaded file and also report errors back up to the client --- client/views/account/avatar/prompt.coffee | 8 +++- i18n/en.i18n.json | 1 + server/methods/setAvatarFromService.coffee | 49 ++++++++++++---------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/client/views/account/avatar/prompt.coffee b/client/views/account/avatar/prompt.coffee index 21fb3435d54..a1c787a0dac 100644 --- a/client/views/account/avatar/prompt.coffee +++ b/client/views/account/avatar/prompt.coffee @@ -46,8 +46,12 @@ Template.avatarPrompt.events else if @service is 'url' if _.trim $('#avatarurl').val() Meteor.call 'setAvatarFromService', $('#avatarurl').val(), '', @service, (err) -> - if err?.details?.timeToReset? - toastr.error t('Error_too_many_requests', parseInt(err.details.timeToReset / 1000)) + console.log err + if err + if err.details?.timeToReset? + toastr.error t('Error_too_many_requests', parseInt(err.details.timeToReset / 1000)) + else + toastr.error t('Avatar_url_invalid_or_error') else toastr.success t('Avatar_changed_successfully') else diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 65ee3d351e9..6c6a6fa4b2e 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -62,6 +62,7 @@ "are_typing" : "are typing", "Are_you_sure" : "Are you sure?", "Avatar_changed_successfully" : "Avatar changed successfully", + "Avatar_url_invalid_or_error": "The url provided is invalid or not accessible. Please try again, but with a different url.", "away" : "away", "Away" : "Away", "away_female" : "away", diff --git a/server/methods/setAvatarFromService.coffee b/server/methods/setAvatarFromService.coffee index cdcd27f5b3d..a30230edf7f 100644 --- a/server/methods/setAvatarFromService.coffee +++ b/server/methods/setAvatarFromService.coffee @@ -12,25 +12,32 @@ Meteor.methods return if service is 'url' + result = null + try result = HTTP.get dataURI, npmRequestOptions: {encoding: 'binary'} - - if result.statusCode isnt 200 - console.log "Not a valid response, #{result.statusCode}, from the avatar url: #{dataURI}" - throw new Meteor.Error('invalid-avatar-url', '[methods] setAvatarFromService -> url service -> error on getting the avatar from url') - - ars = RocketChatFile.bufferToStream new Buffer(result.content, 'binary') - aws = RocketChatFileAvatarInstance.createWriteStream "#{user.username}.jpg", result.headers['content-type'] - aws.on 'end', Meteor.bindEnvironment -> - Meteor.setTimeout -> - console.log "Set #{user.username}'s avatar from the url: #{dataURI}" - RocketChat.models.Users.setAvatarOrigin user._id, service - RocketChat.Notifications.notifyAll 'updateAvatar', { username: user.username } - , 500 - - ars.pipe(aws) catch e - throw e + console.log "Error while handling the setting of the avatar from a url (#{dataURI}) for #{user.username}:", e + throw new Meteor.Error('avatar-url-http-error', '[methods] setAvatarFromService -> http.get result -> error') + + if result.statusCode isnt 200 + console.log "Not a valid response, #{result.statusCode}, from the avatar url: #{dataURI}" + throw new Meteor.Error('invalid-avatar-url', '[methods] setAvatarFromService -> url service -> error on getting the avatar from url') + + if not /image\/.+/.test result.headers['content-type'] + console.log "Not a valid content-type from the provided url, #{result.headers['content-type']}, from the avatar url: #{dataURI}" + throw new Meteor.Error('invalid-avatar-url', '[methods] setAvatarFromService -> url service -> invalid content-type') + + ars = RocketChatFile.bufferToStream new Buffer(result.content, 'binary') + aws = RocketChatFileAvatarInstance.createWriteStream "#{user.username}.jpg", result.headers['content-type'] + aws.on 'end', Meteor.bindEnvironment -> + Meteor.setTimeout -> + console.log "Set #{user.username}'s avatar from the url: #{dataURI}" + RocketChat.models.Users.setAvatarOrigin user._id, service + RocketChat.Notifications.notifyAll 'updateAvatar', { username: user.username } + , 500 + + ars.pipe(aws) return {image, contentType} = RocketChatFile.dataURIParse dataURI @@ -46,8 +53,8 @@ Meteor.methods rs.pipe(ws) return -DDPRateLimiter.addRule - type: 'method' - name: 'setAvatarFromService' - userId: -> return true -, 1, 60000 +# DDPRateLimiter.addRule +# type: 'method' +# name: 'setAvatarFromService' +# userId: -> return true +# , 1, 60000 From df9066f404b2b24893dc9f52bbc67acb92292cc7 Mon Sep 17 00:00:00 2001 From: graywolf336 Date: Thu, 29 Oct 2015 09:59:36 -0500 Subject: [PATCH 059/114] Remove the logging into the console of the error on incorrect urls for avatars --- client/views/account/avatar/prompt.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/client/views/account/avatar/prompt.coffee b/client/views/account/avatar/prompt.coffee index a1c787a0dac..2d52531560d 100644 --- a/client/views/account/avatar/prompt.coffee +++ b/client/views/account/avatar/prompt.coffee @@ -46,7 +46,6 @@ Template.avatarPrompt.events else if @service is 'url' if _.trim $('#avatarurl').val() Meteor.call 'setAvatarFromService', $('#avatarurl').val(), '', @service, (err) -> - console.log err if err if err.details?.timeToReset? toastr.error t('Error_too_many_requests', parseInt(err.details.timeToReset / 1000)) From d26be144f067407791dde8e686506f92ca5da340 Mon Sep 17 00:00:00 2001 From: graywolf336 Date: Thu, 29 Oct 2015 10:00:52 -0500 Subject: [PATCH 060/114] Re-enable the rate limiter for the updating avatar, disabled it for debugging purposes --- server/methods/setAvatarFromService.coffee | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/methods/setAvatarFromService.coffee b/server/methods/setAvatarFromService.coffee index a30230edf7f..c65162af35f 100644 --- a/server/methods/setAvatarFromService.coffee +++ b/server/methods/setAvatarFromService.coffee @@ -53,8 +53,8 @@ Meteor.methods rs.pipe(ws) return -# DDPRateLimiter.addRule -# type: 'method' -# name: 'setAvatarFromService' -# userId: -> return true -# , 1, 60000 +DDPRateLimiter.addRule + type: 'method' + name: 'setAvatarFromService' + userId: -> return true +, 1, 60000 From ccc435fb056547a72d3b84635447ed1b63ad9e06 Mon Sep 17 00:00:00 2001 From: James Allman-Talbot Date: Thu, 29 Oct 2015 11:50:53 -0400 Subject: [PATCH 061/114] fixed user leave message --- server/methods/leaveRoom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/methods/leaveRoom.coffee b/server/methods/leaveRoom.coffee index 6e15ab31176..e3f103ba6b6 100644 --- a/server/methods/leaveRoom.coffee +++ b/server/methods/leaveRoom.coffee @@ -16,7 +16,7 @@ Meteor.methods if room.t isnt 'c' and room.usernames.indexOf(user.username) isnt -1 removedUser = user - RocketChat.models.Messages.createUserJoinWithRoomIdAndUser rid, removedUser + RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser rid, removedUser if room.u?._id is Meteor.userId() newOwner = _.without(room.usernames, user.username)[0] From c10bc50182d8f65c5aa8c6e47e0dc2d60ab4976e Mon Sep 17 00:00:00 2001 From: James Allman-Talbot Date: Thu, 29 Oct 2015 12:05:38 -0400 Subject: [PATCH 062/114] changed user left message to bring it inline with the join message --- i18n/en.i18n.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 65ee3d351e9..e3d3ca2a09a 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -410,9 +410,9 @@ "User_joined_channel" : "Has joined the channel.", "User_joined_channel_female" : "Has joined the channel.", "User_joined_channel_male" : "Has joined the channel.", - "User_left" : "User __user_left__ left.", - "User_left_female" : "User __user_left__ left.", - "User_left_male" : "User __user_left__ left.", + "User_left" : "Has left the channel.", + "User_left_female" : "Has left the channel.", + "User_left_male" : "Has left the channel.", "User_logged_out" : "User is logged out", "User_not_found_or_incorrect_password" : "User not found or incorrect password", "User_removed_by" : "User __user_removed__ removed by __user_by__.", From ac60580fc323eb5badaff3f3b0c8add4e490dd04 Mon Sep 17 00:00:00 2001 From: Rafael Caferati Date: Fri, 30 Oct 2015 02:09:41 +0100 Subject: [PATCH 063/114] Implemented AllowUserAvatarChange and Accounts_AllowUserProfileChange account settings --- client/views/account/accountFlex.coffee | 6 ++++++ client/views/account/accountFlex.html | 9 +++++++-- client/views/account/accountProfile.coffee | 2 ++ client/views/account/avatar/prompt.coffee | 2 ++ packages/rocketchat-lib/settings/server/startup.coffee | 2 ++ server/methods/resetAvatar.coffee | 3 +++ server/methods/saveUserProfile.coffee | 3 +++ server/methods/setAvatarFromService.coffee | 5 ++++- 8 files changed, 29 insertions(+), 3 deletions(-) diff --git a/client/views/account/accountFlex.coffee b/client/views/account/accountFlex.coffee index 99875905bb4..1e04bc7ce91 100644 --- a/client/views/account/accountFlex.coffee +++ b/client/views/account/accountFlex.coffee @@ -13,3 +13,9 @@ Template.accountFlex.events 'click .account-link': -> menu.close() + +Template.accountFlex.helpers + allowUserProfileChange: -> + return RocketChat.settings.get("Accounts_AllowUserProfileChange") + allowUserAvatarChange: -> + return RocketChat.settings.get("Accounts_AllowUserAvatarChange") \ No newline at end of file diff --git a/client/views/account/accountFlex.html b/client/views/account/accountFlex.html index 86777dafe91..8a41d5b26e2 100644 --- a/client/views/account/accountFlex.html +++ b/client/views/account/accountFlex.html @@ -9,10 +9,15 @@
diff --git a/client/views/account/accountProfile.coffee b/client/views/account/accountProfile.coffee index 03425e6f7eb..2da61911ef9 100644 --- a/client/views/account/accountProfile.coffee +++ b/client/views/account/accountProfile.coffee @@ -98,6 +98,8 @@ Template.accountProfile.onCreated -> Template.accountProfile.onRendered -> Tracker.afterFlush -> + # this should throw an error-template + window.location.href = "/" if !RocketChat.settings.get("Accounts_AllowUserAvatarChange") SideNav.setFlex "accountFlex" SideNav.openFlex() diff --git a/client/views/account/avatar/prompt.coffee b/client/views/account/avatar/prompt.coffee index 2d52531560d..270c8cb34d9 100644 --- a/client/views/account/avatar/prompt.coffee +++ b/client/views/account/avatar/prompt.coffee @@ -14,6 +14,8 @@ Template.avatarPrompt.onCreated -> Template.avatarPrompt.onRendered -> Tracker.afterFlush -> + # this should throw an error-template + # window.location.href = "/" if !RocketChat.settings.get("Accounts_AllowUserProfileChange") SideNav.setFlex "accountFlex" SideNav.openFlex() diff --git a/packages/rocketchat-lib/settings/server/startup.coffee b/packages/rocketchat-lib/settings/server/startup.coffee index 3a61e1e10a5..bb753133174 100644 --- a/packages/rocketchat-lib/settings/server/startup.coffee +++ b/packages/rocketchat-lib/settings/server/startup.coffee @@ -35,6 +35,8 @@ RocketChat.settings.add 'Accounts_OAuth_Twitter', false, { type: 'boolean', grou RocketChat.settings.add 'Accounts_OAuth_Twitter_id', '', { type: 'string', group: 'Accounts', section: 'Twitter' } RocketChat.settings.add 'Accounts_OAuth_Twitter_secret', '', { type: 'string', group: 'Accounts', section: 'Twitter' } +RocketChat.settings.add 'Accounts_AllowUserProfileChange', false, { type: 'boolean', group: 'Accounts', section: 'General', public: true } +RocketChat.settings.add 'Accounts_AllowUserAvatarChange', false, { type: 'boolean', group: 'Accounts', section: 'General', public: true } RocketChat.settings.add 'Accounts_AllowUsernameChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } RocketChat.settings.add 'Accounts_AllowPasswordChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } diff --git a/server/methods/resetAvatar.coffee b/server/methods/resetAvatar.coffee index 2e30ef85391..0bb66f0d140 100644 --- a/server/methods/resetAvatar.coffee +++ b/server/methods/resetAvatar.coffee @@ -3,6 +3,9 @@ Meteor.methods unless Meteor.userId() throw new Meteor.Error(403, "[methods] resetAvatar -> Invalid user") + unless RocketChat.settings.get("Accounts_AllowUserAvatarChange") + throw new Meteor.Error(403, "[methods] resetAvatar -> Invalid access") + console.log '[methods] resetAvatar -> '.green, 'userId:', Meteor.userId(), 'arguments:', arguments user = Meteor.user() diff --git a/server/methods/saveUserProfile.coffee b/server/methods/saveUserProfile.coffee index 2103016f1a1..46b39972fba 100644 --- a/server/methods/saveUserProfile.coffee +++ b/server/methods/saveUserProfile.coffee @@ -1,5 +1,8 @@ Meteor.methods saveUserProfile: (settings) -> + unless RocketChat.settings.get("Accounts_AllowUserProfileChange") + throw new Meteor.Error(403, "[methods] resetAvatar -> Invalid access") + if Meteor.userId() if settings.language? RocketChat.models.Users.setLanguage Meteor.userId(), settings.language diff --git a/server/methods/setAvatarFromService.coffee b/server/methods/setAvatarFromService.coffee index c65162af35f..c27f698a40c 100644 --- a/server/methods/setAvatarFromService.coffee +++ b/server/methods/setAvatarFromService.coffee @@ -1,8 +1,11 @@ Meteor.methods setAvatarFromService: (dataURI, contentType, service) -> - if not Meteor.userId() + unless Meteor.userId() throw new Meteor.Error('invalid-user', "[methods] setAvatarFromService -> Invalid user") + unless RocketChat.settings.get("Accounts_AllowUserAvatarChange") + throw new Meteor.Error(403, "[methods] resetAvatar -> Invalid access") + console.log '[methods] setAvatarFromService -> '.green, 'userId:', Meteor.userId(), 'contentType:', contentType, 'service:', service user = Meteor.user() From a7f77a0cb7e23648e05fcf0443d718a82a2ac402 Mon Sep 17 00:00:00 2001 From: Rafael Caferati Date: Fri, 30 Oct 2015 02:28:26 +0100 Subject: [PATCH 064/114] Added server check to the Accounts_AllowUsernameChange setting --- packages/rocketchat-lib/server/methods/setUsername.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/rocketchat-lib/server/methods/setUsername.coffee b/packages/rocketchat-lib/server/methods/setUsername.coffee index 1dfab8b8783..4ea4a1cce94 100644 --- a/packages/rocketchat-lib/server/methods/setUsername.coffee +++ b/packages/rocketchat-lib/server/methods/setUsername.coffee @@ -3,6 +3,9 @@ Meteor.methods if not Meteor.userId() throw new Meteor.Error('invalid-user', "[methods] setUsername -> Invalid user") + unless RocketChat.settings.get("Accounts_AllowUsernameChange") + throw new Meteor.Error(403, "[methods] resetAvatar -> Invalid access") + console.log '[methods] setUsername -> '.green, 'userId:', Meteor.userId(), 'arguments:', arguments user = Meteor.user() From f63fd8c13bc7b2ae9e5fbc5d8eb522adfb5bbb74 Mon Sep 17 00:00:00 2001 From: "Yakira C. Bristol" Date: Fri, 30 Oct 2015 06:50:50 -0400 Subject: [PATCH 065/114] Remove registration name requirement Name is now optional when registering --- client/views/login/form.coffee | 2 -- client/views/login/form.html | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/client/views/login/form.coffee b/client/views/login/form.coffee index c1a78915ea1..89e4ddada50 100644 --- a/client/views/login/form.coffee +++ b/client/views/login/form.coffee @@ -129,8 +129,6 @@ Template.loginForm.onCreated -> validationObj['pass'] = t('Invalid_pass') if instance.state.get() is 'register' - unless formObj['name'] - validationObj['name'] = t('Invalid_name') if formObj['confirm-pass'] isnt formObj['pass'] validationObj['confirm-pass'] = t('Invalid_confirm_pass') diff --git a/client/views/login/form.html b/client/views/login/form.html index ee95ca7ca6d..e5f81cf61c7 100644 --- a/client/views/login/form.html +++ b/client/views/login/form.html @@ -15,7 +15,7 @@ {{/if}}
- +
From 5a6a7f906c992afe4c4b6469ec1b4a867f3077da Mon Sep 17 00:00:00 2001 From: rcaferati Date: Fri, 30 Oct 2015 12:16:17 +0100 Subject: [PATCH 066/114] Update accountProfile.coffee --- client/views/account/accountProfile.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/views/account/accountProfile.coffee b/client/views/account/accountProfile.coffee index 2da61911ef9..6cc72cf2f74 100644 --- a/client/views/account/accountProfile.coffee +++ b/client/views/account/accountProfile.coffee @@ -99,7 +99,7 @@ Template.accountProfile.onCreated -> Template.accountProfile.onRendered -> Tracker.afterFlush -> # this should throw an error-template - window.location.href = "/" if !RocketChat.settings.get("Accounts_AllowUserAvatarChange") + FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserAvatarChange") SideNav.setFlex "accountFlex" SideNav.openFlex() From b287494223301dcb8f3773c7f5e911779bb7e90d Mon Sep 17 00:00:00 2001 From: rcaferati Date: Fri, 30 Oct 2015 12:16:57 +0100 Subject: [PATCH 067/114] Update prompt.coffee --- client/views/account/avatar/prompt.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/views/account/avatar/prompt.coffee b/client/views/account/avatar/prompt.coffee index 270c8cb34d9..48794b37d1e 100644 --- a/client/views/account/avatar/prompt.coffee +++ b/client/views/account/avatar/prompt.coffee @@ -15,7 +15,7 @@ Template.avatarPrompt.onCreated -> Template.avatarPrompt.onRendered -> Tracker.afterFlush -> # this should throw an error-template - # window.location.href = "/" if !RocketChat.settings.get("Accounts_AllowUserProfileChange") + FlowRouter.go ‘home’ if !RocketChat.settings.get("Accounts_AllowUserProfileChange") SideNav.setFlex "accountFlex" SideNav.openFlex() From bd11bd6748f68bf8d4f6285e4dbeacff97bc8ef6 Mon Sep 17 00:00:00 2001 From: rcaferati Date: Fri, 30 Oct 2015 12:17:32 +0100 Subject: [PATCH 068/114] Update prompt.coffee --- client/views/account/avatar/prompt.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/views/account/avatar/prompt.coffee b/client/views/account/avatar/prompt.coffee index 48794b37d1e..27e8e53a237 100644 --- a/client/views/account/avatar/prompt.coffee +++ b/client/views/account/avatar/prompt.coffee @@ -15,7 +15,7 @@ Template.avatarPrompt.onCreated -> Template.avatarPrompt.onRendered -> Tracker.afterFlush -> # this should throw an error-template - FlowRouter.go ‘home’ if !RocketChat.settings.get("Accounts_AllowUserProfileChange") + FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserProfileChange") SideNav.setFlex "accountFlex" SideNav.openFlex() From 861704f5636e0e11cbb8a832ee72feeebac6ac53 Mon Sep 17 00:00:00 2001 From: rcaferati Date: Fri, 30 Oct 2015 12:18:12 +0100 Subject: [PATCH 069/114] Update startup.coffee --- packages/rocketchat-lib/settings/server/startup.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-lib/settings/server/startup.coffee b/packages/rocketchat-lib/settings/server/startup.coffee index bb753133174..9c0cd80b4a7 100644 --- a/packages/rocketchat-lib/settings/server/startup.coffee +++ b/packages/rocketchat-lib/settings/server/startup.coffee @@ -35,8 +35,8 @@ RocketChat.settings.add 'Accounts_OAuth_Twitter', false, { type: 'boolean', grou RocketChat.settings.add 'Accounts_OAuth_Twitter_id', '', { type: 'string', group: 'Accounts', section: 'Twitter' } RocketChat.settings.add 'Accounts_OAuth_Twitter_secret', '', { type: 'string', group: 'Accounts', section: 'Twitter' } -RocketChat.settings.add 'Accounts_AllowUserProfileChange', false, { type: 'boolean', group: 'Accounts', section: 'General', public: true } -RocketChat.settings.add 'Accounts_AllowUserAvatarChange', false, { type: 'boolean', group: 'Accounts', section: 'General', public: true } +RocketChat.settings.add 'Accounts_AllowUserProfileChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } +RocketChat.settings.add 'Accounts_AllowUserAvatarChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } RocketChat.settings.add 'Accounts_AllowUsernameChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } RocketChat.settings.add 'Accounts_AllowPasswordChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } From e9ba1dd2fb15ded816ca079c8e8e760bbec5bb21 Mon Sep 17 00:00:00 2001 From: rcaferati Date: Fri, 30 Oct 2015 12:18:59 +0100 Subject: [PATCH 070/114] Update accountProfile.coffee --- client/views/account/accountProfile.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/views/account/accountProfile.coffee b/client/views/account/accountProfile.coffee index 6cc72cf2f74..78c1828d504 100644 --- a/client/views/account/accountProfile.coffee +++ b/client/views/account/accountProfile.coffee @@ -99,7 +99,7 @@ Template.accountProfile.onCreated -> Template.accountProfile.onRendered -> Tracker.afterFlush -> # this should throw an error-template - FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserAvatarChange") + FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserProfileChange") SideNav.setFlex "accountFlex" SideNav.openFlex() From 83649f152a2a2f8a10c2104a07876e58389c225e Mon Sep 17 00:00:00 2001 From: rcaferati Date: Fri, 30 Oct 2015 12:19:19 +0100 Subject: [PATCH 071/114] Update prompt.coffee --- client/views/account/avatar/prompt.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/views/account/avatar/prompt.coffee b/client/views/account/avatar/prompt.coffee index 27e8e53a237..e1982da5a20 100644 --- a/client/views/account/avatar/prompt.coffee +++ b/client/views/account/avatar/prompt.coffee @@ -15,7 +15,7 @@ Template.avatarPrompt.onCreated -> Template.avatarPrompt.onRendered -> Tracker.afterFlush -> # this should throw an error-template - FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserProfileChange") + FlowRouter.go("home") if !RocketChat.settings.get("Accounts_AllowUserAvatarChange") SideNav.setFlex "accountFlex" SideNav.openFlex() From 28038b88b85c54e7f65c3d9868e0d494bb548fc8 Mon Sep 17 00:00:00 2001 From: "Yakira C. Bristol" Date: Fri, 30 Oct 2015 16:28:38 -0400 Subject: [PATCH 072/114] Update PR With Admin Settings Option --- client/views/login/form.coffee | 5 +++++ client/views/login/form.html | 2 +- i18n/en.i18n.json | 1 + i18n/pt.i18n.json | 3 ++- packages/rocketchat-lib/settings/server/startup.coffee | 1 + 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/client/views/login/form.coffee b/client/views/login/form.coffee index 89e4ddada50..de98936d2de 100644 --- a/client/views/login/form.coffee +++ b/client/views/login/form.coffee @@ -2,6 +2,9 @@ Template.loginForm.helpers userName: -> return Meteor.user()?.username + namePlaceholder: -> + return if RocketChat.settings.get 'Accounts_RequireNameForSignUp' then 'Name' else 'Name(optional)' + showName: -> return 'hidden' unless Template.instance().state.get() is 'register' @@ -129,6 +132,8 @@ Template.loginForm.onCreated -> validationObj['pass'] = t('Invalid_pass') if instance.state.get() is 'register' + if RocketChat.settings.get 'Accounts_RequireNameForSignUp' and not formObj['name'] + validationObj['name'] = t('Invalid_name') if formObj['confirm-pass'] isnt formObj['pass'] validationObj['confirm-pass'] = t('Invalid_confirm_pass') diff --git a/client/views/login/form.html b/client/views/login/form.html index e5f81cf61c7..c1247d08a25 100644 --- a/client/views/login/form.html +++ b/client/views/login/form.html @@ -15,7 +15,7 @@ {{/if}}
- +
diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 7d09638e92e..338b99443c3 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -44,6 +44,7 @@ "Accounts_OAuth_Custom_Button_Label_Text" : "Button Text", "Accounts_OAuth_Custom_Button_Label_Color" : "Button Text Color", "Accounts_OAuth_Custom_Button_Color" : "Button Color", + "Accounts_RequireNameForSignUp" : "Require name for signup", "Activate" : "Activate", "Add_custom_oauth" : "Add custom oauth", "Add_Members" : "Add Members", diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index b54800e035b..c04e5b7bc3c 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -35,6 +35,7 @@ "Accounts_OAuth_Custom_Button_Label_Text" : "Texto do botão", "Accounts_OAuth_Custom_Button_Label_Color" : "Cor do texto do botão", "Accounts_OAuth_Custom_Button_Color" : "Cor do botão", + "Accounts_RequireNameForSignUp" : "Nome é obrigatório para cadastro", "Activate" : "Ativar", "Add_custom_oauth" : "Adicionar oauth customizado", "Add_Members" : "Adicionar membros", @@ -406,4 +407,4 @@ "You_will_not_be_able_to_recover" : "Você não será capaz de desfazer!", "Your_entry_has_been_deleted" : "Sua mensagem foi excluída.", "Your_Open_Source_solution" : "Sua própria solução Open Source" -} \ No newline at end of file +} diff --git a/packages/rocketchat-lib/settings/server/startup.coffee b/packages/rocketchat-lib/settings/server/startup.coffee index 3a61e1e10a5..79209546fe8 100644 --- a/packages/rocketchat-lib/settings/server/startup.coffee +++ b/packages/rocketchat-lib/settings/server/startup.coffee @@ -37,6 +37,7 @@ RocketChat.settings.add 'Accounts_OAuth_Twitter_secret', '', { type: 'string', g RocketChat.settings.add 'Accounts_AllowUsernameChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } RocketChat.settings.add 'Accounts_AllowPasswordChange', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } +RocketChat.settings.add 'Accounts_RequireNameForSignUp', true, { type: 'boolean', group: 'Accounts', section: 'General', public: true } RocketChat.settings.addGroup 'FileUpload' RocketChat.settings.add 'FileUpload_Enabled', true, { type: 'boolean', group: 'FileUpload', public: true } From 5b16e73edefb8d063aa11fe3c7eaef0c96e5c19d Mon Sep 17 00:00:00 2001 From: Ed Date: Fri, 30 Oct 2015 21:25:16 +0000 Subject: [PATCH 073/114] Auto hide audio recorder when wav uploads are not white listed --- client/views/app/room.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/views/app/room.coffee b/client/views/app/room.coffee index a3e30778731..a005cb3af08 100644 --- a/client/views/app/room.coffee +++ b/client/views/app/room.coffee @@ -188,7 +188,9 @@ Template.room.helpers return !! ChatRoom.findOne { _id: @_id, t: 'c' } canRecordAudio: -> - return RocketChat.settings.get('Message_AudioRecorderEnabled') and (navigator.getUserMedia? or navigator.webkitGetUserMedia?) + wavRegex = /audio\/wav|audio\/\*/i + wavEnabled = RocketChat.settings.get("FileUpload_MediaTypeWhiteList").match(wavRegex) + return RocketChat.settings.get('Message_AudioRecorderEnabled') and (navigator.getUserMedia? or navigator.webkitGetUserMedia?) and wavEnabled unreadSince: -> room = ChatRoom.findOne(this._id, { reactive: false }) From 783d47969b8459de5314974909ac3f27c7f161f0 Mon Sep 17 00:00:00 2001 From: Ed Date: Fri, 30 Oct 2015 22:07:26 +0000 Subject: [PATCH 074/114] Add description to Audio recorder setting --- client/views/admin/admin.html | 5 +++-- i18n/en.i18n.json | 1 + packages/rocketchat-lib/settings/server/startup.coffee | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/views/admin/admin.html b/client/views/admin/admin.html index 2cffc76a600..ea58eccdb14 100644 --- a/client/views/admin/admin.html +++ b/client/views/admin/admin.html @@ -65,10 +65,11 @@
-
{{#if description}} - {{description}} +
{{description}} {{/if}} +
+
{{/if}} {{#if $eq type 'color'}} diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 7d09638e92e..d8c640f4397 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -216,6 +216,7 @@ "Message_AllowEditing_BlockEditInMinutes" : "Block Message Editing After (n) Minutes", "Message_AllowEditing_BlockEditInMinutesDescription" : "Enter 0 to disable blocking", "Message_AudioRecorderEnabled" : "Audio Recorder Enabled", + "Message_AudioRecorderEnabledDescription" : "For this to work upload of Wav files must be enabled in the 'File Upload' section", "Message_deleting_not_allowed" : "Message deleting not allowed", "Message_editing_not_allowed" : "Message editing not allowed", "Message_editing_blocked" : "This message cannot be edited anymore", diff --git a/packages/rocketchat-lib/settings/server/startup.coffee b/packages/rocketchat-lib/settings/server/startup.coffee index 9c0cd80b4a7..af44e376026 100644 --- a/packages/rocketchat-lib/settings/server/startup.coffee +++ b/packages/rocketchat-lib/settings/server/startup.coffee @@ -78,7 +78,7 @@ RocketChat.settings.add 'Message_ShowDeletedStatus', false, { type: 'boolean', g RocketChat.settings.add 'Message_KeepHistory', false, { type: 'boolean', group: 'Message', public: true } RocketChat.settings.add 'Message_MaxAllowedSize', 5000, { type: 'int', group: 'Message', public: true } RocketChat.settings.add 'Message_ShowFormattingTips', true, { type: 'boolean', group: 'Message', public: true } -RocketChat.settings.add 'Message_AudioRecorderEnabled', true, { type: 'boolean', group: 'Message', public: true } +RocketChat.settings.add 'Message_AudioRecorderEnabled', true, { type: 'boolean', group: 'Message', public: true, i18nDescription: 'Message_AudioRecorderEnabledDescription' } RocketChat.settings.addGroup 'Meta' RocketChat.settings.add 'Meta_language', '', { type: 'string', group: 'Meta' } From e654aef983378f5fc23d132831cc8802f0da9072 Mon Sep 17 00:00:00 2001 From: "Yakira C. Bristol" Date: Fri, 30 Oct 2015 19:56:50 -0400 Subject: [PATCH 075/114] Expand live support chat text entry field When entering text, the field will now accommodate long messages --- .../rocketchat-livechat/app/client/stylesheets/main.less | 5 +++-- packages/rocketchat-livechat/app/client/views/room.coffee | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-livechat/app/client/stylesheets/main.less b/packages/rocketchat-livechat/app/client/stylesheets/main.less index c43ea669f2b..1573e9cc323 100644 --- a/packages/rocketchat-livechat/app/client/stylesheets/main.less +++ b/packages/rocketchat-livechat/app/client/stylesheets/main.less @@ -290,7 +290,7 @@ input:focus { position: fixed; bottom: 0; width: 100%; - height: @footer-min-height; + height: auto; border-top: 1px solid #E7E7E7; border-left: 1px solid #E7E7E7; border-right: 1px solid #E7E7E7; @@ -301,11 +301,12 @@ input:focus { display: block; padding: 6px 8px; padding-right: 38px; - overflow-y: hidden; + overflow-y: auto; resize: none; border: 1px solid #E7E7E7; // margin: 10px; border-radius: 5px; + max-height: 200px; width: 100%; font-size: 12px; -webkit-appearance: none; diff --git a/packages/rocketchat-livechat/app/client/views/room.coffee b/packages/rocketchat-livechat/app/client/views/room.coffee index 4a856e8cc01..c518f76a54a 100644 --- a/packages/rocketchat-livechat/app/client/views/room.coffee +++ b/packages/rocketchat-livechat/app/client/views/room.coffee @@ -13,6 +13,14 @@ Template.room.helpers Template.room.events 'keyup .input-message': (event) -> Template.instance().chatMessages.keyup(visitor.getRoom(), event, Template.instance()) + # Inital height is 28. If the scrollHeight is greater than that( we have more text than area ), + # increase the size of the textarea. The max-height is set at 200 + # even if the scrollHeight become bigger than that it should never exceed that. + # Account for no text in the textarea when increasing the height. + # If there is no text, reset the height. + inputScrollHeight = $(event.currentTarget).prop('scrollHeight') + if inputScrollHeight > 28 + $(event.currentTarget).height( if $(event.currentTarget).val() == '' then '15px' else (if inputScrollHeight >= 200 then inputScrollHeight-50 else inputScrollHeight-20)) 'keydown .input-message': (event) -> Template.instance().chatMessages.keydown(visitor.getRoom(), event, Template.instance()) From 2ebd4c832e0e1b9e0a2a6a1a10eccdff1fda60f8 Mon Sep 17 00:00:00 2001 From: "Yakira C. Bristol" Date: Fri, 30 Oct 2015 20:00:24 -0400 Subject: [PATCH 076/114] Expand live support chat text entry field Removing extra space --- packages/rocketchat-livechat/app/client/views/room.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-livechat/app/client/views/room.coffee b/packages/rocketchat-livechat/app/client/views/room.coffee index c518f76a54a..3ac81b7c284 100644 --- a/packages/rocketchat-livechat/app/client/views/room.coffee +++ b/packages/rocketchat-livechat/app/client/views/room.coffee @@ -19,7 +19,7 @@ Template.room.events # Account for no text in the textarea when increasing the height. # If there is no text, reset the height. inputScrollHeight = $(event.currentTarget).prop('scrollHeight') - if inputScrollHeight > 28 + if inputScrollHeight > 28 $(event.currentTarget).height( if $(event.currentTarget).val() == '' then '15px' else (if inputScrollHeight >= 200 then inputScrollHeight-50 else inputScrollHeight-20)) 'keydown .input-message': (event) -> From 29af18a7a66f1f4850df2b58cf7429de9c8018d1 Mon Sep 17 00:00:00 2001 From: Ed Date: Sat, 31 Oct 2015 18:55:56 +0000 Subject: [PATCH 077/114] Hide recorder if uploads are disabled --- client/views/app/room.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/views/app/room.coffee b/client/views/app/room.coffee index a005cb3af08..80dd1c74fb9 100644 --- a/client/views/app/room.coffee +++ b/client/views/app/room.coffee @@ -190,7 +190,7 @@ Template.room.helpers canRecordAudio: -> wavRegex = /audio\/wav|audio\/\*/i wavEnabled = RocketChat.settings.get("FileUpload_MediaTypeWhiteList").match(wavRegex) - return RocketChat.settings.get('Message_AudioRecorderEnabled') and (navigator.getUserMedia? or navigator.webkitGetUserMedia?) and wavEnabled + return RocketChat.settings.get('Message_AudioRecorderEnabled') and (navigator.getUserMedia? or navigator.webkitGetUserMedia?) and wavEnabled and RocketChat.settings.get('FileUpload_Enabled') unreadSince: -> room = ChatRoom.findOne(this._id, { reactive: false }) From ed7240a8f6b91424917001e2b88c34beed96e4fa Mon Sep 17 00:00:00 2001 From: "Yakira C. Bristol" Date: Sun, 1 Nov 2015 18:04:20 -0500 Subject: [PATCH 078/114] Utilize i18n for displaying registration name field placeholder text --- client/views/login/form.coffee | 2 +- i18n/de.i18n.json | 1 + i18n/en.i18n.json | 1 + i18n/es.i18n.json | 3 ++- i18n/fr.i18n.json | 3 ++- i18n/it.i18n.json | 3 ++- i18n/pt.i18n.json | 1 + 7 files changed, 10 insertions(+), 4 deletions(-) diff --git a/client/views/login/form.coffee b/client/views/login/form.coffee index de98936d2de..face5c303d9 100644 --- a/client/views/login/form.coffee +++ b/client/views/login/form.coffee @@ -3,7 +3,7 @@ Template.loginForm.helpers return Meteor.user()?.username namePlaceholder: -> - return if RocketChat.settings.get 'Accounts_RequireNameForSignUp' then 'Name' else 'Name(optional)' + return if RocketChat.settings.get 'Accounts_RequireNameForSignUp' then t('Name') else t('Name_optional') showName: -> return 'hidden' unless Template.instance().state.get() is 'register' diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 27f18d58870..5df7c46aa5d 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -220,6 +220,7 @@ "My_Account" : "Mein Konto", "n_messages" : "%s Nachrichten", "Name" : "Name", + "Name_optional" : "Name(freiwillig)", "Name_cant_be_empty" : "Name darf nicht leer sein", "New_messages" : "Neue Nachrichten", "New_password" : "Neues Passwort", diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 338b99443c3..8a0c5a72482 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -245,6 +245,7 @@ "My_Account" : "My Account", "n_messages" : "%s messages", "Name" : "Name", + "Name_optional" : "Name(optional)", "Name_cant_be_empty" : "Name can't be empty", "New_messages" : "New messages", "New_password" : "New password", diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 7ddc9011322..760d8811f49 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -68,6 +68,7 @@ "Msgs" : "Mensajes", "n_messages" : "%s mensajes", "Name" : "Nombre", + "Name_optional" : "Nombre(opcional)", "New_messages" : "Nuevos mensajes", "New_password" : "Nueva contraseña", "No_channels_yet" : "Todavía no eres parte de un canal.", @@ -136,4 +137,4 @@ "With_whom" : "Con quien", "You_need_confirm_email" : "¡Es necesario confirmar tu correo electrónico para poder identificarte!", "Your_Open_Source_solution" : "Tu propia solución de chat de código abierto" -} \ No newline at end of file +} diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 29399fc7c90..b9d183bb2e8 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -209,6 +209,7 @@ "My_Account" : "Mon compte", "n_messages" : "%s messages", "Name" : "Nom", + "Name_optional" : "Nom(optionnel)", "Name_cant_be_empty" : "Le nom ne peut pas être vide", "New_messages" : "Nouveaux messages", "New_password" : "Nouveau mot de passe", @@ -390,4 +391,4 @@ "You_will_not_be_able_to_recover" : "Cette action n'est pas réversible !", "Your_entry_has_been_deleted" : "Ce message a été supprimé.", "Your_Open_Source_solution" : "Votre propre solution de chat Open Source" -} \ No newline at end of file +} diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 81fedc920ec..b38087dd60d 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -62,6 +62,7 @@ "Msgs" : "Msgs", "n_messages" : "% messaggi", "Name" : "Nome", + "Name_optional" : "Nome(opzionale)", "New_messages" : "Nuovi messaggi", "New_password" : "Nuova password", "No_channels_yet" : "Non fai parte di nessun canale ancora.", @@ -126,4 +127,4 @@ "Welcome_to_the" : "Benvenuto a", "You_need_confirm_email" : "Hai bisogno di confermare il tuo email per accedere!", "Your_Open_Source_solution" : "La tua soluzione per chat Open Source" -} \ No newline at end of file +} diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index c04e5b7bc3c..f03f1c7c6d0 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -223,6 +223,7 @@ "My_Account" : "Minha Conta", "n_messages" : "%s mensagens", "Name" : "Nome", + "Name_optional" : "Nome(opcional)", "Name_cant_be_empty" : "Nome não pode ser vazio", "New_messages" : "Novas mensagens", "New_password" : "Nova senha", From 98dbc13c862156832d9482f9d9b4b28b309d4fae Mon Sep 17 00:00:00 2001 From: Marcelo Schmidt Date: Tue, 3 Nov 2015 07:24:50 -0200 Subject: [PATCH 079/114] Create role when adding a user to a non-existing role --- .../server/functions/addUsersToRoles.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-authorization/server/functions/addUsersToRoles.coffee b/packages/rocketchat-authorization/server/functions/addUsersToRoles.coffee index 3b04cfa6fd5..3af878e6814 100644 --- a/packages/rocketchat-authorization/server/functions/addUsersToRoles.coffee +++ b/packages/rocketchat-authorization/server/functions/addUsersToRoles.coffee @@ -16,11 +16,13 @@ RocketChat.authz.addUsersToRoles = (userIds, roleNames, scope ) -> existingRoleNames = _.pluck(RocketChat.authz.getRoles().fetch(), 'name') invalidRoleNames = _.difference( roleNames, existingRoleNames) unless _.isEmpty(invalidRoleNames) - throw new Meteor.Error 'invalid-role' + # throw new Meteor.Error 'invalid-role' + for role in invalidRoleNames + Roles.createRole role unless _.isString(scope) scope = Roles.GLOBAL_GROUP Roles.addUsersToRoles( userIds, roleNames, scope) - return true \ No newline at end of file + return true From 76dca9f5cd1402d438c7057b1b030352bd7a000b Mon Sep 17 00:00:00 2001 From: Marcelo Schmidt Date: Tue, 3 Nov 2015 07:25:20 -0200 Subject: [PATCH 080/114] Enable robot calling methods on Rocket.Chat --- packages/rocketchat-lib/package.js | 1 + .../server/methods/robotMethods.coffee | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 packages/rocketchat-lib/server/methods/robotMethods.coffee diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index ea4c4ff85f5..207c43bb040 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -59,6 +59,7 @@ Package.onUse(function(api) { api.addFiles('server/functions/setUsername.coffee', 'server'); api.addFiles('server/methods/joinDefaultChannels.coffee', 'server'); + api.addFiles('server/methods/robotMethods.coffee', 'server'); api.addFiles('server/methods/sendInvitationEmail.coffee', 'server'); api.addFiles('server/methods/setAdminStatus.coffee', 'server'); api.addFiles('server/methods/setRealName.coffee', 'server'); diff --git a/packages/rocketchat-lib/server/methods/robotMethods.coffee b/packages/rocketchat-lib/server/methods/robotMethods.coffee new file mode 100644 index 00000000000..9ebebe73ea8 --- /dev/null +++ b/packages/rocketchat-lib/server/methods/robotMethods.coffee @@ -0,0 +1,16 @@ +Meteor.methods + 'robot.modelCall': (model, method, args) -> + unless Meteor.userId() + throw new Meteor.Error 'invalid-user', '[methods] robot.modelCall -> Invalid user' + + unless RocketChat.authz.hasRole Meteor.userId(), 'robot' + throw new Meteor.Error 'unauthorized', '[methods] robot.modelCall -> Unauthorized' + + console.log '[method] robot.modelCall'.green, arguments + + unless _.isFunction RocketChat.models[model]?[method] + throw new Meteor.Error 'invalid-method', '[methods] robot.modelCall -> Invalid method' + + call = RocketChat.models[model][method].apply(RocketChat.models[model], args) + console.log call + return call From fc51d7fa21c0c0c0ff965f29d4a946626361933d Mon Sep 17 00:00:00 2001 From: Marcelo Schmidt Date: Tue, 3 Nov 2015 09:26:25 -0200 Subject: [PATCH 081/114] Fix translation for Direct Messages and Private Groups in Admin/Rooms --- client/views/admin/rooms/adminRooms.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/views/admin/rooms/adminRooms.html b/client/views/admin/rooms/adminRooms.html index 08756aff842..cc39896ec68 100644 --- a/client/views/admin/rooms/adminRooms.html +++ b/client/views/admin/rooms/adminRooms.html @@ -17,8 +17,8 @@ {{#unless isReady}}{{/unless}}
{{_ "Channels"}} - {{_ "Direct Messages"}} - {{_ "Private Groups"}} + {{_ "Direct_Messages"}} + {{_ "Private_Groups"}}
{{{_ "Showing_results" roomCount}}} From 51ac8d68737892659f7d682bb1138ff520fef3e0 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 3 Nov 2015 09:53:15 -0200 Subject: [PATCH 082/114] translation for unread rooms division --- i18n/en.i18n.json | 2 ++ i18n/pt.i18n.json | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 7d09638e92e..499e7b2148f 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -389,6 +389,8 @@ "The_field_is_required" : "The field %s is required.", "True" : "True", "Unnamed" : "Unnamed", + "Unread_Rooms": "Unread Rooms", + "Unread_Rooms_Mode": "Unread Rooms Mode", "Upload_file_question" : "Upload file?", "Use_Emojis" : "Use Emojis", "Use_initials_avatar" : "Use your username initials", diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index b54800e035b..eace2ee8f4a 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -358,6 +358,8 @@ "The_field_is_required" : "O campo %s é obrigatório.", "True" : "Verdadeiro", "Unnamed" : "Sem nome", + "Unread_Rooms": "Não Lidas", + "Unread_Rooms_Mode": "Agrupar Salas Não Lidas", "Upload_file_question" : "Enviar arquivo?", "Use_Emojis" : "Usar Emojis", "Use_initials_avatar" : "Usar as iniciais do seu nome de usuário", @@ -406,4 +408,4 @@ "You_will_not_be_able_to_recover" : "Você não será capaz de desfazer!", "Your_entry_has_been_deleted" : "Sua mensagem foi excluída.", "Your_Open_Source_solution" : "Sua própria solução Open Source" -} \ No newline at end of file +} From 93e293a5b2afda0209bddc692ed9cd3518a694df Mon Sep 17 00:00:00 2001 From: kakawait Date: Sun, 25 Oct 2015 19:59:32 +0100 Subject: [PATCH 083/114] First draft to support Oembed protocol as defined http://oembed.com/ Currently only support soundcloud (futur providers will be add) --- .meteor/versions | 1 - .../client/baseWidget.coffee | 3 + .../client/oembedFrameWidget.html} | 8 ++- packages/rocketchat-oembed/package.js | 5 ++ .../rocketchat-oembed/server/providers.coffee | 55 +++++++++++++++++++ .../lib/client/widget.coffee | 3 - .../lib/server/server.coffee | 19 ------- packages/rocketchat-soundcloud/package.js | 28 ---------- 8 files changed, 69 insertions(+), 53 deletions(-) rename packages/{rocketchat-soundcloud/lib/client/oembedSoundcloudWidget.html => rocketchat-oembed/client/oembedFrameWidget.html} (67%) create mode 100644 packages/rocketchat-oembed/server/providers.coffee delete mode 100644 packages/rocketchat-soundcloud/lib/client/widget.coffee delete mode 100644 packages/rocketchat-soundcloud/lib/server/server.coffee delete mode 100644 packages/rocketchat-soundcloud/package.js diff --git a/.meteor/versions b/.meteor/versions index 15562e4f1fe..937836621ce 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -142,7 +142,6 @@ rocketchat:oembed@0.0.1 rocketchat:slashcommands-invite@0.0.1 rocketchat:slashcommands-join@0.0.1 rocketchat:slashcommands-leave@0.0.1 -rocketchat:soundcloud@0.0.1 rocketchat:spotify@0.0.1 rocketchat:statistics@0.0.1 rocketchat:theme@0.0.1 diff --git a/packages/rocketchat-oembed/client/baseWidget.coffee b/packages/rocketchat-oembed/client/baseWidget.coffee index 8a84ed7a506..9caa79832b0 100644 --- a/packages/rocketchat-oembed/client/baseWidget.coffee +++ b/packages/rocketchat-oembed/client/baseWidget.coffee @@ -15,4 +15,7 @@ Template.oembedBaseWidget.helpers if this.parsedUrl?.host is 'www.youtube.com' and this.meta?.twitterPlayer? return 'oembedYoutubeWidget' + if this.meta?.oembedHtml? + return 'oembedFrameWidget' + return 'oembedUrlWidget' diff --git a/packages/rocketchat-soundcloud/lib/client/oembedSoundcloudWidget.html b/packages/rocketchat-oembed/client/oembedFrameWidget.html similarity index 67% rename from packages/rocketchat-soundcloud/lib/client/oembedSoundcloudWidget.html rename to packages/rocketchat-oembed/client/oembedFrameWidget.html index f478120bed7..6965b8e6102 100644 --- a/packages/rocketchat-soundcloud/lib/client/oembedSoundcloudWidget.html +++ b/packages/rocketchat-oembed/client/oembedFrameWidget.html @@ -1,7 +1,11 @@ -