Browse Source

GitHub actions (#2617)

Renée Kooi 4 years ago
parent
commit
084d17db7d

+ 36 - 0
.github/workflows/cdn.yml

@@ -0,0 +1,36 @@
+name: CDN
+on:
+  push:
+    branches: master
+
+jobs:
+  release:
+    if: ${{startsWith(github.event.head_commit.message, 'Release')}}
+    name: Publish releases
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: 14.x
+      - name: Install dependencies
+        run: npm ci
+      - name: Build bundles
+        run: npm run build
+      - name: Upload `uppy` to CDN
+        run: npm run uploadcdn uppy
+        env:
+          EDGLY_KEY: ${{secrets.EDGLY_KEY}}
+          EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
+      - name: Upload `@uppy/robodog` to CDN
+        run: npm run uploadcdn @uppy/robodog
+        env:
+          EDGLY_KEY: ${{secrets.EDGLY_KEY}}
+          EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
+      - name: Upload `@uppy/locales` to CDN
+        run: npm run uploadcdn @uppy/locales
+        env:
+          EDGLY_KEY: ${{secrets.EDGLY_KEY}}
+          EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}

+ 74 - 0
.github/workflows/ci.yml

@@ -0,0 +1,74 @@
+name: Tests
+on: [push, pull_request]
+
+jobs:
+  unit_tests:
+    name: Unit tests
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        node-version: [10.x, 12.x, 14.x]
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: ${{matrix.node-version}}
+      - name: Install dependencies
+        run: npm ci
+      - name: Run tests
+        run: npm run test:unit
+
+  lint_js:
+    name: Lint JavaScript
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: 14.x
+      - name: Install dependencies
+        run: npm ci
+      - name: Run linter
+        run: npm run lint
+
+  lint_md:
+    name: Lint Markdown
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: 14.x
+      - name: Install dependencies
+        run: npm ci
+      - name: Run linter
+        run: npm run lint:markdown
+
+  types:
+    name: Type tests
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: 14.x
+      - name: Install dependencies
+        run: npm ci
+      - name: Run linter
+        run: npm run lint:markdown
+        # Need to do a bunch of work to generate the locale typings 🙃
+      - name: Prepare type declarations
+        run: |
+          npm run build:lib
+          npm run build:companion
+          npm run build:locale-pack
+      - name: Run type tests
+        run: npm run test:type

+ 38 - 0
.github/workflows/companion-deploy.yml

@@ -0,0 +1,38 @@
+name: Companion Deploy
+on:
+  push:
+    branches: [master]
+
+jobs:
+  docker:
+    name: DockerHub
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Log in to DockerHub
+        uses: docker/login-action@v1
+        with:
+          username: ${{secrets.DOCKER_USERNAME}}
+          password: ${{secrets.DOCKER_PASSWORD}}
+      - name: Build and push
+        uses: docker/build-push-action@v2
+        with:
+          context: packages/@uppy/companion
+          file: packages/@uppy/companion/Dockerfile
+          # TODO add a companion version tag if this is a "Release" commit
+          # Punting on that since it didn't work on travis either, so current users must already be relying on commit hashes
+          tags: transloadit/companion:latest,transloadit/companion:${{github.sha}}
+
+  heroku:
+    name: Heroku
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Deploy to heroku
+        uses: akhileshns/heroku-deploy@v3.5.6
+        with:
+          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
+          heroku_app_name: companion-demo
+          heroku_email: ${{secrets.HEROKU_EMAIL}}

+ 21 - 0
.github/workflows/companion.yml

@@ -0,0 +1,21 @@
+name: Companion
+on: [push, pull_request]
+
+jobs:
+  test:
+    name: Unit tests
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        node-version: [10.20.1, 12.x, 14.x]
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: ${{matrix.node-version}}
+      - name: Install dependencies
+        run: npm ci
+      - name: Run tests
+        run: npm run test:companion

+ 35 - 0
.github/workflows/end-to-end.yml

@@ -0,0 +1,35 @@
+name: End-to-end tests
+on: push
+
+env:
+  GIT_AUTHOR_NAME: Uppy Bot
+  GIT_COMMITTER_NAME: Uppy Bot
+  GIT_AUTHOR_EMAIL: uppybot@uppy.io
+  GIT_COMMITTER_EMAIL: uppybot@uppy.io
+
+jobs:
+  e2e:
+    name: Browser tests
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: 14.x
+      - name: Install dependencies
+        run: npm ci
+      - name: Start Sauce Connect
+        uses: saucelabs/sauce-connect-action@v1.1.1
+        with:
+          username: ${{secrets.SAUCE_USERNAME}}
+          accessKey: ${{secrets.SAUCE_ACCESS_KEY}}
+          tunnelIdentifier: ${{github.run_id}}.${{github.run_number}}
+      - name: Run end-to-end browser tests
+        run: npm run test:endtoend
+        env:
+          SAUCE_TUNNEL_IDENTIFIER: ${{github.run_id}}.${{github.run_number}}
+          SAUCE_BUILD: ${{github.run_id}}
+          SAUCE_USERNAME: ${{secrets.SAUCE_USERNAME}}
+          SAUCE_ACCESS_KEY: ${{secrets.SAUCE_ACCESS_KEY}}

+ 39 - 0
.github/workflows/website.yml

@@ -0,0 +1,39 @@
+name: Deploy uppy.io
+
+on:
+  push:
+    branches: master
+
+jobs:
+  deploy:
+    name: Deploy
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout sources
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: 14.x
+      - name: Install dependencies
+        run: npm ci
+      - name: Build Uppy
+        run: npm run build
+      - name: Build website
+        run: npm run web:build
+      - name: Prepare deployment
+        run: npm run web:prepare-deploy --quiet
+        env:
+          DEPLOY_DIR: ${{github.workspace}}/_deploy
+      - name: Push to Github Pages
+        uses: crazy-max/ghaction-github-pages@v2
+        with:
+          target_branch: gh-pages
+          build_dir: _deploy # relative to `github.workspace`
+          committer: 'Uppy Bot <uppybot@uppy.io>'
+          author: 'Uppy Bot <uppybot@uppy.io>'
+          commit_message: Update transloadit/uppy website
+          fqdn: uppy.io
+          jekyll: false
+        env:
+          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

+ 0 - 130
.travis.yml

