diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..5dcad372 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + cache: "yarn" + - name: Install dependencies + run: yarn install + - name: Install dependencies for browsers + run: npx playwright install-deps + - name: Run test:examples + run: npx xvfb-maybe yarn run test:examples diff --git a/examples/browser-add-readable-stream/index.html b/examples/browser-add-readable-stream/index.html index fe6ba019..871b66c8 100644 --- a/examples/browser-add-readable-stream/index.html +++ b/examples/browser-add-readable-stream/index.html @@ -9,12 +9,17 @@ + - - + @@ -23,7 +28,7 @@ IPFS logo @@ -73,7 +78,17 @@

Add file

/>
For connecting to a local go-ipfs node, you can check its listening address similar to: @@ -167,11 +155,9 @@

-
- 3. Choose a key: -
+
3. Choose a key:
-
Server Console
diff --git a/examples/browser-ipns-publish/package.json b/examples/browser-ipns-publish/package.json index d3cfbf04..352b3422 100644 --- a/examples/browser-ipns-publish/package.json +++ b/examples/browser-ipns-publish/package.json @@ -13,22 +13,22 @@ }, "license": "MIT", "author": "Doug Anderson", - "main": "dist/index.html", "scripts": { "clean": "rimraf ./dist ./.cache ./.parcel-cache", "build": "parcel build index.html --no-scope-hoist", "serve": "parcel serve index.html --open -p 8888", "start": "npm run serve", - "test:example": "npm run build && playwright test tests" + "test:example": "npm run build && playwright test tests --retries=3" }, "browserslist": "last 1 Chrome version", "dependencies": { "human-crypto-keys": "^0.1.4", - "ipfs": "^0.57.0", - "ipfs-http-client": "^52.0.0", + "ipfs": "^0.58.1", + "ipfs-http-client": "^52.0.1", "ipfs-utils": "^8.1.4", "ipns": "^0.13.3", "it-last": "^1.0.4", + "multihashes": "^4.0.2", "p-retry": "^4.2.0", "uint8arrays": "^2.1.6" }, diff --git a/examples/browser-ipns-publish/public/ipfs-logo.svg b/examples/browser-ipns-publish/public/ipfs-logo.svg new file mode 100644 index 00000000..f8633f62 --- /dev/null +++ b/examples/browser-ipns-publish/public/ipfs-logo.svg @@ -0,0 +1 @@ + diff --git a/examples/browser-ipns-publish/src/index.js b/examples/browser-ipns-publish/src/index.js index 8c50f26a..6d551fec 100644 --- a/examples/browser-ipns-publish/src/index.js +++ b/examples/browser-ipns-publish/src/index.js @@ -12,6 +12,7 @@ const { sha256 } = require('multiformats/hashes/sha2') const WS = require('libp2p-websockets') const transportKey = WS.prototype[Symbol.toStringTag] const filters = require('libp2p-websockets/src/filters') +const mh = require('multihashes') const { sleep, Logger, onEnterPress, catchAndLog } = require("./util"); @@ -204,9 +205,9 @@ async function main() { last(ipfsAPI.name.resolve(keys.id, { stream: false })); // save the pubsub topic to the server to make them listen // set up the topic from ipns key - let b58 = await IPFS.multihash.fromB58String(keys.id); + let b58 = await mh.fromB58String(keys.id); const ipnsKeys = ipns.getIdKeys(b58); - const topic = `${namespace}${uint8ArrayToString(ipnsKeys.routingKey, 'base64url')}`; + const topic = `${namespace}${uint8ArrayToString(ipnsKeys.routingKey._buf, 'base64url')}`; // subscribe and log on both nodes await subs(ipfsBrowser, topic, log); // browserLog diff --git a/examples/browser-ipns-publish/tests/test.js b/examples/browser-ipns-publish/tests/test.js index 1b5e2d4d..88fcddb5 100644 --- a/examples/browser-ipns-publish/tests/test.js +++ b/examples/browser-ipns-publish/tests/test.js @@ -1,138 +1,94 @@ -"use strict"; +'use strict' -const path = require("path"); -const execa = require("execa"); -const { createFactory } = require("ipfsd-ctl"); -const df = createFactory({ - ipfsHttpModule: require("ipfs-http-client"), - ipfsBin: require("go-ipfs").path(), - args: [ - "--enable-pubsub-experiment", - '--enable-namesys-pubsub' - ], - test: true -}); -const { startServer } = require("test-ipfs-example/utils"); -const pkg = require("../package.json"); +const { test, expect } = require('@playwright/test'); +const { playwright } = require('test-util-ipfs-example'); -async function testUI(url, apiAddr, peerAddr, topic) { - const proc = execa( - require.resolve("test-ipfs-example/node_modules/.bin/nightwatch"), - [ - "--config", - require.resolve("test-ipfs-example/nightwatch.conf.js"), - path.join(__dirname, "test.js"), - ], +// Setup +const play = test.extend({ + ...playwright.servers(), + ...playwright.daemons( { - cwd: path.resolve(__dirname, "../"), - env: { - ...process.env, - CI: true, - IPFS_EXAMPLE_TEST_URL: url, - IPFS_API_ADDRESS: apiAddr, - IPFS_PEER_ADDRESS: peerAddr, - IPFS_TOPIC: topic, - }, - all: true, - } - ); - proc.all.on("data", (data) => { - process.stdout.write(data); - }); - - await proc; -} - -async function runTest() { - const app = await startServer(__dirname); - const go = await df.spawn({ - ipfsOptions: { - config: { - Addresses: { - API: "/ip4/127.0.0.1/tcp/0", - Swarm: [ - "/ip4/127.0.0.1/tcp/0/ws" - ] - }, - API: { - HTTPHeaders: { - "Access-Control-Allow-Origin": [app.url], + ipfsHttpModule: require("ipfs-http-client"), + ipfsBin: require("go-ipfs").path(), + args: [ + "--enable-pubsub-experiment", + '--enable-namesys-pubsub' + ], + test: true + }, + {}, + [ + { + ipfsOptions: { + config: { + Addresses: { + API: "/ip4/127.0.0.1/tcp/0", + Swarm: [ + "/ip4/127.0.0.1/tcp/0/ws" + ] + }, + API: { + HTTPHeaders: { + "Access-Control-Allow-Origin": ["*"], + }, + }, }, }, }, - }, - }); + {} + ] + ) +}); - const go2 = await df.spawn(); - await go.api.swarm.connect(go2.api.peerId.addresses[0]); +play.describe('http ipns publish:', () => { + // DOM + const apiSelector = "#api-url:enabled"; + const nodeConnect = "#node-connect"; - const { cid } = await go.api.add(`Some data ${Date.now()}`) - const topic = `/ipfs/${cid}`; + const consoleDOM = "#console" + const peerAddrEnabled = "#peer-addr:enabled" - const peerAddr = go.api.peerId.addresses - .map(addr => addr.toString()) - .filter(addr => addr.includes("/ws/p2p/")) - .pop() + const peerConnect = "#peer-connect" + const topicEnabled = "#topic:enabled" - try { - await testUI( - app.url, - go.apiAddr, - peerAddr, - topic - ); - } finally { - await app.stop(); - await df.clean(); - } -} + const publish = "#publish" -module.exports = runTest; + play.beforeEach(async ({servers, page, daemons}) => { + await daemons[0].api.swarm.connect(await daemons[1].api.peerId.addresses[0]) -module.exports[pkg.name] = function (browser) { - const apiSelector = "#api-url:enabled"; + await page.goto(`http://localhost:${servers[0].port}/`); + }) - // connect to the API - browser - .url(process.env.IPFS_EXAMPLE_TEST_URL) - .waitForElementVisible(apiSelector) - .clearValue(apiSelector) - .setValue(apiSelector, process.env.IPFS_API_ADDRESS) - .pause(1000) - .click("#node-connect"); + play('should connect to IPFS node and publish a file via ipns', async ({ page, daemons}) => { + const goNode = daemons[0]; + const apiAddress = goNode.apiAddr.toString(); - browser.expect - .element("#console") - .text.to.contain(`Connecting to ${process.env.IPFS_API_ADDRESS}\nSuccess!`); + const { cid } = await goNode.api.add(`Some data ${Date.now()}`) + const topic = `/ipfs/${cid}`; - // connect via websocket - const peerAddrSelector = "#peer-addr:enabled"; - browser - .waitForElementVisible(peerAddrSelector) - .clearValue(peerAddrSelector) - .setValue(peerAddrSelector, process.env.IPFS_PEER_ADDRESS) - .pause(1000) - .click("#peer-connect"); + const peerAddr = goNode.api.peerId.addresses + .map(addr => addr.toString()) + .filter(addr => addr.includes("/ws/p2p/")) + .pop() - browser.expect - .element("#console") - .text.to.contain( - `Connecting to peer ${process.env.IPFS_PEER_ADDRESS}\nSuccess!` - ); + await page.waitForSelector(apiSelector); + await page.fill(apiSelector, apiAddress); + await page.click(nodeConnect); + await page.waitForSelector(`${consoleDOM}:has-text('Connecting to ${apiAddress}')`); - // publish to IPNS - const publishSelector = "#topic:enabled"; - browser - .waitForElementVisible(publishSelector) - .clearValue(publishSelector) - .setValue(publishSelector, process.env.IPFS_TOPIC) - .pause(1000) - .click("#publish"); + await page.waitForSelector(peerAddrEnabled); + await page.fill(peerAddrEnabled, peerAddr); + await page.click(peerConnect); + await page.waitForSelector(`${consoleDOM}:has-text('Connecting to peer ${peerAddr}')`); - browser.expect.element("#console").text.to.contain('Publish to IPNS'); - browser.expect.element("#console").text.to.contain('Initial Resolve'); - browser.expect.element("#console").text.to.contain('Published'); - browser.expect.element("#console").text.to.contain(`IPNS Publish Success!`); + await page.waitForSelector(topicEnabled); + await page.fill(topicEnabled, topic); + await page.click(publish); + await page.waitForSelector(`${consoleDOM}:has-text('IPNS Publish Success!')`); - browser.end(); -}; + const consoleContent = await page.textContent(consoleDOM) + expect(consoleContent).toContain('Publish to IPNS') + expect(consoleContent).toContain('Initial Resolve') + expect(consoleContent).toContain('Published') + }); +}); diff --git a/examples/browser-mfs/index.html b/examples/browser-mfs/index.html index 79c79e2b..02696334 100644 --- a/examples/browser-mfs/index.html +++ b/examples/browser-mfs/index.html @@ -9,7 +9,7 @@ - +
{ const ipfs = await IPFS.create({ diff --git a/examples/browser-nextjs/package.json b/examples/browser-nextjs/package.json index a5f34e32..609f594d 100644 --- a/examples/browser-nextjs/package.json +++ b/examples/browser-nextjs/package.json @@ -12,14 +12,16 @@ "test:example": "npm run build && playwright test tests" }, "dependencies": { - "ipfs": "^0.57.0", - "next": "11.0.1", + "ipfs": "^0.58.1", + "next": "11.0.0", "react": "17.0.2", "react-dom": "17.0.2" }, "devDependencies": { - "eslint": "7.30.0", - "eslint-config-next": "11.0.1", + "@playwright/test": "^1.12.3", + "eslint": "7.32.0", + "eslint-config-next": "11.0.0", + "playwright": "^1.12.3", "rimraf": "^3.0.2", "test-util-ipfs-example": "^1.0.0" } diff --git a/examples/browser-parceljs/index.html b/examples/browser-parceljs/index.html index 794d137c..b936bd5e 100644 --- a/examples/browser-parceljs/index.html +++ b/examples/browser-parceljs/index.html @@ -9,12 +9,17 @@ + - - +
@@ -22,7 +27,7 @@ IPFS logo @@ -53,7 +58,17 @@

Add data to IPFS from the browser

/> diff --git a/examples/browser-readablestream/package.json b/examples/browser-readablestream/package.json index 64c3baab..4438ac10 100644 --- a/examples/browser-readablestream/package.json +++ b/examples/browser-readablestream/package.json @@ -5,7 +5,6 @@ "description": "An example of how to play a video in a browser using a readable stream", "license": "ISC", "author": "", - "main": "dist/index.html", "scripts": { "clean": "rimraf ./dist ./.cache ./.parcel-cache", "build": "parcel build index.html --no-scope-hoist", @@ -15,7 +14,7 @@ }, "browserslist": "last 1 Chrome version", "dependencies": { - "ipfs": "^0.57.0", + "ipfs": "^0.58.1", "it-to-stream": "^1.0.0", "videostream": "^3.2.0" }, diff --git a/examples/browser-readablestream/tests/test.js b/examples/browser-readablestream/tests/test.js index ae39aa22..ea8c1ff4 100644 --- a/examples/browser-readablestream/tests/test.js +++ b/examples/browser-readablestream/tests/test.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test'); const { playwright } = require('test-util-ipfs-example'); +const fs = require('fs'); // Setup const play = test.extend({ @@ -12,6 +13,8 @@ play.describe('video readable stream:', () => { // DOM const output = "#output" const container = "#container" + const cid = "#cid" + const goBtn = "#gobutton" play.beforeEach(async ({servers, page}) => { await page.goto(`http://localhost:${servers[0].port}/`); @@ -19,11 +22,21 @@ play.describe('video readable stream:', () => { play('should properly initialized a IPFS node and play an uploaded .mp4', async ({ page }) => { await page.textContent('#output:has-text("IPFS: Ready")') + await page.waitForSelector(container); + const buffer = fs.readFileSync(`${__dirname}/test.mp4`) - await page.waitForSelector(container) + await page.evaluateHandle(([el, buffer]) => { + function toArrayBuffer(buf) { + var ab = new ArrayBuffer(buf.length); + var view = new Uint8Array(ab); + for (var i = 0; i < buf.length; ++i) { + view[i] = buf[i]; + } + return view; + } - await page.evaluateHandle((el) => { const container = document.querySelector(el) + const contentFile = toArrayBuffer(buffer) // fake dropping a file container.ondrop({ @@ -31,754 +44,23 @@ play.describe('video readable stream:', () => { dataTransfer: { items: [{ kind: 'file', + type: "video/mp4", getAsFile: () => { - // actually an .mp4 file, believe it or not - return [ - 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, - 0x69, 0x73, 0x6f, 0x6d, 0x00, 0x00, 0x02, 0x00, - 0x69, 0x73, 0x6f, 0x6d, 0x69, 0x73, 0x6f, 0x32, - 0x61, 0x76, 0x63, 0x31, 0x6d, 0x70, 0x34, 0x31, - 0x00, 0x00, 0x00, 0x08, 0x66, 0x72, 0x65, 0x65, - 0x00, 0x00, 0x0c, 0x0e, 0x6d, 0x64, 0x61, 0x74, - 0x00, 0x00, 0x02, 0xae, 0x06, 0x05, 0xff, 0xff, - 0xaa, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, - 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, - 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, - 0x63, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x35, 0x35, - 0x20, 0x72, 0x32, 0x39, 0x31, 0x37, 0x20, 0x30, - 0x61, 0x38, 0x34, 0x64, 0x39, 0x38, 0x20, 0x2d, - 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, - 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20, 0x41, 0x56, - 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, - 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x6c, 0x65, - 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, - 0x32, 0x30, 0x31, 0x38, 0x20, 0x2d, 0x20, 0x68, - 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, - 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6c, - 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, - 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, - 0x20, 0x2d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x3a, 0x20, 0x63, 0x61, 0x62, 0x61, - 0x63, 0x3d, 0x31, 0x20, 0x72, 0x65, 0x66, 0x3d, - 0x33, 0x20, 0x64, 0x65, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x3d, 0x31, 0x3a, 0x30, 0x3a, 0x30, 0x20, - 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x65, 0x3d, - 0x30, 0x78, 0x33, 0x3a, 0x30, 0x78, 0x31, 0x31, - 0x33, 0x20, 0x6d, 0x65, 0x3d, 0x68, 0x65, 0x78, - 0x20, 0x73, 0x75, 0x62, 0x6d, 0x65, 0x3d, 0x37, - 0x20, 0x70, 0x73, 0x79, 0x3d, 0x31, 0x20, 0x70, - 0x73, 0x79, 0x5f, 0x72, 0x64, 0x3d, 0x31, 0x2e, - 0x30, 0x30, 0x3a, 0x30, 0x2e, 0x30, 0x30, 0x20, - 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x72, 0x65, - 0x66, 0x3d, 0x31, 0x20, 0x6d, 0x65, 0x5f, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x31, 0x36, 0x20, - 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x6d, - 0x65, 0x3d, 0x31, 0x20, 0x74, 0x72, 0x65, 0x6c, - 0x6c, 0x69, 0x73, 0x3d, 0x31, 0x20, 0x38, 0x78, - 0x38, 0x64, 0x63, 0x74, 0x3d, 0x31, 0x20, 0x63, - 0x71, 0x6d, 0x3d, 0x30, 0x20, 0x64, 0x65, 0x61, - 0x64, 0x7a, 0x6f, 0x6e, 0x65, 0x3d, 0x32, 0x31, - 0x2c, 0x31, 0x31, 0x20, 0x66, 0x61, 0x73, 0x74, - 0x5f, 0x70, 0x73, 0x6b, 0x69, 0x70, 0x3d, 0x31, - 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, - 0x71, 0x70, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x3d, 0x2d, 0x32, 0x20, 0x74, 0x68, 0x72, - 0x65, 0x61, 0x64, 0x73, 0x3d, 0x31, 0x20, 0x6c, - 0x6f, 0x6f, 0x6b, 0x61, 0x68, 0x65, 0x61, 0x64, - 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x3d, 0x31, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, - 0x64, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x73, 0x3d, 0x30, 0x20, 0x6e, 0x72, 0x3d, 0x30, - 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x3d, 0x31, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x3d, 0x30, - 0x20, 0x62, 0x6c, 0x75, 0x72, 0x61, 0x79, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x3d, 0x30, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, - 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, - 0x72, 0x61, 0x3d, 0x30, 0x20, 0x62, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x33, 0x20, 0x62, - 0x5f, 0x70, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, - 0x3d, 0x32, 0x20, 0x62, 0x5f, 0x61, 0x64, 0x61, - 0x70, 0x74, 0x3d, 0x31, 0x20, 0x62, 0x5f, 0x62, - 0x69, 0x61, 0x73, 0x3d, 0x30, 0x20, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x3d, 0x31, 0x20, 0x77, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x62, 0x3d, 0x31, - 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x67, 0x6f, - 0x70, 0x3d, 0x30, 0x20, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x70, 0x3d, 0x32, 0x20, 0x6b, 0x65, - 0x79, 0x69, 0x6e, 0x74, 0x3d, 0x32, 0x35, 0x30, - 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74, 0x5f, - 0x6d, 0x69, 0x6e, 0x3d, 0x32, 0x35, 0x20, 0x73, - 0x63, 0x65, 0x6e, 0x65, 0x63, 0x75, 0x74, 0x3d, - 0x34, 0x30, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, - 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x3d, 0x30, 0x20, 0x72, 0x63, 0x5f, 0x6c, 0x6f, - 0x6f, 0x6b, 0x61, 0x68, 0x65, 0x61, 0x64, 0x3d, - 0x34, 0x30, 0x20, 0x72, 0x63, 0x3d, 0x63, 0x72, - 0x66, 0x20, 0x6d, 0x62, 0x74, 0x72, 0x65, 0x65, - 0x3d, 0x31, 0x20, 0x63, 0x72, 0x66, 0x3d, 0x32, - 0x33, 0x2e, 0x30, 0x20, 0x71, 0x63, 0x6f, 0x6d, - 0x70, 0x3d, 0x30, 0x2e, 0x36, 0x30, 0x20, 0x71, - 0x70, 0x6d, 0x69, 0x6e, 0x3d, 0x30, 0x20, 0x71, - 0x70, 0x6d, 0x61, 0x78, 0x3d, 0x36, 0x39, 0x20, - 0x71, 0x70, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x34, - 0x20, 0x69, 0x70, 0x5f, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x3d, 0x31, 0x2e, 0x34, 0x30, 0x20, 0x61, - 0x71, 0x3d, 0x31, 0x3a, 0x31, 0x2e, 0x30, 0x30, - 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x65, 0x88, - 0x84, 0x00, 0xff, 0x70, 0x23, 0x86, 0xe6, 0xd5, - 0xc6, 0x98, 0xae, 0xff, 0x28, 0x19, 0xe0, 0x00, - 0x17, 0x73, 0xa5, 0x8f, 0x1b, 0x73, 0x2a, 0xd3, - 0xef, 0x38, 0x69, 0x38, 0xb7, 0x19, 0x00, 0x00, - 0x00, 0x08, 0x41, 0x9a, 0x24, 0x6c, 0x4f, 0xff, - 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x41, 0x9e, - 0x42, 0x78, 0x8a, 0xff, 0xe6, 0x81, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x9e, 0x61, 0x74, 0x47, 0x7f, - 0xe8, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, - 0x63, 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, - 0x00, 0x0d, 0x41, 0x9a, 0x68, 0x49, 0xa8, 0x41, - 0x68, 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc1, 0x00, - 0x00, 0x00, 0x09, 0x41, 0x9e, 0x86, 0x45, 0x11, - 0x2c, 0x57, 0xe6, 0x81, 0x00, 0x00, 0x00, 0x08, - 0x01, 0x9e, 0xa5, 0x74, 0x47, 0x7f, 0xe8, 0x81, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0xa7, 0x6a, - 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x0d, - 0x41, 0x9a, 0xac, 0x49, 0xa8, 0x41, 0x6c, 0x99, - 0x4c, 0x09, 0xff, 0xfe, 0xc0, 0x00, 0x00, 0x00, - 0x09, 0x41, 0x9e, 0xca, 0x45, 0x15, 0x2c, 0x57, - 0xe6, 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, - 0xe9, 0x74, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x9e, 0xeb, 0x6a, 0x47, 0x7f, - 0xe8, 0x80, 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9a, - 0xf0, 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, - 0xff, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x09, 0x41, - 0x9f, 0x0e, 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x81, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x2d, 0x74, - 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x08, - 0x01, 0x9f, 0x2f, 0x6a, 0x47, 0x7f, 0xe8, 0x80, - 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9b, 0x34, 0x49, - 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, 0xff, 0xfe, - 0xc0, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, 0x52, - 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x81, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x9f, 0x71, 0x74, 0x47, 0x7f, - 0xe8, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, - 0x73, 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, - 0x00, 0x0d, 0x41, 0x9b, 0x78, 0x49, 0xa8, 0x41, - 0x6c, 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc1, 0x00, - 0x00, 0x00, 0x09, 0x41, 0x9f, 0x96, 0x45, 0x15, - 0x2c, 0x57, 0xe6, 0x80, 0x00, 0x00, 0x00, 0x08, - 0x01, 0x9f, 0xb5, 0x74, 0x47, 0x7f, 0xe8, 0x81, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0xb7, 0x6a, - 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x0d, - 0x41, 0x9b, 0xbc, 0x49, 0xa8, 0x41, 0x6c, 0x99, - 0x4c, 0x09, 0xff, 0xfe, 0xc0, 0x00, 0x00, 0x00, - 0x09, 0x41, 0x9f, 0xda, 0x45, 0x15, 0x2c, 0x57, - 0xe6, 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, - 0xf9, 0x74, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x9f, 0xfb, 0x6a, 0x47, 0x7f, - 0xe8, 0x81, 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9b, - 0xe0, 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, - 0x7f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x09, 0x41, - 0x9e, 0x1e, 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x80, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x3d, 0x74, - 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x08, - 0x01, 0x9e, 0x3f, 0x6a, 0x47, 0x7f, 0xe8, 0x81, - 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9a, 0x24, 0x49, - 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, 0x7f, 0xfe, - 0xc0, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, 0x42, - 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x81, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x9e, 0x61, 0x74, 0x47, 0x7f, - 0xe8, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, - 0x63, 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, - 0x00, 0x10, 0x41, 0x9a, 0x68, 0x49, 0xa8, 0x41, - 0x6c, 0x99, 0x4c, 0x09, 0x7f, 0x51, 0x88, 0xd2, - 0xf3, 0xc1, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, - 0x86, 0x45, 0x15, 0x2c, 0x67, 0xe7, 0x81, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9e, 0xa5, 0x74, 0x47, - 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x09, 0x01, - 0x9e, 0xa7, 0x6a, 0x47, 0x7f, 0xec, 0x0d, 0xc0, - 0x00, 0x00, 0x00, 0x10, 0x41, 0x9a, 0xac, 0x49, - 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, 0x7f, 0x55, - 0xea, 0xc9, 0x7c, 0xf8, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9e, 0xca, 0x45, 0x15, 0x2c, 0x67, 0xe7, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0xe9, - 0x74, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x9e, 0xeb, 0x6a, 0x47, 0x7f, 0xec, - 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x41, 0x9a, - 0xef, 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x0b, - 0xff, 0xd6, 0xaf, 0x39, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9f, 0x0d, 0x45, 0x15, 0x2c, 0x67, 0xe7, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x2e, - 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, - 0x0d, 0x41, 0x9b, 0x30, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x09, 0x7f, 0xfe, 0xc0, 0x00, 0x00, - 0x00, 0x16, 0x41, 0x9b, 0x52, 0x49, 0xe1, 0x0a, - 0x52, 0x65, 0x30, 0x51, 0x52, 0xcb, 0xff, 0x55, - 0xdd, 0xad, 0xfa, 0x0e, 0x9c, 0xf9, 0xad, 0x70, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x71, 0x6a, - 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x10, - 0x41, 0x9b, 0x73, 0x49, 0xe1, 0x0e, 0x89, 0x94, - 0xc0, 0x97, 0xff, 0x56, 0x3a, 0xe0, 0xee, 0x60, - 0x00, 0x00, 0x00, 0x0c, 0x41, 0x9b, 0x94, 0x49, - 0xe1, 0x0f, 0x26, 0x53, 0x02, 0x5f, 0xfe, 0xc0, - 0x00, 0x00, 0x00, 0x15, 0x41, 0x9b, 0xb5, 0x49, - 0xe1, 0x0f, 0x26, 0x53, 0x02, 0x5f, 0x51, 0x77, - 0xfc, 0x36, 0xb3, 0xf2, 0xdb, 0x92, 0x30, 0x53, - 0x39, 0x00, 0x00, 0x00, 0x0f, 0x41, 0x9b, 0xd9, - 0x49, 0xe1, 0x0f, 0x26, 0x53, 0x02, 0x5f, 0x56, - 0x1f, 0x73, 0xea, 0x80, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9f, 0xf7, 0x45, 0x11, 0x3c, 0x57, 0xe6, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x16, - 0x74, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9e, 0x18, 0x6a, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x0e, 0x41, 0x9a, 0x1a, - 0x49, 0xa8, 0x41, 0x68, 0x99, 0x4c, 0x09, 0x7f, - 0x5b, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x0d, 0x41, - 0x9a, 0x3b, 0x49, 0xe1, 0x0a, 0x52, 0x65, 0x30, - 0x25, 0xff, 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x17, - 0x41, 0x9a, 0x5d, 0x4b, 0xe1, 0x08, 0x43, 0xa2, - 0x1b, 0x02, 0x15, 0x02, 0x13, 0x01, 0x4d, 0x13, - 0x2f, 0x75, 0x56, 0x14, 0x5b, 0x6b, 0x19, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9e, 0x7c, 0x6a, 0x47, - 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x0e, 0x41, - 0x9a, 0x61, 0x49, 0xe1, 0x0f, 0x26, 0x53, 0x02, - 0x5f, 0x4a, 0x84, 0x28, 0xe0, 0x00, 0x00, 0x00, - 0x09, 0x41, 0x9e, 0x9f, 0x45, 0x11, 0x3c, 0x57, - 0xe6, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, - 0xbe, 0x74, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x9e, 0xa0, 0x6a, 0x47, 0x7f, - 0xe8, 0x80, 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9a, - 0xa5, 0x49, 0xa8, 0x41, 0x68, 0x99, 0x4c, 0x09, - 0x7f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x09, 0x41, - 0x9e, 0xc3, 0x45, 0x11, 0x2c, 0x67, 0xe7, 0x80, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0xe2, 0x74, - 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x08, - 0x01, 0x9e, 0xe4, 0x6a, 0x47, 0x7f, 0xe8, 0x81, - 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9a, 0xe9, 0x49, - 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x0b, 0xff, 0x86, - 0x81, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, 0x07, - 0x45, 0x15, 0x2c, 0x67, 0xe7, 0x81, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x9f, 0x26, 0x74, 0x47, 0x7f, - 0xe8, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, - 0x28, 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, - 0x00, 0x14, 0x41, 0x9b, 0x2d, 0x4b, 0xa8, 0x42, - 0x10, 0x5b, 0x21, 0xf0, 0x3f, 0x50, 0x3f, 0x30, - 0x09, 0x7f, 0x3d, 0x19, 0x01, 0xd9, 0x00, 0x00, - 0x00, 0x0a, 0x41, 0x9f, 0x4b, 0x45, 0x15, 0x2c, - 0x57, 0xf3, 0xc3, 0xa0, 0x00, 0x00, 0x00, 0x08, - 0x01, 0x9f, 0x6a, 0x74, 0x47, 0x7f, 0xe8, 0x80, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x6c, 0x6a, - 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x1f, - 0x41, 0x9b, 0x6f, 0x4b, 0xa8, 0x42, 0x10, 0x5b, - 0x21, 0xf0, 0x3f, 0x34, 0x0f, 0xc5, 0x01, 0x44, - 0xcb, 0xff, 0x51, 0x74, 0x3f, 0xe6, 0xc8, 0xfd, - 0xa4, 0x73, 0x32, 0x04, 0xa6, 0xd4, 0x61, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9f, 0x8e, 0x6a, 0x47, - 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x11, 0x41, - 0x9b, 0x92, 0x49, 0xe1, 0x0a, 0x52, 0x65, 0x30, - 0x25, 0xff, 0x4a, 0xfd, 0xaa, 0xeb, 0x40, 0xc0, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, 0xb0, 0x45, - 0x34, 0x4c, 0x57, 0xe6, 0x80, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9f, 0xd1, 0x6a, 0x47, 0x7f, 0xe8, - 0x81, 0x00, 0x00, 0x00, 0x1b, 0x41, 0x9b, 0xd6, - 0x4b, 0xa8, 0x42, 0x10, 0x5a, 0x21, 0xf0, 0x10, - 0x44, 0x40, 0x41, 0x20, 0x09, 0xff, 0x49, 0xa3, - 0x49, 0x50, 0xd7, 0x64, 0xce, 0x71, 0x65, 0x80, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, 0xf4, 0x45, - 0x11, 0x2c, 0x57, 0xe6, 0x80, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9e, 0x13, 0x74, 0x47, 0x7f, 0xe8, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x15, - 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x13, 0x41, 0x9a, 0x19, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x09, 0xff, 0x57, 0x90, 0x88, 0x48, - 0xec, 0x93, 0x77, 0x81, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9e, 0x37, 0x45, 0x15, 0x2c, 0x67, 0xe7, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x58, - 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x0f, 0x41, 0x9a, 0x5d, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x09, 0xff, 0x59, 0x78, 0xfd, 0x91, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, 0x7b, 0x45, - 0x15, 0x2c, 0x57, 0xe6, 0x80, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9e, 0x9a, 0x74, 0x47, 0x7f, 0xe8, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x9c, - 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, - 0x0d, 0x41, 0x9a, 0x80, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc0, 0x00, 0x00, - 0x00, 0x09, 0x41, 0x9e, 0xbe, 0x45, 0x15, 0x2c, - 0x67, 0xe7, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9e, 0xdf, 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, - 0x00, 0x00, 0x0d, 0x41, 0x9a, 0xc4, 0x49, 0xa8, - 0x41, 0x6c, 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc0, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, 0xe2, 0x45, - 0x15, 0x2c, 0x57, 0xe6, 0x81, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9f, 0x01, 0x74, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x03, - 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, - 0x0d, 0x41, 0x9b, 0x08, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc1, 0x00, 0x00, - 0x00, 0x09, 0x41, 0x9f, 0x26, 0x45, 0x15, 0x2c, - 0x57, 0xe6, 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9f, 0x45, 0x74, 0x47, 0x7f, 0xe8, 0x81, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9f, 0x47, 0x6a, 0x47, - 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x0d, 0x41, - 0x9b, 0x4c, 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, - 0x09, 0xff, 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9f, 0x6a, 0x45, 0x15, 0x2c, 0x57, 0xe6, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x89, - 0x74, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9f, 0x8b, 0x6a, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9b, 0x90, - 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, 0xff, - 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, - 0xae, 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x81, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9f, 0xcd, 0x74, 0x47, - 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9f, 0xcf, 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, - 0x00, 0x00, 0x0d, 0x41, 0x9b, 0xd4, 0x49, 0xa8, - 0x41, 0x6c, 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc0, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, 0xf2, 0x45, - 0x15, 0x2c, 0x67, 0xe7, 0x81, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9e, 0x11, 0x74, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x13, - 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x0d, 0x41, 0x9a, 0x18, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc1, 0x00, 0x00, - 0x00, 0x09, 0x41, 0x9e, 0x36, 0x45, 0x15, 0x2c, - 0x57, 0xe6, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9e, 0x55, 0x74, 0x47, 0x7f, 0xe8, 0x81, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9e, 0x57, 0x6a, 0x47, - 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x0d, 0x41, - 0x9a, 0x5c, 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, - 0x09, 0xff, 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9e, 0x7a, 0x45, 0x15, 0x2c, 0x57, 0xe6, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x99, - 0x74, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9e, 0x9b, 0x6a, 0x47, 0x7f, 0xe8, - 0x81, 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9a, 0x80, - 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, 0xff, - 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, - 0xbe, 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x80, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9e, 0xdd, 0x74, 0x47, - 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9e, 0xdf, 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, - 0x00, 0x00, 0x0d, 0x41, 0x9a, 0xc4, 0x49, 0xa8, - 0x41, 0x6c, 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc0, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, 0xe2, 0x45, - 0x15, 0x2c, 0x67, 0xe7, 0x81, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9f, 0x01, 0x74, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x03, - 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, - 0x0d, 0x41, 0x9b, 0x08, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x09, 0xff, 0xfe, 0xc1, 0x00, 0x00, - 0x00, 0x09, 0x41, 0x9f, 0x26, 0x45, 0x15, 0x2c, - 0x57, 0xe6, 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9f, 0x45, 0x74, 0x47, 0x7f, 0xe8, 0x81, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9f, 0x47, 0x6a, 0x47, - 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x0d, 0x41, - 0x9b, 0x4c, 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, - 0x09, 0x7f, 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9f, 0x6a, 0x45, 0x15, 0x2c, 0x57, 0xe6, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x89, - 0x74, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9f, 0x8b, 0x6a, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9b, 0x90, - 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, 0x7f, - 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, - 0xae, 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x81, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9f, 0xcd, 0x74, 0x47, - 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9f, 0xcf, 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, - 0x00, 0x00, 0x0d, 0x41, 0x9b, 0xd4, 0x49, 0xa8, - 0x41, 0x6c, 0x99, 0x4c, 0x0b, 0xff, 0x86, 0x80, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9f, 0xf2, 0x45, - 0x15, 0x2c, 0x57, 0xe6, 0x81, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9e, 0x11, 0x74, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x13, - 0x6a, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x0d, 0x41, 0x9a, 0x18, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x0f, 0xff, 0x92, 0x81, 0x00, 0x00, - 0x00, 0x09, 0x41, 0x9e, 0x36, 0x45, 0x15, 0x2c, - 0x57, 0xe6, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9e, 0x55, 0x74, 0x47, 0x7f, 0xe8, 0x81, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9e, 0x57, 0x6a, 0x47, - 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, 0x0d, 0x41, - 0x9a, 0x5c, 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, - 0x0a, 0xff, 0x97, 0x80, 0x00, 0x00, 0x00, 0x09, - 0x41, 0x9e, 0x7a, 0x45, 0x15, 0x2c, 0x57, 0xe6, - 0x81, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9e, 0x99, - 0x74, 0x47, 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9e, 0x9b, 0x6a, 0x47, 0x7f, 0xe8, - 0x81, 0x00, 0x00, 0x00, 0x0d, 0x41, 0x9a, 0x80, - 0x49, 0xa8, 0x41, 0x6c, 0x99, 0x4c, 0x09, 0x3f, - 0x9c, 0x81, 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, - 0xbe, 0x45, 0x15, 0x2c, 0x57, 0xe6, 0x80, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x9e, 0xdd, 0x74, 0x47, - 0x7f, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x9e, 0xdf, 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, - 0x00, 0x00, 0x0d, 0x41, 0x9a, 0xc4, 0x49, 0xa8, - 0x41, 0x6c, 0x99, 0x4c, 0x08, 0xaf, 0xb3, 0x80, - 0x00, 0x00, 0x00, 0x09, 0x41, 0x9e, 0xe2, 0x45, - 0x15, 0x2c, 0x57, 0xe6, 0x81, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x9f, 0x01, 0x74, 0x47, 0x7f, 0xe8, - 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x9f, 0x03, - 0x6a, 0x47, 0x7f, 0xe8, 0x81, 0x00, 0x00, 0x00, - 0x0d, 0x41, 0x9b, 0x05, 0x49, 0xa8, 0x41, 0x6c, - 0x99, 0x4c, 0x08, 0xef, 0xbe, 0x81, 0x00, 0x00, - 0x0a, 0xa6, 0x6d, 0x6f, 0x6f, 0x76, 0x00, 0x00, - 0x00, 0x6c, 0x6d, 0x76, 0x68, 0x64, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, - 0x15, 0x9e, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x09, 0xd0, 0x74, 0x72, - 0x61, 0x6b, 0x00, 0x00, 0x00, 0x5c, 0x74, 0x6b, - 0x68, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x24, 0x65, 0x64, 0x74, 0x73, 0x00, 0x00, - 0x00, 0x1c, 0x65, 0x6c, 0x73, 0x74, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x15, 0x9e, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x48, 0x6d, 0x64, - 0x69, 0x61, 0x00, 0x00, 0x00, 0x20, 0x6d, 0x64, - 0x68, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x01, 0x4c, 0x00, 0x55, 0xc4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x68, 0x64, - 0x6c, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0x69, 0x64, 0x65, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x4d, - 0x65, 0x64, 0x69, 0x61, 0x20, 0x56, 0x69, 0x64, - 0x65, 0x6f, 0x00, 0x00, 0x00, 0x08, 0xef, 0x6d, - 0x69, 0x6e, 0x66, 0x00, 0x00, 0x00, 0x14, 0x76, - 0x6d, 0x68, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x24, 0x64, 0x69, 0x6e, 0x66, 0x00, - 0x00, 0x00, 0x1c, 0x64, 0x72, 0x65, 0x66, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x0c, 0x75, 0x72, 0x6c, 0x20, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0xaf, 0x73, - 0x74, 0x62, 0x6c, 0x00, 0x00, 0x00, 0x97, 0x73, - 0x74, 0x73, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x87, 0x61, - 0x76, 0x63, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x31, 0x61, 0x76, 0x63, - 0x43, 0x01, 0x64, 0x00, 0x0a, 0xff, 0xe1, 0x00, - 0x18, 0x67, 0x64, 0x00, 0x0a, 0xac, 0xd9, 0x5f, - 0x9e, 0x22, 0x10, 0x00, 0x00, 0x03, 0x00, 0x10, - 0x00, 0x00, 0x03, 0x03, 0xc0, 0xf1, 0x22, 0x59, - 0x60, 0x01, 0x00, 0x06, 0x68, 0xeb, 0xe3, 0xcb, - 0x22, 0xc0, 0x00, 0x00, 0x00, 0x18, 0x73, 0x74, - 0x74, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x14, 0x73, 0x74, - 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x08, 0x63, 0x74, 0x74, 0x73, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x73, 0x74, 0x73, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x02, 0xac, 0x73, 0x74, - 0x73, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, - 0x02, 0xd6, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x23, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x14, 0x73, 0x74, 0x63, 0x6f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x62, 0x75, 0x64, - 0x74, 0x61, 0x00, 0x00, 0x00, 0x5a, 0x6d, 0x65, - 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x21, 0x68, 0x64, 0x6c, 0x72, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x64, - 0x69, 0x72, 0x61, 0x70, 0x70, 0x6c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2d, 0x69, 0x6c, 0x73, 0x74, 0x00, - 0x00, 0x00, 0x25, 0xa9, 0x74, 0x6f, 0x6f, 0x00, - 0x00, 0x00, 0x1d, 0x64, 0x61, 0x74, 0x61, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4c, - 0x61, 0x76, 0x66, 0x35, 0x38, 0x2e, 0x32, 0x30, - 0x2e, 0x31, 0x30, 0x30 - ] + return new File ([contentFile], 'test.mp4', { + type: "video/mp4" + }) } }] } }) - }, container) + }, [container, [...buffer]]) - const cidValue = "QmPp6XSq2XyLAmZgMvbwhRuwsVdM6mLYpoLzdydyBkakHR" - await page.textContent(container, `#output:has-text(${cidValue})`) + const cidValue = "QmNWXpwJ7mdDeGoDuWo9Axhi2cbhxLm3ateiCY1fvPjaiz" + await page.waitForSelector(`${output}:has-text('${cidValue}')`) - expect(await page.$eval("#cid", el => el.value)).toBe(cidValue) - await page.click("#gobutton") + expect(await page.$eval(cid, el => el.value)).toBe(cidValue) + await page.click(goBtn) - await page.textContent(container, `#output:has-text(Video: canplay)`) + await page.waitForSelector(`${output}:has-text('Playing ${cidValue}')`) }); }); diff --git a/examples/browser-readablestream/tests/test.mp4 b/examples/browser-readablestream/tests/test.mp4 new file mode 100644 index 00000000..5f3a45d8 Binary files /dev/null and b/examples/browser-readablestream/tests/test.mp4 differ diff --git a/examples/browser-script-tag/package.json b/examples/browser-script-tag/package.json index a56dccd9..868d49bf 100644 --- a/examples/browser-script-tag/package.json +++ b/examples/browser-script-tag/package.json @@ -5,7 +5,6 @@ "description": "Using IPFS in the browser via a script tag", "keywords": [], "license": "MIT", - "main": "dist/index.html", "scripts": { "clean": "rimraf ./dist ./.cache ./.parcel-cache", "build": "parcel build index.html --no-scope-hoist", diff --git a/examples/browser-service-worker/package.json b/examples/browser-service-worker/package.json index 591fa430..b6ee687e 100644 --- a/examples/browser-service-worker/package.json +++ b/examples/browser-service-worker/package.json @@ -9,11 +9,12 @@ "clean": "rm -rf ./dist", "build": "webpack", "start": "webpack-dev-server", - "test": "test-ipfs-example" + "test": "test-ipfs-example", + "test:example": "test-ipfs-example" }, "dependencies": { - "ipfs": "^0.57.0", - "ipfs-message-port-client": "^0.8.0", + "ipfs": "^0.58.1", + "ipfs-message-port-client": "^0.8.3", "ipfs-message-port-protocol": "^0.9.0", "ipfs-message-port-server": "^0.9.0", "process": "0.11.10" @@ -22,7 +23,7 @@ "@babel/core": "^7.13.10", "@babel/preset-env": "^7.13.12", "babel-loader": "^8.2.2", - "copy-webpack-plugin": "^8.1.0", + "copy-webpack-plugin": "^9.0.1", "test-ipfs-example": "^3.0.0", "webpack": "^5.28.0", "webpack-cli": "^4.5.0", diff --git a/examples/browser-service-worker/src/worker.js b/examples/browser-service-worker/src/worker.js index 2b35fe6f..891c1660 100644 --- a/examples/browser-service-worker/src/worker.js +++ b/examples/browser-service-worker/src/worker.js @@ -1,7 +1,7 @@ 'use strict' -import IPFS from 'ipfs' -import { Server, IPFSService } from 'ipfs-message-port-server' +const IPFS = require('ipfs') +const { Server, IPFSService } = require('ipfs-message-port-server') const main = async () => { // start listening to all incoming connections - they will be from browsing @@ -15,7 +15,7 @@ const main = async () => { const ipfs = await IPFS.create() // And add hello world for tests await ipfs.add({ content: 'hello world' }) - + // @ts-ignore const service = new IPFSService(ipfs) const server = new Server(service) @@ -36,7 +36,7 @@ const main = async () => { * the given event `type`. It is like `target.addEventListener(type, listener, options)` * but instead of passing listener you get `AsyncIterable` instead. * @param {EventTarget} target - * @param {string} type + * @param {string} type * @param {AddEventListenerOptions} [options] */ const listen = function (target, type, options) { diff --git a/examples/browser-sharing-node-across-tabs/index.html b/examples/browser-sharing-node-across-tabs/index.html index 16322acc..1e90ea6b 100644 --- a/examples/browser-sharing-node-across-tabs/index.html +++ b/examples/browser-sharing-node-across-tabs/index.html @@ -7,7 +7,7 @@ Share IPFS across nodes - +
diff --git a/examples/browser-sharing-node-across-tabs/package.json b/examples/browser-sharing-node-across-tabs/package.json index b47d567b..df126c36 100644 --- a/examples/browser-sharing-node-across-tabs/package.json +++ b/examples/browser-sharing-node-across-tabs/package.json @@ -5,7 +5,6 @@ "description": "Sharing IPFS node across browsing contexts", "keywords": [], "license": "MIT", - "main": "dist/index.html", "scripts": { "clean": "rimraf ./dist ./.cache ./.parcel-cache", "build": "parcel build index.html --no-scope-hoist", @@ -15,8 +14,8 @@ }, "browserslist": "last 1 Chrome version", "dependencies": { - "ipfs": "^0.57.0", - "ipfs-message-port-client": "^0.8.0", + "ipfs": "^0.58.1", + "ipfs-message-port-client": "^0.8.3", "ipfs-message-port-server": "^0.9.0" }, "devDependencies": { diff --git a/examples/browser-sharing-node-across-tabs/src/main.js b/examples/browser-sharing-node-across-tabs/src/main.js index 7840ba7d..48be9cd2 100644 --- a/examples/browser-sharing-node-across-tabs/src/main.js +++ b/examples/browser-sharing-node-across-tabs/src/main.js @@ -32,7 +32,7 @@ window.addEventListener('load', (event) => { const main = async () => { // connect / spawn shared ipfs worker & create a client. - const worker = new SharedWorker(new URL('./worker.js', import.meta.url)) + const worker = new SharedWorker(new URL('./worker.js', import.meta.url), {type: 'module'}) const ipfs = IPFSClient.from(worker.port) const path = location.hash.slice(1) diff --git a/examples/browser-video-streaming/index.html b/examples/browser-video-streaming/index.html index e25f8f1d..73843962 100644 --- a/examples/browser-video-streaming/index.html +++ b/examples/browser-video-streaming/index.html @@ -8,15 +8,10 @@ IPFS with HLS-JS - - - - + +
diff --git a/examples/browser-video-streaming/package.json b/examples/browser-video-streaming/package.json index 286d7518..c4303c50 100644 --- a/examples/browser-video-streaming/package.json +++ b/examples/browser-video-streaming/package.json @@ -5,17 +5,18 @@ "description": "IPFS browser video streaming example", "keywords": [], "license": "MIT", - "main": "dist/index.html", "scripts": { "clean": "rimraf ./dist ./.cache ./.parcel-cache", "build": "parcel build index.html --no-scope-hoist", "serve": "parcel serve index.html --open -p 8888", "start": "npm run serve", - "test:example": "npm run build && playwright test tests --browser=webkit" + "test:example": "npm run build && playwright test tests --browser=firefox --retries=3" }, "browserslist": "last 1 Chrome version", "dependencies": { - "ipfs": "^0.57.0" + "hls.js": "^0.14.17", + "hlsjs-ipfs-loader": "^0.3.0", + "ipfs": "^0.58.1" }, "devDependencies": { "@babel/core": "^7.14.8", diff --git a/examples/browser-video-streaming/src/index.js b/examples/browser-video-streaming/src/index.js index 720f98f0..5db9b99d 100644 --- a/examples/browser-video-streaming/src/index.js +++ b/examples/browser-video-streaming/src/index.js @@ -1,9 +1,9 @@ 'use strict' -const Ipfs = require('ipfs') +import Ipfs from 'ipfs' +import Hls from 'hls.js' +import HlsjsIpfsLoader from 'hlsjs-ipfs-loader' -/* global Hls Ipfs HlsjsIpfsLoader */ -/* eslint-env browser */ document.addEventListener('DOMContentLoaded', async () => { const testHash = 'QmdpAidwAsBGptFB3b6A9Pyi5coEbgjHrL3K2Qrsutmj9K' const repoPath = 'ipfs-' + Math.random() @@ -13,11 +13,17 @@ document.addEventListener('DOMContentLoaded', async () => { Hls.DefaultConfig.debug = false if (Hls.isSupported()) { const video = document.getElementById('video') + const status = document.getElementById('status') const hls = new Hls() hls.config.ipfs = node hls.config.ipfsHash = testHash hls.loadSource('master.m3u8') hls.attachMedia(video) - hls.on(Hls.Events.MANIFEST_PARSED, () => video.play()) + hls.on(Hls.Events.MANIFEST_PARSED, () => { + const node = document.createTextNode("Video ready..."); + status.appendChild(node); + + video.play() + }) } }) diff --git a/examples/browser-video-streaming/tests/test.js b/examples/browser-video-streaming/tests/test.js index e6f18e1a..27fe6fe5 100644 --- a/examples/browser-video-streaming/tests/test.js +++ b/examples/browser-video-streaming/tests/test.js @@ -12,13 +12,13 @@ const play = test.extend({ play.describe('browser videostream:', () => { // DOM - const video = "#video" + const status = "#status" play.beforeEach(async ({servers, page}) => { await page.goto(`http://localhost:${servers[0].port}/`); }) play('should properly initialized a IPFS node and stream a video', async ({ page }) => { - await page.waitForFunction((el) => document.querySelector(el).readyState >= 2, video); + await page.waitForSelector(`${status}:has-text('Video ready')`) }); }); diff --git a/examples/browser-vue/jsconfig.json b/examples/browser-vue/jsconfig.json new file mode 100644 index 00000000..4aafc5f6 --- /dev/null +++ b/examples/browser-vue/jsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "baseUrl": "./", + "moduleResolution": "node", + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + } +} diff --git a/examples/browser-vue/package.json b/examples/browser-vue/package.json index 1728f48a..0e40381b 100644 --- a/examples/browser-vue/package.json +++ b/examples/browser-vue/package.json @@ -1,8 +1,8 @@ { - "name": "example-browser-vue-up", + "name": "example-browser-vue-3", "version": "1.0.0", "private": true, - "description": "A minimal demonstration of how to use js-ipfs using vue cli", + "description": "A minimal demonstration of how to use js-ipfs using vue 3", "scripts": { "clean": "rimraf ./dist", "serve": "vue-cli-service serve", @@ -14,14 +14,15 @@ "browserslist": [ "> 1%", "last 2 versions", - "not dead" + "not dead", + "not ie 11" ], "eslintConfig": { "env": { "node": true }, "parserOptions": { - "parser": "babel-eslint" + "parser": "@babel/eslint-parser" }, "extends": [ "plugin:vue/vue3-essential", @@ -31,19 +32,20 @@ "root": true }, "dependencies": { - "core-js": "^3.6.5", - "ipfs": "^0.57.0", - "vue": "^3.0.0" + "core-js": "^3.8.3", + "ipfs": "^0.58.1", + "vue": "^3.0.4" }, "devDependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", "@playwright/test": "^1.12.3", - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "@vue/compiler-sfc": "^3.0.0", - "babel-eslint": "^10.1.0", - "eslint": "^6.7.2", - "eslint-plugin-vue": "^7.0.0", + "@vue/cli-plugin-babel": "~5.0.0-beta.3", + "@vue/cli-plugin-eslint": "~5.0.0-beta.3", + "@vue/cli-service": "~5.0.0-beta.3", + "@vue/compiler-sfc": "^3.0.4", + "eslint": "^7.20.0", + "eslint-plugin-vue": "^7.2.0", "playwright": "^1.12.3", "rimraf": "^3.0.2", "test-util-ipfs-example": "^1.0.2" diff --git a/examples/browser-vue/src/App.vue b/examples/browser-vue/src/App.vue index 3a7aff8a..815a5b9c 100644 --- a/examples/browser-vue/src/App.vue +++ b/examples/browser-vue/src/App.vue @@ -21,8 +21,8 @@ export default { name: "App", components: { IpfsInfo, - HelloWorld - } + HelloWorld, + }, }; diff --git a/examples/browser-vue/src/components/HelloWorld.vue b/examples/browser-vue/src/components/HelloWorld.vue index 879051a2..2bec451f 100644 --- a/examples/browser-vue/src/components/HelloWorld.vue +++ b/examples/browser-vue/src/components/HelloWorld.vue @@ -2,41 +2,97 @@

{{ msg }}

- For a guide and recipes on how to configure / customize this project,
+ For a guide and recipes on how to configure / customize this project,
check out the - vue-cli documentation. + vue-cli documentation.

Installed CLI Plugins

Essential Links

Ecosystem

diff --git a/examples/browser-vue/tests/test.js b/examples/browser-vue/tests/test.js index d22a6849..d6f9564f 100644 --- a/examples/browser-vue/tests/test.js +++ b/examples/browser-vue/tests/test.js @@ -21,7 +21,7 @@ play.describe('integrate ipfs with vue:', () => { play('should properly initialized a IPFS node and print some information about the node', async ({ page }) => { await page.waitForSelector(info) - expect(await page.textContent(id)).toContain("Qm"); + expect(await page.textContent(id)).not.toBe("") expect(await page.textContent(agent)).toContain("js-ipfs/"); }); }); diff --git a/examples/browser-webpack/package.json b/examples/browser-webpack/package.json index 3f9d7e04..009b58ce 100644 --- a/examples/browser-webpack/package.json +++ b/examples/browser-webpack/package.json @@ -16,7 +16,7 @@ "last 1 Chrome version" ], "dependencies": { - "ipfs": "^0.57.0", + "ipfs": "^0.58.1", "react": "^17.0.2", "react-dom": "^17.0.2" }, @@ -24,11 +24,14 @@ "@babel/core": "^7.13.10", "@babel/preset-env": "^7.13.12", "@babel/preset-react": "^7.12.13", + "@playwright/test": "^1.12.3", "babel-loader": "^8.2.2", "copy-webpack-plugin": "^9.0.1", "css-loader": "^6.2.0", "html-webpack-plugin": "^5.3.2", "node-polyfill-webpack-plugin": "^1.0.4", + "parcel": "latest", + "playwright": "^1.12.3", "react-hot-loader": "^4.12.21", "rimraf": "^3.0.2", "style-loader": "^3.1.0", diff --git a/examples/circuit-relaying/index.html b/examples/circuit-relaying/index.html index 2b017b62..2114a65e 100644 --- a/examples/circuit-relaying/index.html +++ b/examples/circuit-relaying/index.html @@ -10,7 +10,7 @@ content="width=device-width, initial-scale=1, shrink-to-fit=no" /> - +
@@ -51,7 +51,7 @@

IPFS Simple Messaging

- +
diff --git a/examples/circuit-relaying/package.json b/examples/circuit-relaying/package.json index 3296874e..12676c72 100644 --- a/examples/circuit-relaying/package.json +++ b/examples/circuit-relaying/package.json @@ -5,7 +5,6 @@ "description": "IPFS quick msg", "license": "MIT", "author": "Dmitriy Ryajov ", - "main": "dist/index.html", "scripts": { "clean": "rimraf ./dist ./.cache ./.parcel-cache", "deploy": "ipfs add -r --quieter dist", @@ -17,7 +16,7 @@ "browserslist": "last 1 Chrome version", "dependencies": { "delay": "^5.0.0", - "ipfs": "^0.57.0", + "ipfs": "^0.58.1", "ipfs-css": "^1.3.0", "ipfs-pubsub-room": "^2.0.1", "libp2p-websockets": "^0.16.1", @@ -26,8 +25,8 @@ "devDependencies": { "@babel/core": "^7.14.8", "@playwright/test": "^1.12.3", - "fs-extra": "^0.30.0", - "ipfs-http-client": "^52.0.0", + "fs-extra": "^10.0.0", + "ipfs-http-client": "^52.0.1", "parcel": "latest", "playwright": "^1.12.3", "rimraf": "^3.0.2", diff --git a/examples/circuit-relaying/src/app.js b/examples/circuit-relaying/src/app.js index ea8963b3..079bb89c 100644 --- a/examples/circuit-relaying/src/app.js +++ b/examples/circuit-relaying/src/app.js @@ -1,11 +1,11 @@ /* eslint-disable no-console */ 'use strict' -const IPFS = require('ipfs') -const WS = require('libp2p-websockets') -const filters = require('libp2p-websockets/src/filters') +import IPFS from 'ipfs' +import WS from 'libp2p-websockets' +import filters from 'libp2p-websockets/src/filters' +import Helpers from './helpers' const transportKey = WS.prototype[Symbol.toStringTag] -const Helpers = require('./helpers') document.addEventListener('DOMContentLoaded', async () => { const $peerId = document.querySelector('#peer-id') diff --git a/examples/custom-ipfs-repo/package.json b/examples/custom-ipfs-repo/package.json index 7c21ffe5..e1ca5b8d 100644 --- a/examples/custom-ipfs-repo/package.json +++ b/examples/custom-ipfs-repo/package.json @@ -16,7 +16,7 @@ "@ipld/dag-pb": "^2.1.3", "blockstore-datastore-adapter": "^1.0.0", "datastore-fs": "^5.0.2", - "ipfs": "^0.57.0", + "ipfs": "^0.58.1", "ipfs-repo": "^11.0.1", "it-all": "^1.0.4", "multiformats": "^9.4.1" diff --git a/examples/custom-ipld-formats/package.json b/examples/custom-ipld-formats/package.json index deeae75c..651c913f 100644 --- a/examples/custom-ipld-formats/package.json +++ b/examples/custom-ipld-formats/package.json @@ -1,5 +1,5 @@ { - "name": "skipped-example-custom-ipld-formats", + "name": "example-custom-ipld-formats", "version": "1.0.0", "private": true, "license": "MIT", @@ -11,9 +11,9 @@ }, "dependencies": { "dag-jose": "^1.0.0", - "ipfs-core": "^0.9.1", - "ipfs-daemon": "^0.8.1", - "ipfs-http-client": "^52.0.0", + "ipfs-core": "^0.10.3", + "ipfs-daemon": "^0.9.3", + "ipfs-http-client": "^52.0.1", "multiformats": "^9.4.1", "uint8arrays": "^2.1.6" }, diff --git a/examples/custom-libp2p/index.js b/examples/custom-libp2p/index.js index aebc92bc..c1ef89bf 100644 --- a/examples/custom-libp2p/index.js +++ b/examples/custom-libp2p/index.js @@ -7,7 +7,7 @@ const MulticastDNS = require('libp2p-mdns') const Bootstrap = require('libp2p-bootstrap') const KadDHT = require('libp2p-kad-dht') const MPLEX = require('libp2p-mplex') -const { NOISE } = require('libp2p-noise') +const { NOISE } = require('@chainsafe/libp2p-noise') /** * Options for the libp2p bundle diff --git a/examples/custom-libp2p/package.json b/examples/custom-libp2p/package.json index a4740201..d1d9b4cd 100644 --- a/examples/custom-libp2p/package.json +++ b/examples/custom-libp2p/package.json @@ -12,14 +12,14 @@ "test:example": "node tests/test.js" }, "dependencies": { - "ipfs": "^0.57.0", + "@chainsafe/libp2p-noise": "^4.0.0", + "ipfs": "^0.58.1", "libp2p": "^0.32.0", - "libp2p-bootstrap": "^0.12.3", + "libp2p-bootstrap": "^0.13.0", "libp2p-kad-dht": "^0.23.1", - "libp2p-mdns": "^0.16.0", + "libp2p-mdns": "^0.17.0", "libp2p-mplex": "^0.10.2", - "libp2p-noise": "^3.0.0", - "libp2p-tcp": "^0.15.4" + "libp2p-tcp": "^0.17.1" }, "devDependencies": { "test-util-ipfs-example": "^1.0.2" diff --git a/examples/custom-libp2p/tests/test.js b/examples/custom-libp2p/tests/test.js index 745c886d..54597ca7 100644 --- a/examples/custom-libp2p/tests/test.js +++ b/examples/custom-libp2p/tests/test.js @@ -5,7 +5,7 @@ const { node } = require('test-util-ipfs-example'); const Libp2p = require('libp2p') const TCP = require('libp2p-tcp') const MPLEX = require('libp2p-mplex') -const { NOISE } = require('libp2p-noise') +const { NOISE } = require('@chainsafe/libp2p-noise') const PeerId = require('peer-id') const uint8ArrayToString = require('uint8arrays/to-string') diff --git a/examples/http-client-browser-pubsub/index.html b/examples/http-client-browser-pubsub/index.html index 85ea0e63..c7f7dc00 100644 --- a/examples/http-client-browser-pubsub/index.html +++ b/examples/http-client-browser-pubsub/index.html @@ -10,10 +10,15 @@ + - - +
@@ -21,7 +26,7 @@

@@ -58,9 +63,7 @@

-
- Subscribe to pubsub topic -
+
Subscribe to pubsub topic
Console
diff --git a/examples/http-client-browser-pubsub/package.json b/examples/http-client-browser-pubsub/package.json index e58bea42..844b16a4 100644 --- a/examples/http-client-browser-pubsub/package.json +++ b/examples/http-client-browser-pubsub/package.json @@ -5,7 +5,6 @@ "description": "An example demonstrating pubsub in the browser", "license": "MIT", "author": "Alan Shaw", - "main": "dist/index.html", "scripts": { "clean": "rimraf ./dist ./.cache ./.parcel-cache", "build": "parcel build index.html --no-scope-hoist", @@ -15,13 +14,13 @@ }, "browserslist": "last 1 Chrome version", "dependencies": { - "ipfs-http-client": "^52.0.0" + "ipfs-http-client": "^52.0.1" }, "devDependencies": { "@babel/core": "^7.14.8", "@playwright/test": "^1.12.3", "go-ipfs": "0.9.1", - "ipfs": "^0.57.0", + "ipfs": "^0.58.1", "parcel": "latest", "playwright": "^1.12.3", "rimraf": "^3.0.2", diff --git a/examples/http-client-browser-pubsub/src/index.js b/examples/http-client-browser-pubsub/src/index.js index 64867e72..b671e9cf 100644 --- a/examples/http-client-browser-pubsub/src/index.js +++ b/examples/http-client-browser-pubsub/src/index.js @@ -1,8 +1,8 @@ 'use strict' -const { create: IpfsHttpClient } = require('ipfs-http-client') -const { sleep, Logger, onEnterPress, catchAndLog } = require('./util') -const uint8ArrayToString = require('uint8arrays/to-string') +import { create as IpfsHttpClient } from 'ipfs-http-client' +import { sleep, Logger, onEnterPress, catchAndLog } from './util' +import uint8ArrayToString from 'uint8arrays/to-string' async function main () { const apiUrlInput = document.getElementById('api-url') diff --git a/examples/http-client-browser-pubsub/src/util.js b/examples/http-client-browser-pubsub/src/util.js index e6aada61..c9f6ecbf 100644 --- a/examples/http-client-browser-pubsub/src/util.js +++ b/examples/http-client-browser-pubsub/src/util.js @@ -1,6 +1,6 @@ -exports.sleep = (ms = 1000) => new Promise(resolve => setTimeout(resolve, ms)) +const sleep = (ms = 1000) => new Promise(resolve => setTimeout(resolve, ms)) -exports.Logger = outEl => { +const Logger = outEl => { outEl.innerHTML = '' return message => { const container = document.createElement('div') @@ -10,7 +10,7 @@ exports.Logger = outEl => { } } -exports.onEnterPress = fn => { +const onEnterPress = fn => { return e => { if (event.which == 13 || event.keyCode == 13) { e.preventDefault() @@ -19,7 +19,7 @@ exports.onEnterPress = fn => { } } -exports.catchAndLog = (fn, log) => { +const catchAndLog = (fn, log) => { return async (...args) => { try { await fn(...args) @@ -29,3 +29,10 @@ exports.catchAndLog = (fn, log) => { } } } + +export { + sleep, + Logger, + onEnterPress, + catchAndLog +} diff --git a/examples/http-client-bundle-webpack/package.json b/examples/http-client-bundle-webpack/package.json index 2452221c..5fd4cd64 100644 --- a/examples/http-client-bundle-webpack/package.json +++ b/examples/http-client-bundle-webpack/package.json @@ -17,7 +17,7 @@ "last 1 Chrome version" ], "dependencies": { - "ipfs-http-client": "^52.0.0", + "ipfs-http-client": "^52.0.1", "react": "^17.0.2", "react-dom": "^17.0.2" }, @@ -25,12 +25,14 @@ "@babel/core": "^7.13.14", "@babel/preset-env": "^7.13.12", "@babel/preset-react": "^7.13.13", + "@playwright/test": "^1.12.3", "babel-loader": "^8.2.2", - "copy-webpack-plugin": "^8.1.0", + "copy-webpack-plugin": "^9.0.1", "css-loader": "^6.2.0", "html-webpack-plugin": "^5.3.1", - "ipfs": "^0.57.0", + "ipfs": "^0.58.1", "node-polyfill-webpack-plugin": "^1.0.3", + "playwright": "^1.12.3", "react-hot-loader": "^4.12.21", "rimraf": "^3.0.2", "style-loader": "^3.1.0", diff --git a/examples/http-client-name-api/index.html b/examples/http-client-name-api/index.html index 159afaa3..fda54ebe 100644 --- a/examples/http-client-name-api/index.html +++ b/examples/http-client-name-api/index.html @@ -9,11 +9,16 @@ + - - +