@@ -1,130 +0,0 @@
-os: linux
-dist: bionic
-language: node_js
-".apt": &1
-  sources:
-  - ubuntu-toolchain-r-test
-  packages:
-  - g++-4.8
-".hosts": &2
-- companion.test
-".sauce_connect": &3
-  username:
-    secure: nAMJ/d1fm9urTYsQ+1uqj6Jjf71J8rzwYBSZbTDAeUEZzAdvGc0a9H3PYWM4pnUDPo5s1c9MMetXi2XNdUbXgMKHbEnePZ2mJamqFtXMmpG8pgFmMqj+btMd7Yybt070tRsn4Vy0uBSi2H/en7F3j+grABJV+SAXqWkSB7CU1fZaN/u0DpoGBNj1ZNwkYCIhpLueYJTPRWBOodMAarXuFv5+7KFOKuZM3tF/JjsMNSSaDgTkz13BZnbX6vNPxGJJNJcyJGSaXrVW8hh1Zmvnk/XdiLy+vt7Wz1wz3A9ebiFDuydo5AAkxrLFsCJ5nGEqLg3bkr6NaTRpbM84ZT3i1FQMTdKP6OHHqwAeBscB6BkyhZhzvsFtl2YRBNK9mA3OtOYvBmTkFkNqvrPQlfu7cFtyG5+AUfSCiTTgS/vWIwoqSVAXaOEqN8Fp54ecUdkzCTttl3gXteZzNLRYvyQcFpoJb6E+dS8qAW0OFOteiwKVuPCh3nGUzBP13bRo1i9UAX7ZCTlpjinkxE8ryzbToo6ZcVQMBAkKhaw/x8GzOtfm5rgYMeQzGEoBJNfr7qqfs7JMxAIEMYjrTL9PXVOp/R8F3FdsqbV70jSyfsxMSMkwSWFRmVslG8+Djy8P3LnckGy1FEbMHnH8GZHZg+hbBzN8Be1/1fV0oRRAr939WRc=
-  access_key:
-    secure: OY3oWwiJghfty9wSPVvlhirvFGxPHDdIRuVkzAv6j7C/hj2BWYAP/UHrwdQ9XiYisHi/B5mGeyRVlrAf0MNGrG84rTDUbTWZbmktfuxl7A+Y6c0czk+s4SdhOiANG5b3tFl5wKq8h7uhrWH5/jWoKQ2Fz1VDCqxTvvZQbo41jSBhi7TBia626hxEePzdaiuw6HhGFZtfaoVs/FX30ylz8WDNrBjwCynjxsT52BaQrVvgEhuyzlOpI69YkZBPOq4fc3KiZ2YR43gLTx8K+sYCE9yJxdg1xT/UAawEhmedU83nyBZVo4rr7+03AixIxtI28MUCfBMlcsGwBxcKEKY/IWcp9UkPCq6+zALQoncV478tP21eYvlmxSFhYCrv+WEQlN+BcNjr4OJlmmFDbCVaF7r9qLeQPImU0+9iJU3OjrW7lpfLxORpGDEr2Nx6awKkIJCxNyK9weefeNo6Fz3V1kkyZ/7yWFeniJnRUCbahrB2XgzxIE+W307s1Qs4fm6JK7hVLTtG4fBzjChmAyGIzu744ws9WqmjvkC9D7OfnuXqanv/VcBFqPiudInerv7NL8FketUC+fxe/7XJfcxdaDGBjk8Kq7zXDohGRGymUXEoMDNJsKkMMlaKzdf7tgqdhsRJoH9NCVqrDXuG5al0UtrDP5RS7qfoxUunJmNFhlg=
-  no_ssl_bump_domains: companion.test
-jobs:
-  include:
-  - name: Run end-to-end browser tests
-    node_js: 12
-    if: type = push
-    addons:
-      apt: *1
-      hosts: *2
-      sauce_connect: *3
-    script: npm run test:endtoend
-  - name: Run unit tests
-    node_js: 14
-    script: npm run test:unit
-  - name: Run unit tests (Node.js 10)
-    node_js: 10
-    script: npm run test:unit
-  - name: Run linting
-    node_js: 12
-    script:
-    - npm run lint
-  - name: Run Markdown linting
-    node_js: 12
-    script:
-    - npm run lint:markdown
-  - name: Run type tests
-    node_js: 12
-    script:
-    - npm run build:lib
-    - npm run build:companion
-    - npm run build:locale-pack
-    - npm run test:type
-  - name: Build
-    node_js: 12
-    if: NOT (branch = master AND type = push AND commit_message =~ /^Release/)
-    script:
-    - npm run build
-  - name: Build and update CDN releases
-    node_js: 12
-    if: branch = master AND type = push AND commit_message =~ /^Release/
-    script:
-    - npm run build
-    - npm run uploadcdn uppy
-    - npm run uploadcdn @uppy/robodog
-    - npm run uploadcdn @uppy/locales
-  - name: Run Companion tests
-    node_js: 12
-    services:
-    - docker
-    script: npm run test:companion
-    deploy:
-    - provider: heroku
-      api_key:
-        secure: IbnHioWy5xFxd3QjlX9cGtQVxLHgvIfYFKkdRke7QRh+Rmpt+b1KjPr2h+/SXI2OcTM+XerViQH6P8mGXCKJqPaBS0/FrabuS7blTQv3K0rP81WkgWjdWxYC04uU4GZWpyZkgnV3lJBxcfRaots2OHcnQI6+fdeP25qM9n7g+G8y+btSXru0xZVyJVJ+e0nsl38CuAnxfh0GSmS+4Dd1E1lQIxvlwORZCJmUOU31knxN7T82GQW6O8e23Yqv2HTdPFRUqhOYA0IfdqS+X55yp8GfvJJvtPe7IMr4i/Yn8M0Uhp4ZwkKjTzKYLRwWojTXUxP1zfU6qQxDKu8aWdVGRz6rm39IX9UYThaAqPNyci36fzIidJyJUosUj9WM6Ds7Qs4dLCsLIgTfb/Nl7sPT6P8SSWePb+P4jZr11qL+LlAP1ZzA7c34QCG9wxJG8Qrh2hQi9JMdupmYNF6/0q0Iisya+vPdxRFpsXVdXU7xVW28UwLxVNhw/2yhSNlRlgE/HYfr21zMyRQGW72mJ0AO5jNVbl8paGL96/W0UtjTlZrb4zu7fOW9SJdi6TWkfZx5WhSvHG59P4Ph1nMuty6LG5dYvdqDF/BV4SoK8bdJ8U6O8BOom8hhqZv+lDuP0O60gQVTR17nUQ2aRbI4OAUuJt61QTyPpO2tcJXKN6chH3s=
-      skip_cleanup: true
-      app: companion-demo
-      on:
-        branch: master
-  - name: Run Companion tests (Node.js 10)
-    node_js: 12
-    services:
-    - docker
-    script:
-    - nvm install 10.20.1
-    - nvm use 10.20.1
-    - npm run test:companion
-  - name: Build website
-    node_js: 12
-    if: branch = master AND type = push
-    script: 'true'
-    deploy:
-    - provider: script
-      skip_cleanup: true
-      script: bin/travis-deploy
-before_install:
-- nvm install-latest-npm
-install:
-- npm ci
-addons:
-  apt: *1
-cache:
-  apt: true
-  directories:
-  - "~/.npm"
-  - "~/.transloadit"
-env:
-  global:
-  - CXX=g++-4.8
-  - secure: Z+Twmk8/yo4FbeHqk3TcLVK4fR+KUoevrUxkRM6SLckVeCwlFnoD1kQ4JTVHuS2LbW9r2T4VJ/SC6yDtdjqMRvD/ZtPw//vMw9mKyBEMZN4uxOhmHp4hltkBErqeHbZpgd4eSwSVrqDwliK27Q42wIs+Rjilc3UXqddWEmmw/VuxGR3SRpACILqe2Fqm/g73iX/7PNNASuXwmWi6Vf5ZeBQTGiCfPETblBa4WSCrPpsBv5flUEGNM9uFoXXqjAC2TyZrS4yiFGxJNf5/UPp9xipr+RhoEp8NX2GP0W2jDDfUTHFGfcUyF2lluVJKpkHjYQYrYBknjTFcQHL+aE7GWU7f6kh4g3i6e9qktVFV7yNPPokxuvVG+AxExVhZHK3wBTh2ZWs5vjcd0u5w+IV9+v+d/CZWl/zGRcHDILt2eUW9KZwoGtgrcaPnlVtYPCRBXPpsoD+lE3uOuGGGS/V5lmhBnCLexj+2rzztyb8zhQgZB2rLKF1zQ5JiBE+z0ykjHtZWMECE7r4H8K4hoaeOlIG9suPSgwQgl5HFniFUBzHWXqdsOA/tAwGAtdYSlSNAPrkiMYqXjb+1Je2uhYnfV2roBolufLmgYjmDkpVtaY968Zi3qSYTDX7gkx4NEdkiZDLJK8iXXF5RlcHHaUlno+4ytvcNMpf6V9EpTVeLaIs=
-  - secure: o92bhAYmfSq6G4cpWcd8pbvmcL3cQFNXvXNmrdhWsbyaDJm29MHGNfM5d0AwRhw1X/mrIB7COG8QgK9OSYvFjFsHMKUhsryl5AWJS54535RzSV/NjQAZZvFJIf4SUhu5OEPxyMFrkCaaK1yWiWRaDRTwcjmHnkCJnhrcrtiOXPnbK+oTvDFZj7/Fz8ljtdFcAt/KGnKxreF8lojCeGh/lVLmWKliA6t55buguk1fF168wzFsUawFZSsq/gCma2SuW89CdGoGJzyUtkHSrm5T4t4wA8beQElzT1cu5Yhl62XzelXSU9zwag7/N0PlTqLvji/hhPNgck2Vj37FYo99asygiGrXBkSA+wC8tnGjAvEwO9eEch7wdnFn1IFNSNI9rDrRWBWnoa0Rq2UyUtdcXuNvDIYxsZSkWf6cuNI/BaEj2eYOb9vn8GE1hHVHZ0fLDbSN/PW5htjUf/pklBSoIyQjYE7vQAEnpkiOrpacvaMEzdAQtawIIN7HBeVJeyecV0R2r8E8NzL1JcqZ8GCfEjyAeEYjlKDRGXrzu/2PfFWXarOjr+ePgKVZxd65j9Ueqv70t1kUn1Y5AfcuiqaRveVQKn3vGLzO0u6mDz8t6Ic1/8/t4gQ569AoQFm59TLlD69kZzu05r3qF9X81fPhr2UU3tX4ZpyG1K2qk+bzn0Y=
-  - secure: UYwkNMvX05Wp3gafovGHi+F2ks4/Hsb1Z3tfTTSFQdocOrU64gsE4be9jhoBJm1qnkAjOegySD0/YLA+kH5EwyUVbKrCKPNRvLcUnYGV1ohR3aWZkZhKbG9vR9zl1MyHFuL/2JTg+yI5ZyXB2GkZVfZgHvWOlfsakq8JA5G4DHLoJcIA8/cKeyb4HDWm7ZsELoUW3+VKk6M7OGS5kSMeMEJHHDim3A9mT6sBraQ3ZA+Xek6vNfoDEslG2coybsLBgbTCbj/xANnPk8xWo03ZtGG8LIWkq1FcU0Eqfi0Jp9o9lYElzTW0fx6uaeLcBX/VhywszSw4EQT0dRKzUlB3H2vdRqSo71PdUwYoSV+oUSU9WlOe0Z8efRN1sXqS0BefL4vod6Rl6N4cXhQ5JNQtRoNkQ7mDzTcBudCw0jFjSyW+1ikiH19tNFd4SMBaaqLWOeia967/atwXMid7Oc1o2tFT3Lf3w9DjeTarsdW9K7zPQpN6DPUbbitEi1XqIdwXpNy5F15Jy7/qJzsaZ6xI5pRD98NePP3j2fqwLbJSyohut2mbxWPGYEfpLsYhwVPQaLm6xJZK2ThYJ3naRUzMFm4Rox+I2FhVX2j0ZsLQf9P+Xi3jahv3I3LI7iHHlLNRgyVlZ/+FcJPMPpmBqsyWnvmniZiXqk3g1499LIOjf2A=
-  - secure: gAu+EDw7HOBeemDsEroMhGPkwvsnAkTlX3EbgyZUVs/QyCad9nxK5NxqSST8S7+CAqcAMtpS7HBiwjsjV2qZ3iJ12W1KuN3V7td7hDX/FC7rzSIjyNfkrgOvb/JYRG9RMtMLds2XxyojZYGjyBZyjunZwI8UquZqJwJhOQo0hdv4Fj0rCjq7jeMGrKgSiVokOqoi3KcfBugbwPLP6JMDTmcIvcD+x3HhvxMWXIfuJyaalZYu1wfD7s811iTl9IN+VT4YkXx7K0V6AmwH8zJKEG0GJdhJsjQcKOqBpk0jjfvQk/XQOFqYwimzRkYyNrzLOni7HHxyaMcv8SzwrM8beasu6o9HPsmOFtwNYiacuHi6ikan9EyGgaONk62NYtAmuV/72y2NbEbpzpSwcBvkDwyVq2iif3S5zU4qWTJh1K3YfJqOqhhNwL/j36drNb5xnRyTCl79Y+60lgv922H0FifpUZRZUc+NvRV9Q+uqJdlK2vzfr4P6BWBvOjlOfzSFqbY++UucuzfdAVblUbhTQ6bofPFw8ZLMylu7QxdCpu7htaNgxssWiNW+BaUSm6fzQD8ibP1u3n6gmSEVxZuUMBeKRE8fDR4YfSpq0BYgLrc+sUNq1iZzKnVGKL79mJkOAS1Sm9tI/vqG5f2Uf4donAWT53+d3UAH9eSKTA29meA=
-  - secure: NpYqPeN/gloTHMywnfVlyLFj/IbIBRkL1nb4SdtA99NfRJo0kDB+k6wLNaLNXY2q0WhpeTQIDPJ2ptONf6u1Gu2yxFKN3myYG8XVcmYmIWbqKAaKFT9+SY0SrP22nPmXQL7oyfWxsTLUyuh8F/52FlPro/o58QZK8cJE5CCkVeGrTb5LetKqmtuvndfBRrb0cLOCkk48emUtwjbMYUMDDwCIWmtTPKMQCot8kn2XAQQZ6kDiP8tu5WhdNnS3kjfOCLW9A7EYt8ULkRXWHN1yUoVdWwLlDEMglkEthSp63bmDrx0iX00lVYFbzkohEYA4tCzXklP1TKKV6xQG6DoCsnJzyaqT6m8WNj0EWghBff7Cus0WvLKZaAOSkZfsyG/q94PdTh1PMiRbNuJQja/JnXqFrzFLF/bExA3tHZOcBajGL2fynOj+IsNuv+DdP0q+kApUwZKFG4fZ6MQkzl+R0gc4RvlVakp3sTgQwefd0VJN980+SKFzofdzEkaLCwLMXsYhBLLo6jb6/Xm0rq/uWZLM/kKdnA2qYxMUjF3KZY4HT2P4nVyFscDmuDPjJ49dtKvWK7XGCER1JtW2J+yAyZ2Slv/TzDWrM0IRZlYGbRkjq6Sly0KGABanMXC2J29Gy5Q+wNoFD5NBE+pz/Mt99ggXn7HrlCQvTpdtCoIpYpk=
-  - secure: YpVwjcpc6FomKgRb0tP8MpITEOfvMP2kTAnpSfG3USMW3mZ8Zkn8CLr471DjpmVE2jHklI6AfPTpGPFb1VOsrS7Ea4jxAJOdBwH6Ab7kL52GX0GYtPsSxeTVME5IMZXsU90UCbAXKOEkZbGq5sIaIHjAePmcNSv+OHb157fqcyX0oSJWDg1eVzBikgWhpKtlcbPFp7AdoIvhDr5bPLyV1c0HmOIEirc0VcoQg3fYsKB7mY5tP7KCqCIJtZtD0+FiSamp13WImD0/7wwX0hbTG2KH3zgjyiKOLxsbwXOIpXIJ0utXY4EFZBTTSZjItbL/f5wzZ+xBhwAsy5/Vi2pCtiVI2sUZ98b3FioLdQ7+3jQviNmOam6b56KTNAy2l4Tlu5h8PGtBvsDo+ZcgJ06q65YRZQcnOIweGv0vZ31cdgcVXRb+8fWFywQeIk6DD0FluB3/zZl7pn2Olha0gv4DxiythXDAHRoTzZfFfaPL1T+kl6ViGNQvKi6ucy8/ltlO/JKAeJlWKJouWOe2TvGMNU6JKQfAiqz1y16lVa8P5VYj+cRbsfalYfhqEf96kMdelgCup7mQdTMAiOP6lhIF9ItMjVqVFQECYy6oItxAGXc8UAJJcKJSc6DwVTgOK6V7LfkoM8O6qMeFzfpPnsFEl3uwjQEmMzc7Wk2LxkrFoBI=
-  - secure: gqSy8e0l5gm6xqgKtKwbE8K+bhIrL9+NwqG6nADUhEFZqtNiNzeKu2Ym++cTrRJhBaJQr9gy+GJtL2BH2rFwIhtuk+/zsdaenPC8tZ/Phof5MBVJApPJ0kgbbFpcJFx8xu6TrlOfDls0Cu8RHA6FQ/4RSoBooCZOrWHrPXpJiN04lAZUpUdJyAg/1suP2owAcvJAjKI7laWVLTkhDZNjDDJ2gSjGtF3AnWL0piRCJXAWehrgcLFC8PMC9RAG/Puxh9WH8dCH8Tp0ccfib11X2mtT1Ii6mwg8y6U6h3yoRC9dJCB+IGjDKkE8aEESzvsQBp3T6QIqxNK4gAhN90je+bT9AjoHLVcIao7aCHCAvOXlQobZCzWdbfCZJEba+Xse2Zvwyy0mjEae97eljsRwsaH7qXEMcBNipqU9S1p7DQAwLU1Wgkyn1eml65Gc12VZ+fEjzS10OfYLHnxxUnrjGGJqNOdVkj+arwGm2ZTYzrUB3csHm47mTQz2x9QqWE4ICs3D/OLK4zMNq+pSiYtYv6sbY4WDWSFXMQtkys7DgCBAiQg7Eekedp22o/mVX2b3ZQ11SUAT5MIvhGRzvsk32puaiVW2tSAXeH534diuNSUuguzoDrS1fGBsBLeQbV+f0QfhjCziF1hWzp3rwq2b3szsC3lDOxG3Zq/lCGIZ050=
-  - secure: YDeqwl7CH0YoMqy+hgqcdzPUHVhiZxiHHqTt0INX6o6LdB9gh6P2II7nJYAKuXeIhboM2bVsyGoiTnx/Pxmkil8Kr7Uc5KJZ/4bHD3+MLT0gtrfh8WPyzMRePxrjn380kYFYz/N5LSWRm5A+92U7wPNRYBJIDWpVdHxE9zs7nclBJsvq/Gyidx/2A9LvEn4zmgCcKgB7GoVfXCtMUpQTtVjGCt2O+j0abeg8cyA/edxZaUvgHIZxSM7oAQjvlEloSSKPQPcrmIqru9fSN/VHyMLATUMtqp+I8jULOA+WLDgyEYUA8ofdMYlGyVlSp01fYK3bSNbcma/dln/O0wczPsIlz2ZWhwKXcGn44SQWrOOEazs/FalO1TNAql/1P2iyNd/1M77EjpLMWewpqnRCvKiCVFiJ++MfE9jEYbQtvc3jpa+seKlqPnP/4kQlINKow+J3sI7zveTf/iIcS/zN86oQw2QXlf7XoiTg5Et6zo0a+cf/uuS6e1m4cs+kvL4t+g3mMTgtou0Hifl98BmoyatP4/SszO1/lWEKi0sO06zv56A0FXtUjkZAX3MA8goOIHfpUZR1KbrbbQdI0nbAjHiIvsGg+aoAHTx9xMY3Ceb/xmK2AHZZfoH1yJFHARTbiaNcpKTPI7wp0eH4Ptbmh0u0FLQEYFtt3vQGALtueU0=
-  - secure: GXEHrPdfmMrBshZqAEXzbg2vHRvammVLxo2PwAH/m4Mi30cSoRq80aYH2vrzWR07jAEM/jyS/OSY2jMBgQPGfF2c3lrdJSSkqFUnfbvHnhH+fZe9mv9T6VUyTSWPge4z8ZbjHSqZORNW31jCuZC2ftGJBJpYdfoKaladK08vcBIj+bG1bjdZwio2HjycO55saILrZQVYHu6VKe2g2oNdEC2xaP1NBuxBFpR5NZwOLQjPjR3lU8xvTy5hU+rxR0ILi7aJ+mIUzcK0q3FSoLFJTa6E6OYWw9DMamaKk6OpBqALBAWIAw37Z6qYdgolQqGR3ZSgvR3aZIDveoim6tVWJG4lLn5mD+jNuM2N3XxFOIfSafE3PDJy7HUsDFkv+nXh2TFzEsFSzNxY1I+falgkq/CEnMSeYWxdvsa+H2zuCBoi6Y33PqR9rgFjukdJ0R2Agam1Jx/wLMoOnos7gc12fm/ARlUSPMFXmuKuTLFparDPZeh/98Wz91yyI1jWww3tQOVMOTiANyxXaVhOKsmhyOqfvvaaytyWYthW1ZQCczHZYhXC5bL86hq3ZQkFFhG45Z3zxmsXMZBz8O5T1epsR8Jnsja9OmXpgLuWx4FBw8MeAtTYC1ewFFR52LMgcN2KBTs97iwT5TIPywA9NMvl9CnKK3CReEyzSaPdtECBBIY=
-  - secure: h1Ye8bDFv3F4Z3wWXLHCu8fTXiHQ30pUDi5jEW+e5FoQoVAFLzZNlKTFpPKPv59DT163G6xdA5FbJ2U/8rnmKXChEP8I7p25ajK5hNYr6KKhmR0dwBzEE4Vt6pgjiWPnaeBVsI1nxb8++aWDPoAAvphfzrSvPft5HYHTjpPuHz3TDhxY2I8/bP16ohh8M1MiD+iPbk+ScGgjJhzBUcW1NgMat2j4jGYPtzyQknHM95+GSBgdpKT8GJqsgivUGX9CrnGEWHUpq6NlaGK0uba316WxVmtGGi7obNvIUrxghbN1WtrtNxkg7DnXk3HHHEupc4T339zDZ86sIdJzRqlpdp0kTsPHU/drb5jpWBtfmBjylVh8gTEwyecpUtLttf2Ex1/Am1JiwchqJfd45/fGQ411SFNlvLUH9Ew37S4Q9wG7lafpbSiG2+oFxz2OjHM6VPSTVlg5K9nA40Ipf2TE21GaPSPL2j4eGm58VFym679xeTOXo9bZ537uuiXRL4ODjg7aq/Z6VgKpbyeCiC8iucapdQcb9P6GweB7t0gB3WK6Dyh4XpwhCqOwKNPgMcyd5+6bNVAIxygmo0PLaQ8L+3huUtqqaMFm6qvy/e3djY/kDuBMVwmee3D9xoDVPcF2Mtz6pKcFjVGmYJqHM3aFk3uc420GFP9gcLStWTz84MY=
-  - secure: likLGpAGYgLhnECaQjcrH6BafZOY6i+5eQgCswfcHHl7GZdRzDCYpvrb1qPWIAPkXZV9ppAoPUk4koaJnCztQqv29/Zqux3CQZoEVGhPRpbqROHAbbMjl0FdHJyVyIEhN7s4sbbYl9VZmy/hMGKgAumxnjihLU1GeEMCT3wRBpyKpNQQbyGsXTFMPikJP/qzaAUMfOHVCx3zXd4jvxZCXyTKYptqw363PgFHYOmWVqx/g3lqZyg4/B/sNdjjrEBzPIcgktX3+8sdVB7r5p6Rp+J4xG1EtyKcPjKfAWXBPPNbiSeuVz0B5uB3SmxYrgfSyU0wfUVxNu26wJAn725w8RHYg272CHUS7YMkEKx1cvUKT8f6yXBFlryZvmhr7i+PXyGij4AaqdMrEtrFPALHqgpdp+vkZvfnSzg18ROvZX8xQB+7vFOeVMXsmWMpmvcUsI2CW7Y/k8Kq8SBs2mU+S2MJqyj+Cqq3bytSrF4Hp1OI75aOIo95xB9MtzOiMhQFzH8AQ8JkbsMXEyqYJXpAIYAK/5PCipRKapeHWdSukBnPToAa5/eoSGtvRtcdkMP3Ze4SHDzXAkyi37R6sog1TC4gFuk6rBZDInTFxz6u2lew0/Twl6c+mUaWZHZ1GUuAoXUPXFM7goBhb29uliLpDSxffcgAfShLkWDthnW+hU0=
-  - secure: ZwYPb/dBqPGY/PdlaLIy1au0nV7W9Os+jgAjvligvbHovfv3fWSBffpiql+h3kmCs9I9HYHHSZYJ/YMGEpa6YBKU7qWRmDxbOa4uBHmUZqW1KB7/kDbMySISs4oPhKW0qhpZBpwM7VfXFvhhSHdNs/ZhH8yqTojiAstGIBHqUjyfFBR3s1OxLJCCKTCZdHCFERYCd2gPY1aQYgQCz9ZelEx1h5NIMfGZwPX5XswlySg98sVZ3o0NGLpdiAfx5TeJeB6CnD/pvfMgu1B42wGmMCL/lLfjz+SSKF3DqMiE2FXYWgLy/2qlQ0ampTNL+tkEmxOpRrHHlWYPxUqvvppBOckO245rKTtajioR9XlKOgsGrss68plCujryMMmJvKWd8USlYSPA2OrxBVxrEavwMYUfm2H0GN31AYk8BiBtGpoPC6JN7nVxOSbnrhSca1HhWWqTlxqeM1vLi4qBL8orhl+/UhLohsiLy58rlRDZB/kEHDjeSZv6EsOmZRm/LD85sCCBfCCqhtI5+7Spt/SrRLXeLKuPx7+nNgzeAjRJPsmXrEQUjyE2Y7/WEoBPyjuxRaxqD/KNuSsC6EDGfilzn2uo7Ui8qSGlWIcz5DzVMnoVk8svN+hGU6jujs5q/xTvaUp9/4u0TnzQUfGxE0HQORlmuVDzrRzhgV56A36Kcdg=
-  - secure: N3Ji0VgtTOW7hz4TcTpQniZRBoerPWxnbenVmGi4OUID0rGYo1LZZfjbcj7aybrOE8ZVl+spNaS9tdcu6zBfIFwMNzBdw7DqpZ4qVu1ZWjWi4h86lCDTcZO/qIfBXZTwnfdwm5QpOLjgPlidEY7slflqqvZTd3aCQ45uqbnGk1lF7LiYtafmXk+mcZQKJWcb0KUFKuV1V4Ongf09BS/aDd1DRJX9lNuhHAgWjmV5gkN8ns5O6D1ThdVQ2ry1Ah2L2mW4n9FNNLQtTWYAg44dtEg09mEsskGv9rOU0ZeXbQsWWRgFpjZhNOK8sU3RsFq+tgBh0eEUZhVb2f2cLAVNwOilTKoKQp2edXU5jflF4v1QHMvI4cPeVY9RcgSS/F2usxPhUk5reZRFUPSKx2xKjmZxzRmysWaut/ZY/nwcicytihzCWiY4ONcr9Jz9gSxge+R8WKelpfyta0Kw781I5uUwE4kvhpWkzZbfNmGVBIBy1bRiBtN837ri7ROg417ejQFbRVsEs85RA74xhEIIOLVZslw03alBHZ09ddfBRDTu8hTUdXWNbAcm83qGAF6ylSE6G6pCp0P5IDIGBkIf4qGtrooYZDe6E0RUTd4SU3uyy0uBk96hCmULe6qfNSDyJ/fstCcCnhpzOmf0U/mhhR0qtHSZB6502iiruNNVtns=
-  - secure: MQ60bkqu3F8L0j0crjiLRKjiJEq9XA7+Evtmd7/2ePX2f2mEK/i3MHbaMbTEynHTJyJFMJvxxL/hrQsrP4afDBSi95mKT7lSMQWjS6m29OV5lw+uX6aUFyFZ3dif4Bdbpp/2KVJI9i0BFKRNGlAt9s8yVogesYTkJORZDbLOJ1Fa/XoqIkBrN8Cd55mi/d2/KUtuaEOfQL4IX/0Jav3M4iS/EUR52Ah7O3cxWM5HPlqNozfvu/9X6OpCcAZndTCx4r8OS6igsvcm4v3WusELuP2A7/jeuoXbTA4qaSi5iX2IJpSYxlf+6eKfg0jt7fRSLhy/4DJf6WK8IFgm7zynwCXlxxdce/+gVqowuv1IWs1oNVJzwUjlppX/k781Gef2OWyiW1lGk4cUPYAx4kXnT+iz+KAvf42Z9Z44Eo9bmqNcNy0jBBcq39is1Tzl3DQnMF3VdvWrZwEvjTKocGshxckdzRQ5A19LNgmJVSPIp9RuwbkbfT93g3E5H1siJ/Vd/N0cTOOX2EEN/gafHTdn3ADkFf8m8MaUFDY4dv+jpJJuAqDoTDeCahEUsPYZt6RoMbwz9CJICe7ogrKDxSUg0yHltRVAqmHsre7pg4GfHzwUjg0GQxd9M3KK9pbvbyICz80FoZX8uwYNDZGZGajbBabl2H85nVKKaQuFcVCh2bo=
-  - secure: X5QNekemqk43oxStszlqBH467JnsZK7/H7B84DWy1C4T/HD79OiAOZtGIGgsA/2hRVqlC7wCrqN6PFNfzPUAXEz4Ls7aGvQUjdDSQwpqMari9+nZoBooZErpVjQ7KJyr/d11H3xLqvNUf14ECbCKean8945Js+mjfP1nyeHHGKz1K+jKMZY2oAfModQl7NAwebxo+U09U8cUev1XXkQtvHGV2fvNSSO9nt7XdAkP6dKhHdesNg1W9F4/A1di5ZjAx6i9aFDqXYDQnHGGmFicZOFBJAoIb78BbMe57iFFf1tlgTYn1LbZsf7G5dS9ZUhAWBR1MmRrn2Xru50n+bsXAxELFFSphAwqAUhp/pFNEXLgzqL9VsmicZ/HfuUxbfRvOzSA1OuP1EWEuGocSTiLx9Tb1vGjOFABDMCJ/h6sXKhTg9w8Gk1thDy6nPXp0Q8WK4oNO8YWel5/f8VnTIscaNgGXqjTocpMS4CXQXc5FmTtXs8luqJz9M8WIbzLzNqVmSEZ9PNwtswQ2PjYytq0kUU26+jB6kVkCetuS8g6J83zkq1FEKVDp7xMaQzqr6y8XYXxd6PwlpODjgKZV5Xvtvg5juCEXo7T2WYgZWrP9EzjlfFwKnzNyzF4bTfO/0NmYKeuvh5aPuqSQQNaeMzCEGkPmb0hDH4QXdW6tcTw15w=
-  - secure: kpl1ZTVCzTRMmYDmtA1yYbT9PQOBB2JgnRX48kK9OcduQE7V7bLR91i8lG3JFA93RdKVqd5OOb7ExgcyU7vP36ckPZqCL9R9D1x8QjAdzBDQ8dopCxJreZyLpCjETo+vawh1TYz852kPvnEQeAAqQ4/TbPl3jG0CvxGNtI5oOKIT49/BoIeL6XRdFEuStbaXuu65xPIVvqvlWWXj4BU2KVvbQE29xonsNaIpf5nToY/IBfmmvCNEso8PTJ5CpBw+NgadPKP1z8CYtU+wRuApEyDcboyX7Z8NStvlq9pKvKltcFgSgZT1Ng5CbKrn+EA4GYfEudw7iRkopJJyA3nhSR5iPs7nlMiv7WRHzXsbUA/6G8m6/hDXdw05sfNKgVxQGdq0tmiKVvwHXJ9yldsv97lB4TZgm4SbBGXqHZAnw+m0K5rRM1WzM6QbsaXDhWwwruOU4fqs+pHr4VPR30DezDaNOO95u55r3ZSUYVg5kJLr9JUF8FPU2y7cjvX/68TsESNDD6o7o2O7S2trLsakEVuXTiO+J0XXHvtbJpwkjH3O0r/uPpaGclplm6NSRZAFqoiUSuh1Ik3GOlZx37+9Q5UTeoebGAX7AQ4Sc8ZM9wNbx1vgd2leoE7zAsFNnvDC9KTreMHlJle9zQowRjxwUSeZ8rhqjG0LO9q5GLtGk/Q=
-  - secure: ZJZUbrFwWnvMVKFVhMm4W8Jgxhp6m0gY68CEHmnUlMPjjaqaAd/pxUVPhu05Ux+K2o4e5vGveTtXcd102NH+o6RdB3HwLJPEG/6L5Iy8ajDfVmQBjlNH0aNjQ0SLr/h8lHC6PKuGjFNywoX8T4FA5h14XO2QVkx5sO1piVRNFTSjNxJterzKGvuqkXqARQet1Fw/GvPjZ4WluKheTsPo2qhTA8qfz0YrS61XqEP75E3Gd9+1hO9rlOnin7EXpkKI6R5qrqNZ2RFatK5fcrLDebbBuvMZB0dYmQ6KDSSNtmF6tiupSAj0AXXNiYOzIi5WkYmft2fF8/ypGGhHnlfDTqZMZKBq9YdOXcqCuxU7ty+MWART8OQiduaVg1ftjJPtdrUlSy7zgnI3Xn7SsxZniAOTNESpcWAaWZvxBfaKwTnlQ/daQBAo8t3A72DGab3S1Tt3xgEVbmzS2u2ghKi813M6fnK3+ZiJqIMftGlq0bMhJfwiJXboLpBhUhNH9fYBz0YLwgJyDpb7AIBQOgimYTSFLFpW/Ky1wFiWXmCdY+cMIiEmgbBSftpHZQeJMNZkbE4N24ooe+Xb/tS014+uScyPbJzKQ9q7kcKUwT5VNC47RU1YwyYaILhDzCBGmN9zJ2LAXjNqPP0XqHUlrBgaey0h1T6c5lighelGUrHN/EM=
-  - secure: HAPlWHSW1vI5XD5MnbTUV7KHAvgrBSFY2pF+clOCmC4A6cr0zf8N5kGPnsp0S/fU7p/BUlekTIdlsc6Q9kvTbtT1DPpGG9IUW//dlCpRBL/74FE9okp51jzJneFp7SrCBxcIB5IZvOGvQEBfHmW9dopXcwWs9AfMVArZsEeKATQFyvPNDGfssBAGYLy0J2E9s3ZRYjcYeyz/f8o8XpSJW8pgI9qcOd4vu/fuhmzNY7yYdATxv/Y8vjJ7r2p85yhk/MhW2gwJUdwGDkasCWjurR4gLp6l0lXd9jpQ69h8iEhy7lXU8VTnM8tPJ953o3FF14YesRngSrDj7zGRRsC8DMKVh53trug8COHjj9ILeDrcdl2RBBk96fdLrd83Ct9t8dqNY3myL676w3n1zA3Gt1Evln5T4lVDiq5vliWBdc2cMLZsD/n3UiwOfUId8SnjwozF0Z0yIEn0UfTNkgjARPnPkZ83d3cAlN5VyXv7AhYO6S8eu6aHTe+W3iwJ6DEb+k742x5RrY9QHrMYlMS3RoJjTpq2nuB1D7h8oqKaohWAW7Xw5jyLmJQf78Sn02it0x4ZCNwvE3f2qUHIgwejUjHQTMP4IO4kE00yCQh/SE4M7YTweL4F8kStE6sLOxN5r0dpn9FH+uJ2yzs9xLPJH6fH5WJQvy8oIZEWNTWoAks=
-  - secure: ZR5wbLfraJUNQPLGr61Mvj5v4v7DsNQR1C4JmUPkEz89P3icpjYWgWvYUzeU6RiwpVw6EZvFrItosHpxN9pBgha7xrgtsJe1JoyXWmLKeDSeMSmnsW2CcTmrO4KYQ2TTBh/zQJCfkhSveQLaUdTBE/EyP1Ez8Q9sEmsldFxeDNQxf5SAaYJeY6tdIFaeh5pIRfqRUtF9BrSTj8TzBq38gW7/B6ccymL9ZeL766h60sW0Z3dt/Z4KEM4ePgxfO8B1JHdAoENfQ/eglBBV4aUdS6LA3OtEUf8ky7YEfOZVyF//mgnxetNPq+5qoDNWwMhFmGlHefza5eSqiw5YI9eWKqz76X02U8zrLtenUR9oyuq1zuXZteS2zdOBxsgNR9MdX6k4/EbOVNpO3JmBwUSODTcdae7o/HJJO7v8VjtFGdKwbBVOhHcZ2u9GFeL9X7hzXh8oBJdSbgudsWyzC/eyuEeyZY5GPmqbeGZYy4o8tB1p+29IlnOJLP2vC7ZRXQAfWkre3WDHXbRlL61Oa5W1mxyjAOjrVvRAGPtFiOavzmMD0u97DwWsTJpdZyFvUOHl9IbQYkh/j67q2BGB9fNvfvMALVbr7z5lm6+MjPH3oz4OnYYW/+fVOf/bngxw5f/JbAQbrO6bcU/uburCiB0JKnORlsN67jvoF7Dz/2mnkQM=
-  - secure: V6qVB6vHAuSt1YPgzYpknLglnxbYJM5bsjAjQi78zZQSqrrWCMBgp5Q+Sq7Ad8nycgnPl8W8VpMnUIBqZcK4ciCW+vJBtZ7fBJLIEGMEk8+c8az8JePFcBRiaEicZPvZFuIHPteaAy6jK1GRVpjSjJi3NYEMpcDUs2aTM2bIpX0ks2WjUqTXiK8EvIaK2LTOgSBvyGUOiHwwTkom+PyD50t7jP98g+9Pn7GPwtWaUo1K8UpLArwR2fZ/nm0F2DU6ohz7o2t4LATFXuZhbOCj7O9vh+CmBf+/0C7giT3K23LbckDSK8CNTCDC2bsv8zDo5ZZtgdOvdatOD+VlsbAMkmUzzDgQ3410arZ8g1LVQw8eJwu1H+etcAinYf4r+Tr7s3dTBliMX70/IpjZrkHR9uXEi4LelBNYn6TKdLTW3lfVWkiFs/HPu4SoAmu1+sxSvwxVDDLeexQmb2fwp0r2tDKZ3eRfpQXLPACBaORnGW6ki9qXo8PBdaElxPbpzEWzAfT3F6zRjebpow+cdFBQrAga7/LrOrXerZxH2ekRWKgXzuhw7ERwVFrVN4/NlmDJXo+rm4na7n7CxY/QpZcdpthksDO9KYCqmn5dqMqFGislRvRe7PqIti8gC4pSdeUhDKsIh9OEgVNjCczvnA8rMRQ5aNmFx6wspmrBvO7qRLM=
-  - secure: rVsiFPA9TvH/d2wkP8+1i5QGUuYw0q2BUAUdxyxO9hQcG/nRiHXtQfLbTRZHKwvqf0vyV6J1pJqLlVN4JO/bPhAvk55KAQJWl8UqyaeZiEN9KMcTr3fJuNFlBj4ciYiZ3BWwakblsiaGCjKMRdjki58a9f8XL2rcM8R6ccndjkTMYnBKaopSsAgouI8D5n74wQz6lODUayGOlbwlGLfGtPYplUfSLK4wghC+jgWsNjJySqJhfgYS0JCZc10Qw+FI2BoU4SZ4+P0L0YPIC9zV/cUW4qDT11N/oUgwfjZbPWfM9A/xn/d7sgDH+SpeoGdYler/lvxojj6L2mD/wAh8/lg1E6nL2aKgExE3z+fd2XV8L0osB/sulB7/Exrezg/mVejAx2IkWVHi4VEJmcTV+3WeEvTFOM3fID8dOVf+GUv+hcHdZMxS/hfj3keKCYG1P5ameMJO8FehRqhetNYnr6FTyrK+S+xitaZ/nXrTbHItPS0pZ4XA6CFs5uzMBPeDnk5/D7paPyrE/k2HAc1WmA6g37OyzYIMEV1laBz8IG0qMqg6JJmr09P/Iwrim5Ex2fAssT9Yr1WuOE2gWoF0A3XuVXQHVf4tJT6x/WDKChmbX588a47AvBgkFyoXLRilUYlET2tWnEpVxUovsbJXqvHwTXWMLO9riRjjeInbpvA=
-  - secure: eq5hOqRBN2R7YO2dYdn5OjZc/zLLYYDZcCpCu/K/8fU4HYWTqxrBntjv8T0sZ5qdlAs3IniEfXxemz9V3zwvxR+vh2bGuYr2Xo7RRa2TIDuw+KUPZogrVxhXHPKfyJqstxy+dee2+pWhGkAP7caiu49eyqlboBMkzgpO/xcdehEWYRY5jPgvnlH+QRZ3GADKs1JEeltHDiZ6rYA7nj5Tyx9UoLgv4Av9UXdC29we7dLFTkVfCHE//7wfZW9+/IbxthA4qMjQOFaBrmagN5yweDg87iPTqNMth7FjzOavdUgQ2TW6d10VDEhLIZh36gLGreViKMDCEWKMQ8f/mv05Ao8+DXyXgxIn56II8lhUp5ukQ27ZWixfEKFx2lynJWRZE0pWwf8ec1+bXLQiBOE181Cl4nUT/TbFWzvV6yA+cMiQKe4y59bC4nhkK3IYgpR5kfCFOT+1tFknQ4hNJNacWwUmaDFMxYJaXEtRUn5jJa7eGRYSCrmnymbnzZ6w3Q3nQGNvNxpbBIXX/pzs0VDVTxSlgN4gA+n2jeCyjgVVrMQ/HoAS4uwm1cx89AttW+TANppg1PqWhhrJYuVEZSnvV8PM6R7rbvlS5tluezQj41YklgjsSopH7//+dbGGDNbrTTLic4J9PJR3yEtlAMdOCi53iT0R0Dt5X2WBv2QT5Eg=
-  - secure: ZOSwtE0lBuVO8ncxedW3yGRactSMy+QH/ySPBy79eRmuqrNR+c4mfhiYQAyJ9jmw746YT+8+X/eRwlKOa0SDzUOxEdq6lHqUjubaLvLvy7mr5WHR2b2HDmVYUNNvKgLxn9QPgNwja1toSq/gtK/oi69ENbQLMOHgP8anOK4P6UK4NvoMu1DjyPmBStMAWeEMwuwAaYf4RgAkCsOLTJBejL8kCtWSZNBJmT05lBbE1oSFy77Tg4h93PESOOODek2RRgIikR7LK2rI4tG2oHeo5uFnCe83yu7ZTEI3ArxYtqynYn8iy/zOHf3ewIwgqcqRV/EcvKKwCHx7yi/VNk3qKoz5/jWzE9+ceoUd3vXaU7r1SfXX8ACTmQArZqzU7Rng2s+7r8I8//XCGAsGI6/cOOlS7I7Yr7Ack6CqLlL2HBIoNGYT+jXP/VY9pgkm6YlpNAphdoQrZ1vm/0CtQQ/q5H0fW16qgUJZ1vCk+3PZYNt//83bI7TyIwX72dCrMKzub6bhQtWRMSCfxZELFgue8f+cQf/+NmHhmd9yRJyVhiZvtE/4RN4F32dJbJjtOb4HjFTQIAyE2rZlB4tjOsTKJK7cT+X4enRzyinDYpAjMgNwloAg8xsn+YE53pZJLFUqk8q1yUE6XkSK9fYRSKVc3mb4ICDY4/hTzJRBf+tSUSI=
-  - secure: I+xjM/yl9RuP3p8GcnxTnC6/0K3S3PN0o71XIjQVkSMtDwnn6qDVl6yMy6KMPlPtg1xCU59LslojTv9wKyQpECqzjR0ugIlNsvPmnmcIWuPJZlG465lwQU2ycRbNF/S2Eea/wf76HpY8hemSaXz8iXKxP3eQpFKKP+tcf8o+/g1rlbtIvVQfXb2vUb4luQdnjJFNhUt9R0JpAt6/P0mOUJuqgj3KkfwiILB6m/hZ8dWhCQ0W/S/HsZMbXcxgGmS5RL7K4jgYM4KqE5aDoZGu3dIqkjpHLqNTQGC3TK6Be2EXan+Id1jubTDnflOq6F7QRwisSnmtc8WgByjKLzJzBeM2nz+jah/kYVs3dUGxMfWR++I7t0ioPtUGRW5ZLUeIk4hrRnoLAGq9t9wladuDtdWNioZ4zY33fpDxc6B+dxuhW4pMPzKIlBBiYFBflxrHI9FnAOohFiWVwR99asAydnkNkmQLMg68VT86MpT4EQKahvM1jBHvFd7yPdSc0UCAlQWAOv7Wl2HompxJPlqPNXZcv6hdX5XkKQRlgscl7WcvXaeQV47+J4+bewUJoCOEuL9qeTke6MP74WuHQwOhnwvEf+AYhQ6G7T+jaFGghSexfvkZHesYLOG/Aln/CYk/ZJuLmH5cr6XMN28Nb5SqJdsYpfRwmU5LvT7MFqHwEqs=
-notifications:
-  slack:
-    secure: L3iQQE8sZ0ik1Z26gPoNMiIam9EOEwYhraHCY60Jk/wmfH6SW/727yKXpgcb/yayx37rUZplvoO7H8e05ISxTJKSepEeqbBUIBQs48S8hr+FHk0VPtpP4HGxqaITRLm+mI1coPRvfISxzrB8d240oup6muhC9Ws4/LXi6v8miyIOs2zoYmGxd56TrUeON3UYlKt6dMava0V4bugARzrafN/tfyI9ccqbHzQLBspQvBI61DzZ5I2vnWpkjfWgIHz9Fl4VzXHqMXwjuTUEu8ibA12b3dHZiJEAoqeb9Oj9QcLPbstPLhlNTZZaOrfiFtwLctI2rFh37slDpAfk5idv3ycxcoG5rbCxgyg5i6dpQqrqHxnyglgHg2/nZ+YA5okeS7nJJNtU/4S6AFRWOUUWMVVY0VBEV+8w+uurl0PDy80RUY3uyK64qAgQ8U0M81/Ys1oyWyn78TqHcbby7V2Ws5I9Yakrq8D+mdfsWYCio8F6LXHSwJ0mt2FanJtdDvpPk9sAwsXZN0n8xhELt5TiRp3bzVIQ0IPUgF54dTG9/zWRvC1P4TFaFU/2fg73ZEUC5aWJoFMnLSZjbZvp5gwpCVd0MjSBk80nF9dHYcavIgJ0wMGI3BMb8Nn6+T11Gw/ycr7OGU4NMkj7i8vSFgKF74piWZyiNW8orkMN6XZgM+o=

+ 30 - 0
bin/prepare-web-deploy

@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+set -o pipefail
+set -o errexit
+set -o nounset
+# set -o xtrace
+
+ghpages_repo=${GHPAGES_REPO:-"transloadit/uppy"}
+ghpages_branch=${GHPAGES_BRANCH:-"gh-pages"}
+ghpages_url=${GHPAGES_URL:-"git@github.com:${ghpages_repo}.git"}
+
+localDir="${DEPLOY_DIR:-${HOME:-/home/${USER:-travis}}/.${ghpages_repo}/deploy}"
+echo "--> Preparing deployment in '${localDir}'.."
+mkdir -p "${localDir}"
+
+# Custom steps
+rsync \
+  --archive \
+  --delete \
+  --exclude=.git* \
+  --exclude=node_modules \
+  --exclude=lib \
+  --checksum \
+  --no-times \
+  --no-group \
+  --no-motd \
+  --no-owner \
+./website/public/ "${localDir}" > /dev/null
+
+echo 'This branch is just a deploy target. Do not edit. You changes will be lost.' \
+  |tee "${localDir}/README.md" > /dev/null

+ 0 - 11
bin/travis-deploy

@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-set -o pipefail
-set -o errexit
-set -o nounset
-# set -o xtrace
-
-git config --global user.name 'Uppy Bot'
-git config --global user.email 'uppybot@uppy.io'
-
-# because a Travis deploy script has to be a real file
-npm run web:deploy --quiet

+ 0 - 6
bin/travis-deploy-companion

@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-set -o pipefail
-set -o errexit
-set -o nounset
-
-./packages/@uppy/companion/infra/kube/gcloud-deploy.sh

+ 0 - 46
bin/web-deploy

@@ -1,46 +0,0 @@
-#!/usr/bin/env bash
-set -o pipefail
-set -o errexit
-set -o nounset
-# set -o xtrace
-
-# Set magic variables for current file & dir
-# __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# __file="${__dir}/$(basename "${BASH_SOURCE[0]}")"
-# __base="$(basename ${__file} .sh)"
-
-ghpages_repo=${GHPAGES_REPO:-"transloadit/uppy"}
-ghpages_branch=${GHPAGES_BRANCH:-"gh-pages"}
-ghpages_url=${GHPAGES_URL:-"git@github.com:${ghpages_repo}.git"}
-
-localDir="${HOME:-/home/${USER:-travis}}/.${ghpages_repo}/deploy"
-
-echo "--> Deploying to GitHub pages from '${localDir}'.."
-mkdir -p "${localDir}"
-
-# Custom steps
-rsync \
-  --archive \
-  --delete \
-  --exclude=.git* \
-  --exclude=node_modules \
-  --exclude=lib \
-  --checksum \
-  --no-times \
-  --no-group \
-  --no-motd \
-  --no-owner \
-./website/public/ "${localDir}" > /dev/null
-
-echo 'This branch is just a deploy target. Do not edit. You changes will be lost.' \
-  |tee "${localDir}/README.md" > /dev/null
-
-(cd "${localDir}" \
-  && ([ -d .git ] || git init) && git checkout -B "${ghpages_branch}" && (git pull origin "${ghpages_branch}" || true) && git add --all . \
-  && git commit --allow-empty --no-verify --message="Update ${ghpages_repo} website by ${USER}" \
-  && (git remote add origin "${ghpages_url}"|| true)  \
-  && (git remote set-url origin "${ghpages_url}" || true)  \
-  && (git push origin "${ghpages_branch}:refs/heads/${ghpages_branch}" || git push origin "${ghpages_branch}:refs/heads/${ghpages_branch}" --force) \
-) > /dev/null
-
-# rm -rf "${localDir}"

+ 1 - 1
netlify.toml

@@ -7,4 +7,4 @@ ID = "uppy"
 [context.deploy-preview]
 command = "npx lerna bootstrap && npm run build && npm run web:inject-disc && npm run web:build"
 environment = { NODE_VERSION = "12" }
-publish = "website/public"
+publish = "website/public"

File diff suppressed because it is too large
+ 250 - 373
package-lock.json


+ 2 - 2
package.json

@@ -253,10 +253,10 @@
     "watch:js:lib": "onchange 'packages/{@uppy/,}*/src/**/*.js' --initial --verbose -- npm run build:lib",
     "watch": "npm-run-all --parallel watch:**",
     "web:build-examples": "cd website && node build-examples.js",
-    "web:build": "npm-run-all web:inject-bundles-misc web:generate web:build-examples web:inject-frontpagecodesample",
+    "web:build": "npm-run-all web:inject-disc web:inject-bundles-misc web:generate web:build-examples web:inject-frontpagecodesample",
     "web:bundle-watch-inject": "onchange 'packages/uppy/dist/**/*.css' 'packages/uppy/dist/**/*.js' --initial --verbose -- npm run web:inject-bundles-misc",
     "web:clean": "cd website && touch db.json && ./node_modules/.bin/hexo clean",
-    "web:deploy": "npm-run-all build web:clean web:inject-disc web:build && bash ./bin/web-deploy",
+    "web:prepare-deploy": "bash ./bin/prepare-web-deploy",
     "web:generate": "cd website && touch db.json && ./node_modules/.bin/hexo generate",
     "web:inject-bundles-misc": "cd website && node inject.js",
     "web:inject-disc": "npm run build:lib && node ./bin/disc.js",

+ 9 - 0
packages/@uppy/companion/test/__mocks__/purest.js

@@ -2,6 +2,10 @@ const fs = require('fs')
 const qs = require('querystring')
 const fixtures = require('../fixtures').providers
 
+function has (object, property) {
+  return Object.prototype.hasOwnProperty.call(object, property)
+}
+
 class MockPurest {
   constructor (opts) {
     const methodsToMock = ['query', 'select', 'where', 'auth', 'json', 'options']
@@ -29,6 +33,11 @@ class MockPurest {
       const responses = fixtures[this.opts.providerName].responses
       const url = this._query ? `${this._requestUrl}?${this._query}` : this._requestUrl
       const endpointResponses = responses[url] || responses[this._requestUrl]
+      if (endpointResponses == null || !has(endpointResponses, this._method)) {
+        done(new Error(`No fixture for ${this._method} ${url}`))
+        return
+      }
+
       const body = endpointResponses[this._method]
       done(null, { body, statusCode: 200 }, body)
     }

+ 2 - 2
test/endtoend/wdio.remote.conf.js

@@ -2,8 +2,8 @@ const base = require('./wdio.base.conf')
 
 function createCapability (capability) {
   return {
-    'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,
-    build: process.env.TRAVIS_BUILD_NUMBER,
+    'tunnel-identifier': process.env.SAUCE_TUNNEL_IDENTIFIER,
+    build: process.env.SAUCE_BUILD,
     extendedDebugging: true,
     ...capability
   }

+ 4 - 4
website/package.json

@@ -2,7 +2,7 @@
   "name": "uppy.io",
   "private": true,
   "hexo": {
-    "version": "4.0.0"
+    "version": "4.2.1"
   },
   "dependencies": {
     "@babel/core": "^7.4.4",
@@ -16,7 +16,7 @@
     "drag-drop": "^4.2.0",
     "glob": "^7.1.2",
     "he": "^1.2.0",
-    "hexo": "4.0.0",
+    "hexo": "4.2.1",
     "hexo-browsersync": "^0.3.0",
     "hexo-cli": "3.1.0",
     "hexo-filter-github-emojis": "arturi/hexo-filter-github-emojis",
@@ -32,7 +32,7 @@
     "hexo-renderer-marked": "2.0.0",
     "hexo-renderer-scss": "^1.2.0",
     "hexo-server": "^1.0.0",
-    "hexo-util": "^1.5.0",
+    "hexo-util": "^1.9.1",
     "js-yaml": "^3.13.1",
     "locale-code": "^2.0.2",
     "marked": "^0.7.0",
@@ -44,4 +44,4 @@
     "prismjs": "^1.17.1",
     "watchify": "^3.11.0"
   }
-}
+}

File diff suppressed because it is too large
+ 1 - 1
website/src/disc.html


Some files were not shown because too many files changed in this diff