commit 9690121403d3afc6654cc01fb35af33046392280 Author: Ching Date: Wed Feb 2 19:04:18 2022 +0800 feat(init project): add all existing files add all existing files Signed-off-by: Ching diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1dd2219 --- /dev/null +++ b/.gitignore @@ -0,0 +1,132 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +.deploy_git/ diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..063b0e4 --- /dev/null +++ b/.npmignore @@ -0,0 +1,7 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ \ No newline at end of file diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..8fd74d5 --- /dev/null +++ b/_config.yml @@ -0,0 +1,90 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: MarkDown +subtitle: 「靡不有初,鲜克有终」 +description: +author: Ching +language: zh-CN +timezone: Asia/Shanghai + +# URL +## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' +url: http://blog.tunpok.com/ +root: / +permalink: :year/:month/:day/:title/ +permalink_defaults: + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :year-:month-:day-:title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: true # Open external links in new tab +filename_case: 0 +render_drafts: false +post_asset_folder: false +relative_link: false +future: true +highlight: + enable: true + line_number: true + auto_detect: false + tab_replace: + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +theme: apollo +# theme: cactus + +# Deployment +## Docs: https://hexo.io/docs/deployment.html +# deploy: +# type: git +# repo: https://github.com/looching/looching.github.io + + +deploy: + type: rsync + host: 104.238.151.113 + user: captain + root: /var/www/tunpok-blog + port: 22 # Default is 22 + delete: true # Default is true + verbose: true # Default is true + ignore_errors: false # Default is false + +mathjax: + tags: none # or 'ams' or 'all' + single_dollars: true # enable single dollar signs as in-line math delimiters + cjk_width: 0.9 # relative CJK char width + normal_width: 0.6 # relative normal (monospace) width diff --git a/db.json b/db.json new file mode 100644 index 0000000..69b95ed --- /dev/null +++ b/db.json @@ -0,0 +1 @@ +{"meta":{"version":1,"warehouse":"2.2.0"},"models":{"Asset":[{"_id":"source/CNAME","path":"CNAME","modified":0,"renderable":0},{"_id":"themes/apollo/source/favicon.png","path":"favicon.png","modified":0,"renderable":1},{"_id":"themes/apollo/source/logo.png","path":"logo.png","modified":0,"renderable":1},{"_id":"themes/apollo/source/scss/apollo.scss","path":"scss/apollo.scss","modified":0,"renderable":1},{"_id":"themes/apollo/source/css/apollo.css","path":"css/apollo.css","modified":0,"renderable":1}],"Cache":[{"_id":"source/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1526396315000},{"_id":"themes/apollo/.DS_Store","hash":"695101ad11d1cb210f2667e7bdcdccd7e40391de","modified":1586364749000},{"_id":"themes/apollo/.gitignore","hash":"a006beea0877a0aa3610ee00e73f62cb1d45125b","modified":1526396315000},{"_id":"themes/apollo/README.md","hash":"a6930c691c69ed78584022fbcd0f4245587d09f5","modified":1526396315000},{"_id":"themes/apollo/LICENSE","hash":"6e31ac9076bfc8f09ae47977419eee4edfb63e5b","modified":1526396315000},{"_id":"themes/apollo/_config.yml","hash":"0564002d6a750856deec82fb89f6b2cb41d0a294","modified":1587446398000},{"_id":"themes/apollo/gulpfile.js","hash":"857a026b6643a2cd52c65d4ae0dc7fe9618206ee","modified":1526396315000},{"_id":"themes/apollo/package.json","hash":"9426138c09ebb95969021d951590c0c54b187a43","modified":1526396315000},{"_id":"source/.MWebMetaData/setting.json","hash":"63037ec4e43ae67cbe98b4f81451eef32dccf232","modified":1573529113000},{"_id":"source/_posts/2020-03-17-leetcode-121.md","hash":"62aa9ec2e2aa784728c189d4d7145ebab1380ae3","modified":1584442443000},{"_id":"source/_posts/2018-05-31-bash-function-and-awk.md","hash":"e9e89d931fd9652c4fc39ac49db953d15e55c19c","modified":1573718510000},{"_id":"source/_posts/2019-11-14-AWS-KMS.md","hash":"519de77de3ffdcc67169130e36f8c53e20f3b2b6","modified":1573718604000},{"_id":"source/_posts/2020-03-18-leetcode-206.md","hash":"c80133bf68fc993ddc24517da4bc226764ae2a40","modified":1584546252000},{"_id":"source/_posts/2020-03-23-leetcode-225.md","hash":"aff4492c0c07d0d31b0313b5ef9378279233141b","modified":1584977724000},{"_id":"source/_posts/2020-03-23-leetcode-169.md","hash":"f193c41627501ed7235459d5ad40fd3d6ebf0a71","modified":1584976429000},{"_id":"source/_posts/2020-03-25-leetcode-409.md","hash":"f0e210e4da442e66e4436f7055f673c4655907f0","modified":1585144554000},{"_id":"source/_posts/2020-03-25-leetcode-543.md","hash":"a6e406e0bca5aa834c99625f74ee38ae87324b7f","modified":1586878193000},{"_id":"source/_posts/2020-03-25-leetcode-836.md","hash":"cc9e68c7e2ea013086e1d6ae0c2b212c60cac573","modified":1585147304000},{"_id":"source/_posts/2020-03-29-leetcode-1013.md","hash":"4937a632273d945e4f258ef96d6ca8c2d8fe9f5b","modified":1585487711000},{"_id":"source/_posts/2020-03-26-leetcode-876.md","hash":"4905be27ad818ebc81d3938227d31d760c5631c4","modified":1585228750000},{"_id":"source/_posts/2020-03-29-leetcode-914.md","hash":"a0631cf342a08f5ff9ad4d0ca2bf8372dca60ecc","modified":1585493527000},{"_id":"source/_posts/2020-03-30-leetcode-1071.md","hash":"affa6c07b877b5fa46873eca5ca300db4f24efb6","modified":1585577057000},{"_id":"source/_posts/2020-03-30-leetcode-999.md","hash":"41bd6e2ce8483d5d158b88d28ee63ec1551ca10a","modified":1585573421000},{"_id":"source/_posts/2020-04-01-leetcode-1103.md","hash":"c76f58bceaa6aafb010e7163f3ef893573c2a45f","modified":1586366247000},{"_id":"source/_posts/2020-04-01-leetcode-1160.md","hash":"bb2daed56d6bfb2cd930afb2e3c9b0ebb6e597bd","modified":1585727826000},{"_id":"source/_posts/2020-04-01-leetcode-compress-string-lcci.md","hash":"254b0bffa89a3d5711f8b3f45f1d05f23f27fac9","modified":1585727846000},{"_id":"source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md","hash":"d1801e8c1bfff064a59cd43bc800226a193ef6b0","modified":1586878180000},{"_id":"source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md","hash":"ebed1ea3f1229f6109e812cbb0f7e203f7312e0b","modified":1586878115000},{"_id":"source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md","hash":"914948de11976b4d0db287c5beb1f4e40b71f7a7","modified":1586366044000},{"_id":"source/_posts/2020-04-16-leetcode-01-matrix.md","hash":"e29a270941ba47ad981089856d75640cc468f956","modified":1587011216000},{"_id":"source/_posts/2020-04-14-leetcode-design-twitter.md","hash":"f5e5079109ad996244e2cd9ed7a23976b6fd872c","modified":1586878174000},{"_id":"source/_posts/2020-04-16-leetcode-merge-intervals.md","hash":"4c8e56c27ec095f80ab803a819c83d60ffb6c697","modified":1587036168000},{"_id":"source/_posts/2020-04-21-leetcode-number-of-islands.md","hash":"766d66e49da9072f4e8afa0229b744e9407eed7a","modified":1587444946000},{"_id":"source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md","hash":"903c766c73dd8ed9d1baf081b113113eef0740fa","modified":1587038200000},{"_id":"source/_posts/Postgresql Partitioning.md","hash":"63d88ca7c739c3153d63c7ca0f03c7fbc6708bb0","modified":1573718510000},{"_id":"source/_posts/Django-Manager-Method.md","hash":"5d83851ffbe6d2077a87ef66a7c11e1b13546c1f","modified":1526396315000},{"_id":"source/_posts/Flask-Day-1.md","hash":"19976eabe8d244b085108beb57116b81cabcc693","modified":1526396315000},{"_id":"source/_posts/Flask-Day-2.md","hash":"fea0129a559b2e76aa6927d5df528acd357fe3c9","modified":1526396315000},{"_id":"source/_posts/Tastypie.md","hash":"9b9d53979b98fcdca24c2ad8dc8a78c1dc77a665","modified":1526396315000},{"_id":"source/_posts/first-post.md","hash":"0cfe954d5b7b12d46dd20fe43e95835b89b30163","modified":1526396315000},{"_id":"themes/apollo/.git/HEAD","hash":"acbaef275e46a7f14c1ef456fff2c8bbe8c84724","modified":1526396315000},{"_id":"source/_posts/TastyPie-Note-1.md","hash":"843365f5f5b6142bba6ea900818d19848e3f070b","modified":1526396315000},{"_id":"themes/apollo/.git/config","hash":"e8486e77527181934f2dda23e50b879ab7641244","modified":1526396315000},{"_id":"themes/apollo/.git/description","hash":"9635f1b7e12c045212819dd934d809ef07efa2f4","modified":1526396315000},{"_id":"themes/apollo/.git/index","hash":"3aafcb5c0dca1df92022e4f3167231547c5e79e0","modified":1527846627000},{"_id":"themes/apollo/.git/packed-refs","hash":"0b13c31fe5e09d24b87c9bb547eaa0645fbfd2dc","modified":1526396315000},{"_id":"themes/apollo/doc/doc-en.md","hash":"1bccce1d01f085aedcb01317d2db23ca61351f13","modified":1526396315000},{"_id":"themes/apollo/languages/zh-cn.yml","hash":"9e4b03e14c094000257ea254fd660dde4c7af63c","modified":1526396315000},{"_id":"themes/apollo/doc/doc-zh.md","hash":"3aad2ed65922f6f5dd9731301195474d16a8a9be","modified":1526396315000},{"_id":"themes/apollo/languages/en.yml","hash":"65998758dd27a350b6d4f2dc803970a9c89978da","modified":1526396315000},{"_id":"themes/apollo/layout/index.jade","hash":"58c451042cad5beeb5a76852bba609c651ff3428","modified":1526396315000},{"_id":"themes/apollo/source/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1526399879000},{"_id":"themes/apollo/source/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1526396315000},{"_id":"themes/apollo/layout/post.jade","hash":"33ab46ab3736e5d51388939858647942ce375b9b","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/commit-msg.sample","hash":"ee1ed5aad98a435f2020b6de35c173b75d9affac","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/applypatch-msg.sample","hash":"86b9655a9ebbde13ac8dd5795eb4d5b539edab0f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/post-update.sample","hash":"b614c2f63da7dca9f1db2e7ade61ef30448fc96c","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-commit.sample","hash":"36aed8976dcc08b5076844f0ec645b18bc37758f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-applypatch.sample","hash":"42fa41564917b44183a50c4d94bb03e1768ddad8","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-push.sample","hash":"b4ad74c989616b7395dc6c9fce9871bb1e86dfb5","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/prepare-commit-msg.sample","hash":"2b6275eda365cad50d167fe3a387c9bc9fedd54f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-rebase.sample","hash":"5885a56ab4fca8075a05a562d005e922cde9853b","modified":1526396315000},{"_id":"themes/apollo/.git/info/exclude","hash":"c879df015d97615050afa7b9641e3352a1e701ac","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/update.sample","hash":"39355a075977d05708ef74e1b66d09a36e486df1","modified":1526396315000},{"_id":"themes/apollo/.git/logs/HEAD","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"themes/apollo/layout/mixins/paginator.jade","hash":"f4ee2fb61a32e199b48cf93771749edc8a007391","modified":1526396315000},{"_id":"themes/apollo/layout/mixins/post.jade","hash":"e3c78a617191a2feafd360a5ddbc5cceeae4cf21","modified":1526396315000},{"_id":"themes/apollo/layout/partial/head.jade","hash":"51b2ba6a1cebb275730eb7131eea211c91f0986a","modified":1526396315000},{"_id":"themes/apollo/layout/partial/copyright.jade","hash":"2e2ee43c7241279a32b8c1386a2dea1409ef0e1c","modified":1526396315000},{"_id":"themes/apollo/layout/partial/comment.jade","hash":"ff0a2c269c2434da2ac5529872f1d6184a71f96d","modified":1526396315000},{"_id":"themes/apollo/layout/partial/layout.jade","hash":"d596c281bbba02cf8837f25f8ac0ac06e3d10e72","modified":1526396315000},{"_id":"themes/apollo/layout/partial/nav.jade","hash":"c35d3061da4b053b73150d9741c542d660798270","modified":1526396315000},{"_id":"themes/apollo/source/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1526396315000},{"_id":"themes/apollo/layout/partial/scripts.jade","hash":"4c83fec1e2fc5cffefafc2e31835e28122c0fdfd","modified":1526396315000},{"_id":"themes/apollo/source/css/apollo.css","hash":"3769b55e027697d6d163ddf82b664b16c767ba9c","modified":1526396315000},{"_id":"themes/apollo/.git/objects/pack/pack-35ea6b850205f59708ed992c93c7cea2251cc278.idx","hash":"6a8c6fe9f118fb534f32f6c5d4811ef895340eba","modified":1526396315000},{"_id":"themes/apollo/.git/refs/heads/master","hash":"d32e5811a7e998bca04209572d5265585c606fdb","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/base.scss","hash":"88b361e68475caddbab763feed5e1db788ac2cd7","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/copyright.scss","hash":"7fc843c37a4dbf9f6e70770398841a73465ec642","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/footer.scss","hash":"094aca6e52f11b139ac7980ca03fa7b9d8fc7b2f","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/header.scss","hash":"d24cc6520f3faa7bb80610b858a92639eadcc289","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/home-post-list.scss","hash":"92858015b8f3dcb4eb91b6dc41563b7aaa91b376","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/mq.scss","hash":"0b9c7097136ac8e4a07d9702fc4dbe0345ac7596","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/post.scss","hash":"3ba64c410edd07e7bf5e9900d9ad9d76f2ff5828","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/normalize.scss","hash":"fd0b27bed6f103ea95b08f698ea663ff576dbcf1","modified":1526396315000},{"_id":"themes/apollo/.git/logs/refs/heads/master","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"themes/apollo/.git/refs/remotes/origin/HEAD","hash":"d9427cda09aba1cdde5c69c2b13c905bddb0bc51","modified":1526396315000},{"_id":"themes/apollo/.git/objects/pack/pack-35ea6b850205f59708ed992c93c7cea2251cc278.pack","hash":"b17d2960aef474cbff89c4c250ecaffff7c4790c","modified":1526396315000},{"_id":"themes/apollo/.git/logs/refs/remotes/origin/HEAD","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"public/atom.xml","hash":"a586321e90ce8456a406696b75b6c9bb17404570","modified":1587444952445},{"_id":"public/sitemap.xml","hash":"d316f7e351e88d31b23877fd010cb44b8087c840","modified":1587444952445},{"_id":"public/archives/index.html","hash":"fe7770520a4482f260261ffeff1bbee3299b8a23","modified":1587446402798},{"_id":"public/archives/2020/index.html","hash":"251bc2a11c2e05f962224521db20f4e220573608","modified":1587446402799},{"_id":"public/archives/2020/page/3/index.html","hash":"29030651310410cb57239babf6e003a2fdd6e980","modified":1587446402799},{"_id":"public/archives/page/2/index.html","hash":"9e6b4caccf0e9b14c1328a18fa946a8bfba6f2a3","modified":1587446402799},{"_id":"public/archives/2020/03/index.html","hash":"234393043bcd67e4e8efcc18f8b216277df715b0","modified":1587446402799},{"_id":"public/archives/2020/04/index.html","hash":"eb1fb49123a961d0927bc97b5074b0c9da56841b","modified":1587446402799},{"_id":"public/categories/leetcode/index.html","hash":"5fa307b686bfb8d48b609df293f9c817262352c1","modified":1587446402799},{"_id":"public/categories/leetcode/page/3/index.html","hash":"6ca07e52142b74cfbf2848d2c176b7e8fd0cad15","modified":1587446402799},{"_id":"public/index.html","hash":"5bf276e85ab585ee24e3cd01bf7b29508112d3b3","modified":1587446402800},{"_id":"public/page/2/index.html","hash":"4be6e473c0a3556143362acf12d9c6853ff1d1b7","modified":1587446402800},{"_id":"public/archives/2020/page/2/index.html","hash":"7959aa328aeb2c26a7b067bcab175c7447bc9986","modified":1587446402799},{"_id":"public/archives/2020/03/page/2/index.html","hash":"de542e40de5442276152044a8a79b57e334b6f3f","modified":1587446402799},{"_id":"public/categories/leetcode/page/2/index.html","hash":"7333305ab06f4d1b1a2b2a5402434bd74727c1f6","modified":1587446402799},{"_id":"public/2020/04/16/leetcode-string-to-integer-atoi/index.html","hash":"5aab7acb06a04909d65f2b37791fe020ac6b4b34","modified":1587446402800},{"_id":"public/2020/04/16/leetcode-01-matrix/index.html","hash":"a59789fc1b8e3e63ae66c5fe582eafd3d4bf2cf1","modified":1587446402800},{"_id":"public/2020/04/16/leetcode-merge-intervals/index.html","hash":"fe43c579b065f030836acf7adf640709bc382339","modified":1587446402800},{"_id":"public/2020/04/14/leetcode-design-twitter/index.html","hash":"4b22f200f0d627c187aa57b18192c1cf46bff91c","modified":1587446402800},{"_id":"public/2020/04/14/leetcode-add-two-numbers-ii/index.html","hash":"1cf8ed5b32d2522f46e1dbf33b351ccb2469de70","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-1103/index.html","hash":"9df68a878761dd1c23aee8cff693137fba062b42","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-compress-string-lcci/index.html","hash":"1692319e76fdba90f4a4835d07dd68956f2385d5","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-1160/index.html","hash":"0f1c09bb7ac1e6a4ee43d6d729baa7e14fb75f8b","modified":1587446402800},{"_id":"public/2020/03/30/leetcode-999/index.html","hash":"bfb9f5ef24d32860c804e02028a3ec472a7f5c81","modified":1587446402800},{"_id":"public/2020/03/30/leetcode-1071/index.html","hash":"4dd54070b7ced7e45cee66a81a61d329600ffde5","modified":1587446402800},{"_id":"public/2020/03/26/leetcode-876/index.html","hash":"d08a6ebc25c304fdbb77cf5efbff3e3a9c66639e","modified":1587446402800},{"_id":"public/2020/03/29/leetcode-1013/index.html","hash":"68403102195d2c4b807802fc26419888c65b1cba","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-543/index.html","hash":"b94a9b3f588cc5e11f6551737c753a1e2adf307e","modified":1587446402801},{"_id":"public/2020/03/29/leetcode-914/index.html","hash":"de4191f15d4a12e822c66b6d0196ee83482519a9","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-836/index.html","hash":"66f352798839414ea29c6118f75d5af739c9d182","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-409/index.html","hash":"41d70012826b76c402daba4f6875a9b52e55264e","modified":1587446402800},{"_id":"public/2020/03/17/leetcode-121/index.html","hash":"9c27e8c6c17fa24951b9857e5695c116df14b4d9","modified":1587446402801},{"_id":"public/2020/03/23/leetcode-169/index.html","hash":"ce2379b39051685a8e32a853d788517568dc4d5a","modified":1587446402801},{"_id":"public/2020/03/23/leetcode-225/index.html","hash":"73855dc29fed498d3c597a0e859001a611d3c47e","modified":1587446402801},{"_id":"public/2018/05/31/bash-function-and-awk/index.html","hash":"e8123f624cdce6ac8c87574232f17de4bd545fa3","modified":1587446402801},{"_id":"public/2019/03/12/Postgresql-Partitioning/index.html","hash":"a280187102a2eeeb1ef3a01a1aa51d4472b93622","modified":1587446402801},{"_id":"public/2019/11/14/AWS-KMS/index.html","hash":"ed7730b48b5c308a09e34064dada6c739b168649","modified":1587446402801},{"_id":"public/2016/05/04/Tastypie/index.html","hash":"b2279db518bc33249f19423ac18d92c4e516c9a6","modified":1587446402801},{"_id":"public/2016/04/25/Django-Manager-Method/index.html","hash":"5e97665a188021701f6904c80457a774ab7161dc","modified":1587446402801},{"_id":"public/2016/02/16/Flask-Day-2/index.html","hash":"b190b4056ab4d2b631a753ad4dec89e04e50e295","modified":1587446402801},{"_id":"public/2020/03/18/leetcode-206/index.html","hash":"867d48227994566c3bee90c1ea41bc05d8fd96f5","modified":1587446402801},{"_id":"public/2016/02/12/first-post/index.html","hash":"d9dfb8c5405c1df371cbadc058d7ea37735cf332","modified":1587446402801},{"_id":"public/2016/05/10/TastyPie-Note-1/index.html","hash":"ff6cb06b7bc1b9e4ea87caa9d4fde8e6264e699f","modified":1587446402801},{"_id":"public/archives/page/4/index.html","hash":"17c87e84bdd240a8c3872be7f954b117a6a0a64e","modified":1587446402801},{"_id":"public/archives/2016/04/index.html","hash":"ba5405758fae3205d45faebd9b6f6c29fabc6e0d","modified":1587446402801},{"_id":"public/2016/02/15/Flask-Day-1/index.html","hash":"70e1fe2be44fe1a1a2c47154a4ca14b77140ed5f","modified":1587446402801},{"_id":"public/archives/2016/05/index.html","hash":"9776f37ffc779f836f175a1a3cc7093d08db6d88","modified":1587446402801},{"_id":"public/archives/2018/index.html","hash":"f68186fdf1b5d2d4b17d60830ba45974a2a6edea","modified":1587446402801},{"_id":"public/archives/2018/05/index.html","hash":"f68186fdf1b5d2d4b17d60830ba45974a2a6edea","modified":1587446402802},{"_id":"public/archives/2019/index.html","hash":"b0ed0f0a97d72f877e32ca35f2e04446c31e87a5","modified":1587446402802},{"_id":"public/archives/2019/03/index.html","hash":"dea6c71318d3a5e846399723c08dd85e501cc853","modified":1587446402802},{"_id":"public/archives/2019/11/index.html","hash":"72c2812063a41e908ece68f6fb02693dabedb231","modified":1587446402802},{"_id":"public/page/4/index.html","hash":"3491fdf675901b32b4d7add96bf20afe0689f000","modified":1587446402802},{"_id":"public/2020/04/09/leetcode-the-masseuse-lcci/index.html","hash":"7aaf9401283dea109df78b0e9c15e4e1b019a97d","modified":1587446402802},{"_id":"public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html","hash":"03d56ffca8243eb43b68ca87c589cff370c75644","modified":1587446402802},{"_id":"public/archives/page/3/index.html","hash":"aebf39704d5f24dbc364347ad432a7a7f11f6fc3","modified":1587446402802},{"_id":"public/archives/2016/index.html","hash":"7f01421dc66b6f3e2cdece71a3e5e8220a126d03","modified":1587446402802},{"_id":"public/archives/2016/02/index.html","hash":"cb7d38e6a2726a642c10ec7799e1c8c7fbaa21f8","modified":1587446402802},{"_id":"public/page/3/index.html","hash":"823df38f48cc7ece2d0a3feebad02e0987f54ab2","modified":1587446402802},{"_id":"public/archives/2020/04/page/2/index.html","hash":"e2cabbebde42d90c7a379c2407b494ebe9718a58","modified":1587446402799},{"_id":"public/2020/04/21/leetcode-number-of-islands/index.html","hash":"03ccb0bb82762283b2945bb6d4bce77fa0dcb3b7","modified":1587446402800},{"_id":"public/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1587444954000},{"_id":"public/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1587444954000},{"_id":"public/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1587444954000},{"_id":"public/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1587444954000},{"_id":"public/css/apollo.css","hash":"3769b55e027697d6d163ddf82b664b16c767ba9c","modified":1587444954045}],"Category":[{"name":"leetcode","_id":"ck99fqk4a0002subunok11hn6"}],"Data":[],"Page":[],"Post":[{"title":"leetcode-121","date":"2020-03-17T10:06:45.000Z","_content":"\n### 121. 买卖股票的最佳时机\n\n[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)\n\n\n\n原始答案:\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n max_sellout = prices[0]\n l = len(prices)\n i = 0\n for buyin in prices:\n if i == l:\n return profit\n if min_buyin <= buyin:\n max_sellout = max(prices[i:])\n p = max_sellout - min_buyin\n if p > profit:\n profit = p\n if buyin < min_buyin:\n min_buyin = buyin\n i += 1\n return profit\n#1880 ms\t14.4 MB\n```\n\n主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。\n\n仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n for i in range(1, len(prices)):\n min_buyin = min(min_buyin, prices[i-1])\n profit = max(prices[i] - min_buyin, profit)\n return profit\n #44 ms\t14.4 MB\n```\n\n\n","source":"_posts/2020-03-17-leetcode-121.md","raw":"---\ntitle: leetcode-121\ndate: 2020-03-17 18:06:45\ntags:\ncategories: leetcode\n---\n\n### 121. 买卖股票的最佳时机\n\n[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)\n\n\n\n原始答案:\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n max_sellout = prices[0]\n l = len(prices)\n i = 0\n for buyin in prices:\n if i == l:\n return profit\n if min_buyin <= buyin:\n max_sellout = max(prices[i:])\n p = max_sellout - min_buyin\n if p > profit:\n profit = p\n if buyin < min_buyin:\n min_buyin = buyin\n i += 1\n return profit\n#1880 ms\t14.4 MB\n```\n\n主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。\n\n仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n for i in range(1, len(prices)):\n min_buyin = min(min_buyin, prices[i-1])\n profit = max(prices[i] - min_buyin, profit)\n return profit\n #44 ms\t14.4 MB\n```\n\n\n","slug":"leetcode-121","published":1,"updated":"2020-03-17T10:54:03.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk450000subu0lleqph1","content":"

121. 买卖股票的最佳时机

题目

\n\n

原始答案:

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
max_sellout = prices[0]
l = len(prices)
i = 0
for buyin in prices:
if i == l:
return profit
if min_buyin <= buyin:
max_sellout = max(prices[i:])
p = max_sellout - min_buyin
if p > profit:
profit = p
if buyin < min_buyin:
min_buyin = buyin
i += 1
return profit
#1880 ms\t14.4 MB
\n

主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。

\n

仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
for i in range(1, len(prices)):
min_buyin = min(min_buyin, prices[i-1])
profit = max(prices[i] - min_buyin, profit)
return profit
#44 ms\t14.4 MB
\n","site":{"data":{}},"excerpt":"

121. 买卖股票的最佳时机

题目

","more":"

原始答案:

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
max_sellout = prices[0]
l = len(prices)
i = 0
for buyin in prices:
if i == l:
return profit
if min_buyin <= buyin:
max_sellout = max(prices[i:])
p = max_sellout - min_buyin
if p > profit:
profit = p
if buyin < min_buyin:
min_buyin = buyin
i += 1
return profit
#1880 ms\t14.4 MB
\n

主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。

\n

仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
for i in range(1, len(prices)):
min_buyin = min(min_buyin, prices[i-1])
profit = max(prices[i] - min_buyin, profit)
return profit
#44 ms\t14.4 MB
"},{"title":"bash function and awk","date":"2018-05-30T16:00:48.000Z","_content":"\n\n\nI'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity.\n\n\n\n#### bash functions\n\nBash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess:\n\n```bash\nfunction run {\n source ~/Develop/django/bin/activate\n ./manage.py runserver\n}\n```\n\nI activate django virtural enviroment first and then run django serve.\n\nFunctions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:\n\n```bash\nfunction ba { hgba | grep \"$1\" }\n# hgba is an alias for hg branches\n```\n\nI can just type `ba release` then get current release branch info.\n\n-----\n\nAppend:\n\nI made some updates to the `ba` function and make it auto copying the branch result to my clipboard:\n\n```bash\n\nfunction ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }\n```\n\n\n\n#### awk\n\n`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. \n\n\n","source":"_posts/2018-05-31-bash-function-and-awk.md","raw":"---\ntitle: bash function and awk\ndate: 2018-05-31 00:00:48\ntags:\n---\n\n\n\nI'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity.\n\n\n\n#### bash functions\n\nBash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess:\n\n```bash\nfunction run {\n source ~/Develop/django/bin/activate\n ./manage.py runserver\n}\n```\n\nI activate django virtural enviroment first and then run django serve.\n\nFunctions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:\n\n```bash\nfunction ba { hgba | grep \"$1\" }\n# hgba is an alias for hg branches\n```\n\nI can just type `ba release` then get current release branch info.\n\n-----\n\nAppend:\n\nI made some updates to the `ba` function and make it auto copying the branch result to my clipboard:\n\n```bash\n\nfunction ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }\n```\n\n\n\n#### awk\n\n`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. \n\n\n","slug":"bash-function-and-awk","published":1,"updated":"2019-11-14T08:01:50.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk490001sububwxed4yb","content":"

I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

\n

bash functions

Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

\n
1
2
3
4
function run {
source ~/Develop/django/bin/activate
./manage.py runserver
}
\n

I activate django virtural enviroment first and then run django serve.

\n

Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

\n
1
2
function ba { hgba | grep \"$1\" }
# hgba is an alias for hg branches
\n

I can just type ba release then get current release branch info.

\n
\n

Append:

\n

I made some updates to the ba function and make it auto copying the branch result to my clipboard:

\n
1
2

function ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }
\n

awk

awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

\n","site":{"data":{}},"excerpt":"","more":"

I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

\n

bash functions

Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

\n
1
2
3
4
function run {
source ~/Develop/django/bin/activate
./manage.py runserver
}
\n

I activate django virtural enviroment first and then run django serve.

\n

Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

\n
1
2
function ba { hgba | grep \"$1\" }
# hgba is an alias for hg branches
\n

I can just type ba release then get current release branch info.

\n
\n

Append:

\n

I made some updates to the ba function and make it auto copying the branch result to my clipboard:

\n
1
2

function ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }
\n

awk

awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

\n"},{"title":"AWS KMS","date":"2019-11-14T07:19:05.000Z","_content":"\nWe used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons.\n\nSince AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3.\n\n*TBD*\n\n\n[1]: https://www.amazonaws.cn/kms/","source":"_posts/2019-11-14-AWS-KMS.md","raw":"---\ntitle: AWS KMS\ndate: 2019-11-14 15:19:05\ntags:\n---\n\nWe used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons.\n\nSince AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3.\n\n*TBD*\n\n\n[1]: https://www.amazonaws.cn/kms/","slug":"AWS-KMS","published":1,"updated":"2019-11-14T08:03:24.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4b0003subucvx7m2kw","content":"

We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

\n

Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

\n

TBD

\n","site":{"data":{}},"excerpt":"","more":"

We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

\n

Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

\n

TBD

\n"},{"title":"leetcode-206","date":"2020-03-18T15:33:03.000Z","_content":"\n### 206. 反转链表\n\n[题目](https://leetcode-cn.com/problems/reverse-linked-list/)\n\n\n\n最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n nl = []\n while head.next:\n nl.append(head)\n head = head.next\n nl.append(head)\n l = len(nl)\n for x in range(l):\n if x == 0:\n nl[x].next = None\n continue\n nl[x].next = nl[x-1]\n if x == (l - 1):\n return nl[x]\n```\n\n仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n prev_node = None\n next_node = head.next\n while head:\n next_node = head.next\n head.next = prev_node\n prev_node = head\n head = next_node\n return prev_node\n```\n\n然后是递归的做法,主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head:\n return head\n if head.next:\n ss = Solution()\n last = ss.reverseList(head.next)\n head.next.next = head\n head.next = None\n return last\n return head\n```\n\n一开始是用list来打草稿,不过想明白递归之后就大同小异了:\n\n```python\ndef a(l:list)->list:\n k=[l[0]]\n\n if l[1:]:\n b=a(l[1:])\n b.extend(k)\n else:\n return [l[0]]\n return b\n```\n\n\n","source":"_posts/2020-03-18-leetcode-206.md","raw":"---\ntitle: leetcode-206\ndate: 2020-03-18 23:33:03\ntags:\ncategories: leetcode\n---\n\n### 206. 反转链表\n\n[题目](https://leetcode-cn.com/problems/reverse-linked-list/)\n\n\n\n最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n nl = []\n while head.next:\n nl.append(head)\n head = head.next\n nl.append(head)\n l = len(nl)\n for x in range(l):\n if x == 0:\n nl[x].next = None\n continue\n nl[x].next = nl[x-1]\n if x == (l - 1):\n return nl[x]\n```\n\n仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n prev_node = None\n next_node = head.next\n while head:\n next_node = head.next\n head.next = prev_node\n prev_node = head\n head = next_node\n return prev_node\n```\n\n然后是递归的做法,主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head:\n return head\n if head.next:\n ss = Solution()\n last = ss.reverseList(head.next)\n head.next.next = head\n head.next = None\n return last\n return head\n```\n\n一开始是用list来打草稿,不过想明白递归之后就大同小异了:\n\n```python\ndef a(l:list)->list:\n k=[l[0]]\n\n if l[1:]:\n b=a(l[1:])\n b.extend(k)\n else:\n return [l[0]]\n return b\n```\n\n\n","slug":"leetcode-206","published":1,"updated":"2020-03-18T15:44:12.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4c0004subueeqgf7uv","content":"

206. 反转链表

题目

\n\n

最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
nl = []
while head.next:
nl.append(head)
head = head.next
nl.append(head)
l = len(nl)
for x in range(l):
if x == 0:
nl[x].next = None
continue
nl[x].next = nl[x-1]
if x == (l - 1):
return nl[x]
\n

仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
prev_node = None
next_node = head.next
while head:
next_node = head.next
head.next = prev_node
prev_node = head
head = next_node
return prev_node
\n

然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def reverseList(self, head):
if not head:
return head
if head.next:
ss = Solution()
last = ss.reverseList(head.next)
head.next.next = head
head.next = None
return last
return head
\n

一开始是用list来打草稿,不过想明白递归之后就大同小异了:

\n
1
2
3
4
5
6
7
8
9
def a(l:list)->list:
k=[l[0]]

if l[1:]:
b=a(l[1:])
b.extend(k)
else:
return [l[0]]
return b
\n","site":{"data":{}},"excerpt":"

206. 反转链表

题目

","more":"

最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
nl = []
while head.next:
nl.append(head)
head = head.next
nl.append(head)
l = len(nl)
for x in range(l):
if x == 0:
nl[x].next = None
continue
nl[x].next = nl[x-1]
if x == (l - 1):
return nl[x]
\n

仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
prev_node = None
next_node = head.next
while head:
next_node = head.next
head.next = prev_node
prev_node = head
head = next_node
return prev_node
\n

然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def reverseList(self, head):
if not head:
return head
if head.next:
ss = Solution()
last = ss.reverseList(head.next)
head.next.next = head
head.next = None
return last
return head
\n

一开始是用list来打草稿,不过想明白递归之后就大同小异了:

\n
1
2
3
4
5
6
7
8
9
def a(l:list)->list:
k=[l[0]]

if l[1:]:
b=a(l[1:])
b.extend(k)
else:
return [l[0]]
return b
"},{"title":"leetcode-225","date":"2020-03-23T15:35:05.000Z","_content":"\n### 225. 用队列实现栈\n\n[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/)\n\n\n\n\n\n\n\n注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。\n\n```python\nclass MyStack:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.data = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n Push element x onto stack.\n \"\"\"\n self.data.append(x)\n return\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element on top of the stack and returns that element.\n \"\"\"\n return self.data.pop(-1)\n\n\n def top(self) -> int:\n \"\"\"\n Get the top element.\n \"\"\"\n return self.data[-1]\n\n\n def empty(self) -> bool:\n \"\"\"\n Returns whether the stack is empty.\n \"\"\"\n return not bool(self.data)\n\n\n\n# Your MyStack object will be instantiated and called as such:\n# obj = MyStack()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.top()\n# param_4 = obj.empty()\n\n#24 ms\t13.5 MB\n```\n\n","source":"_posts/2020-03-23-leetcode-225.md","raw":"---\ntitle: leetcode-225\ndate: 2020-03-23 23:35:05\ntags:\ncategories: leetcode\n---\n\n### 225. 用队列实现栈\n\n[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/)\n\n\n\n\n\n\n\n注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。\n\n```python\nclass MyStack:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.data = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n Push element x onto stack.\n \"\"\"\n self.data.append(x)\n return\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element on top of the stack and returns that element.\n \"\"\"\n return self.data.pop(-1)\n\n\n def top(self) -> int:\n \"\"\"\n Get the top element.\n \"\"\"\n return self.data[-1]\n\n\n def empty(self) -> bool:\n \"\"\"\n Returns whether the stack is empty.\n \"\"\"\n return not bool(self.data)\n\n\n\n# Your MyStack object will be instantiated and called as such:\n# obj = MyStack()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.top()\n# param_4 = obj.empty()\n\n#24 ms\t13.5 MB\n```\n\n","slug":"leetcode-225","published":1,"updated":"2020-03-23T15:35:24.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4d0005subutkoz8ewr","content":"

225. 用队列实现栈

题目

\n\n

注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class MyStack:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.data = []


def push(self, x: int) -> None:
\"\"\"
Push element x onto stack.
\"\"\"
self.data.append(x)
return


def pop(self) -> int:
\"\"\"
Removes the element on top of the stack and returns that element.
\"\"\"
return self.data.pop(-1)


def top(self) -> int:
\"\"\"
Get the top element.
\"\"\"
return self.data[-1]


def empty(self) -> bool:
\"\"\"
Returns whether the stack is empty.
\"\"\"
return not bool(self.data)



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

#24 ms\t13.5 MB
\n","site":{"data":{}},"excerpt":"

225. 用队列实现栈

题目

","more":"

注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class MyStack:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.data = []


def push(self, x: int) -> None:
\"\"\"
Push element x onto stack.
\"\"\"
self.data.append(x)
return


def pop(self) -> int:
\"\"\"
Removes the element on top of the stack and returns that element.
\"\"\"
return self.data.pop(-1)


def top(self) -> int:
\"\"\"
Get the top element.
\"\"\"
return self.data[-1]


def empty(self) -> bool:
\"\"\"
Returns whether the stack is empty.
\"\"\"
return not bool(self.data)



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

#24 ms\t13.5 MB
"},{"title":"leetcode-169","date":"2020-03-23T15:12:57.000Z","_content":"\n\n### 169. 多数元素\n\n[题目](https://leetcode-cn.com/problems/majority-element/)\n\n\n\n\n\n\n\n一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。\n\n```python\nclass Solution:\n def majorityElement(self, nums) -> int:\n d = {}\n l = len(nums)\n for n in nums:\n if not n in d:\n d[n] = 0\n d[n] = d[n] + 1\n if d[n] > l/2:\n return n\n# 64 ms\t15.1 MB\n```\n\nPython 也有专门计数的库,写起来更简单一点:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n counts = collections.Counter(nums)\n return max(counts.keys(), key=counts.get)\n# 44 ms\t15.1 MB\n```\n\n由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n majority_count = len(nums)//2\n while True:\n candidate = random.choice(nums)\n if sum(1 for elem in nums if elem == candidate) > majority_count:\n return candidate\n\n#作者:LeetCode-Solution\n#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/\n#来源:力扣(LeetCode)\n#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","source":"_posts/2020-03-23-leetcode-169.md","raw":"---\ntitle: leetcode-169\ndate: 2020-03-23 23:12:57\ntags:\ncategories: leetcode\n---\n\n\n### 169. 多数元素\n\n[题目](https://leetcode-cn.com/problems/majority-element/)\n\n\n\n\n\n\n\n一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。\n\n```python\nclass Solution:\n def majorityElement(self, nums) -> int:\n d = {}\n l = len(nums)\n for n in nums:\n if not n in d:\n d[n] = 0\n d[n] = d[n] + 1\n if d[n] > l/2:\n return n\n# 64 ms\t15.1 MB\n```\n\nPython 也有专门计数的库,写起来更简单一点:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n counts = collections.Counter(nums)\n return max(counts.keys(), key=counts.get)\n# 44 ms\t15.1 MB\n```\n\n由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n majority_count = len(nums)//2\n while True:\n candidate = random.choice(nums)\n if sum(1 for elem in nums if elem == candidate) > majority_count:\n return candidate\n\n#作者:LeetCode-Solution\n#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/\n#来源:力扣(LeetCode)\n#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","slug":"leetcode-169","published":1,"updated":"2020-03-23T15:13:49.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4e0006subugxejhq3n","content":"

169. 多数元素

题目

\n\n

一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def majorityElement(self, nums) -> int:
d = {}
l = len(nums)
for n in nums:
if not n in d:
d[n] = 0
d[n] = d[n] + 1
if d[n] > l/2:
return n
# 64 ms\t15.1 MB
\n

Python 也有专门计数的库,写起来更简单一点:

\n
1
2
3
4
5
class Solution:
def majorityElement(self, nums):
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
# 44 ms\t15.1 MB
\n

由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下蒙特卡罗算法,后来在官方解答中也看到类似的思路了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate

#作者:LeetCode-Solution
#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/
#来源:力扣(LeetCode)
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n","site":{"data":{}},"excerpt":"

169. 多数元素

题目

","more":"

一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def majorityElement(self, nums) -> int:
d = {}
l = len(nums)
for n in nums:
if not n in d:
d[n] = 0
d[n] = d[n] + 1
if d[n] > l/2:
return n
# 64 ms\t15.1 MB
\n

Python 也有专门计数的库,写起来更简单一点:

\n
1
2
3
4
5
class Solution:
def majorityElement(self, nums):
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
# 44 ms\t15.1 MB
\n

由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下蒙特卡罗算法,后来在官方解答中也看到类似的思路了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate

#作者:LeetCode-Solution
#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/
#来源:力扣(LeetCode)
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"},{"title":"leetcode-409","date":"2020-03-25T13:55:38.000Z","_content":"\n### 409. 最长回文串\n\n[题目](https://leetcode-cn.com/problems/longest-palindrome/)\n\n\n\n\n\n\n\n\n\n一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。\n\n这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。\n\n\n\n```python\nclass Solution:\n def longestPalindrome(self, s: str) -> int:\n d = {}\n for l in s:\n if not l in d:\n d[l] = 0\n d[l] += 1\n\n i = 0\n odd = False\n for k, v in d.items():\n if v % 2:\n i += (v-1)\n odd = True\n else:\n i += v\n if odd:\n i += 1\n return i\n\n#40 ms\t13.6 MB\n```\n\n","source":"_posts/2020-03-25-leetcode-409.md","raw":"---\ntitle: leetcode-409\ndate: 2020-03-25 21:55:38\ntags:\ncategories: leetcode\n---\n\n### 409. 最长回文串\n\n[题目](https://leetcode-cn.com/problems/longest-palindrome/)\n\n\n\n\n\n\n\n\n\n一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。\n\n这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。\n\n\n\n```python\nclass Solution:\n def longestPalindrome(self, s: str) -> int:\n d = {}\n for l in s:\n if not l in d:\n d[l] = 0\n d[l] += 1\n\n i = 0\n odd = False\n for k, v in d.items():\n if v % 2:\n i += (v-1)\n odd = True\n else:\n i += v\n if odd:\n i += 1\n return i\n\n#40 ms\t13.6 MB\n```\n\n","slug":"leetcode-409","published":1,"updated":"2020-03-25T13:55:54.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4f0007subugdeybnq7","content":"

409. 最长回文串

题目

\n\n

一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。

\n

这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def longestPalindrome(self, s: str) -> int:
d = {}
for l in s:
if not l in d:
d[l] = 0
d[l] += 1

i = 0
odd = False
for k, v in d.items():
if v % 2:
i += (v-1)
odd = True
else:
i += v
if odd:
i += 1
return i

#40 ms\t13.6 MB
\n","site":{"data":{}},"excerpt":"

409. 最长回文串

题目

","more":"

一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。

\n

这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def longestPalindrome(self, s: str) -> int:
d = {}
for l in s:
if not l in d:
d[l] = 0
d[l] += 1

i = 0
odd = False
for k, v in d.items():
if v % 2:
i += (v-1)
odd = True
else:
i += v
if odd:
i += 1
return i

#40 ms\t13.6 MB
"},{"title":"leetcode-543","date":"2020-03-25T11:13:52.000Z","_content":"\n### 543. 二叉树的直径\n\n\n[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/)\n\n\n\n\n\n\n这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。\n\n```python\n# Definition for a binary tree node.\nclass TreeNode:\n def __init__(self, x):\n self.val = x\n self.left = None\n self.right = None\n\nclass Solution:\n def diameterOfBinaryTree(self, root: TreeNode) -> int:\n if not root:\n return 0\n last_node = -1\n routes = []\n start = root\n node_stack = [root]\n while (start.left or start.right or node_stack):\n if start != node_stack[-1]:\n node_stack.append(start)\n\n if last_node == start.right:\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n continue\n\n if start.left and last_node != start.left:\n start = start.left\n last_node = start\n continue\n\n if start.right:\n start = start.right\n last_node = start\n continue\n\n routes.append(node_stack)\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n\n max_l = 0\n for route in routes:\n for route_ in routes:\n intersection = 0\n if route != route_:\n intersection = len(set(route).intersection(set(route_)))\n if intersection:\n intersection -= 1\n max_l = max(max_l, len(set(route)| set(route_)) - intersection)\n return max_l - 1\n```\n\n\n\nL43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。\n\n\n\n其实以某个点为根节点的树的直径,就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解\n\n\n\n```python\nclass Solution(object):\n def diameterOfBinaryTree(self, root):\n self.ans = 1\n def depth(node):\n # 访问到空节点了,返回0\n if not node: return 0\n # 左儿子为根的子树的深度\n L = depth(node.left)\n # 右儿子为根的子树的深度\n R = depth(node.right)\n # 计算d_node即L+R+1 并更新ans\n self.ans = max(self.ans, L+R+1)\n # 返回该节点为根的子树的深度\n return max(L, R) + 1\n\n depth(root)\n return self.ans - 1\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","source":"_posts/2020-03-25-leetcode-543.md","raw":"---\ntitle: leetcode-543\ndate: 2020-03-25 19:13:52\ntags:\ncategories: leetcode\n---\n\n### 543. 二叉树的直径\n\n\n[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/)\n\n\n\n\n\n\n这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。\n\n```python\n# Definition for a binary tree node.\nclass TreeNode:\n def __init__(self, x):\n self.val = x\n self.left = None\n self.right = None\n\nclass Solution:\n def diameterOfBinaryTree(self, root: TreeNode) -> int:\n if not root:\n return 0\n last_node = -1\n routes = []\n start = root\n node_stack = [root]\n while (start.left or start.right or node_stack):\n if start != node_stack[-1]:\n node_stack.append(start)\n\n if last_node == start.right:\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n continue\n\n if start.left and last_node != start.left:\n start = start.left\n last_node = start\n continue\n\n if start.right:\n start = start.right\n last_node = start\n continue\n\n routes.append(node_stack)\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n\n max_l = 0\n for route in routes:\n for route_ in routes:\n intersection = 0\n if route != route_:\n intersection = len(set(route).intersection(set(route_)))\n if intersection:\n intersection -= 1\n max_l = max(max_l, len(set(route)| set(route_)) - intersection)\n return max_l - 1\n```\n\n\n\nL43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。\n\n\n\n其实以某个点为根节点的树的直径,就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解\n\n\n\n```python\nclass Solution(object):\n def diameterOfBinaryTree(self, root):\n self.ans = 1\n def depth(node):\n # 访问到空节点了,返回0\n if not node: return 0\n # 左儿子为根的子树的深度\n L = depth(node.left)\n # 右儿子为根的子树的深度\n R = depth(node.right)\n # 计算d_node即L+R+1 并更新ans\n self.ans = max(self.ans, L+R+1)\n # 返回该节点为根的子树的深度\n return max(L, R) + 1\n\n depth(root)\n return self.ans - 1\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","slug":"leetcode-543","published":1,"updated":"2020-04-14T15:29:53.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4g0009subu00ew2ar1","content":"

543. 二叉树的直径

题目

\n\n

这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
last_node = -1
routes = []
start = root
node_stack = [root]
while (start.left or start.right or node_stack):
if start != node_stack[-1]:
node_stack.append(start)

if last_node == start.right:
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]
continue

if start.left and last_node != start.left:
start = start.left
last_node = start
continue

if start.right:
start = start.right
last_node = start
continue

routes.append(node_stack)
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]

max_l = 0
for route in routes:
for route_ in routes:
intersection = 0
if route != route_:
intersection = len(set(route).intersection(set(route_)))
if intersection:
intersection -= 1
max_l = max(max_l, len(set(route)| set(route_)) - intersection)
return max_l - 1
\n

L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。

\n

其实以某个点为根节点的树的直径,就是某个节点的左子树的深度和右子树的深度的和,用递归来处理这个会比较容易理解

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def diameterOfBinaryTree(self, root):
self.ans = 1
def depth(node):
# 访问到空节点了,返回0
if not node: return 0
# 左儿子为根的子树的深度
L = depth(node.left)
# 右儿子为根的子树的深度
R = depth(node.right)
# 计算d_node即L+R+1 并更新ans
self.ans = max(self.ans, L+R+1)
# 返回该节点为根的子树的深度
return max(L, R) + 1

depth(root)
return self.ans - 1

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n","site":{"data":{}},"excerpt":"

543. 二叉树的直径

题目

","more":"

这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
last_node = -1
routes = []
start = root
node_stack = [root]
while (start.left or start.right or node_stack):
if start != node_stack[-1]:
node_stack.append(start)

if last_node == start.right:
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]
continue

if start.left and last_node != start.left:
start = start.left
last_node = start
continue

if start.right:
start = start.right
last_node = start
continue

routes.append(node_stack)
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]

max_l = 0
for route in routes:
for route_ in routes:
intersection = 0
if route != route_:
intersection = len(set(route).intersection(set(route_)))
if intersection:
intersection -= 1
max_l = max(max_l, len(set(route)| set(route_)) - intersection)
return max_l - 1
\n

L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。

\n

其实以某个点为根节点的树的直径,就是某个节点的左子树的深度和右子树的深度的和,用递归来处理这个会比较容易理解

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def diameterOfBinaryTree(self, root):
self.ans = 1
def depth(node):
# 访问到空节点了,返回0
if not node: return 0
# 左儿子为根的子树的深度
L = depth(node.left)
# 右儿子为根的子树的深度
R = depth(node.right)
# 计算d_node即L+R+1 并更新ans
self.ans = max(self.ans, L+R+1)
# 返回该节点为根的子树的深度
return max(L, R) + 1

depth(root)
return self.ans - 1

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"},{"title":"leetcode-836","date":"2020-03-25T14:41:25.000Z","_content":"\n### 836. 矩形重叠\n\n[题目](https://leetcode-cn.com/problems/rectangle-overlap/)\n\n\n\n\n\n\n\n看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。\n\n\n\n```python\nclass Solution:\n def isRectangleOverlap(self, rec1, rec2) -> bool:\n return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))\n and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))\n\ns = Solution()\ns.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])\n\n#40 ms\t13.7 MB\n```\n\n","source":"_posts/2020-03-25-leetcode-836.md","raw":"---\ntitle: leetcode-836\ndate: 2020-03-25 22:41:25\ntags:\ncategories: leetcode\n---\n\n### 836. 矩形重叠\n\n[题目](https://leetcode-cn.com/problems/rectangle-overlap/)\n\n\n\n\n\n\n\n看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。\n\n\n\n```python\nclass Solution:\n def isRectangleOverlap(self, rec1, rec2) -> bool:\n return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))\n and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))\n\ns = Solution()\ns.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])\n\n#40 ms\t13.7 MB\n```\n\n","slug":"leetcode-836","published":1,"updated":"2020-03-25T14:41:44.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4h000bsubu68ng98xy","content":"

836. 矩形重叠

题目

\n\n

看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。

\n
1
2
3
4
5
6
7
8
9
class Solution:
def isRectangleOverlap(self, rec1, rec2) -> bool:
return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))
and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))

s = Solution()
s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])

#40 ms\t13.7 MB
\n","site":{"data":{}},"excerpt":"

836. 矩形重叠

题目

","more":"

看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。

\n
1
2
3
4
5
6
7
8
9
class Solution:
def isRectangleOverlap(self, rec1, rec2) -> bool:
return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))
and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))

s = Solution()
s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])

#40 ms\t13.7 MB
"},{"title":"leetcode-1013","date":"2020-03-29T13:09:22.000Z","_content":"\n### 1013. 将数组分成和相等的三个部分\n\n[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/)\n\n\n\n\n\n\n\n因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。\n\n\n\n```python\nclass Solution:\n def canThreePartsEqualSum(self, A) -> bool:\n if not A:\n return False\n sa = sum(A)\n if sa % 3:\n return False\n s = sa // 3\n s1 = 0\n s2 = 0\n\n\n for i in range(len(A)):\n s1 += A[i]\n if s1 == s and (i+1) < len(A):\n for j in range(len(A[i+1:])):\n s2 += A[i+1+j]\n if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:\n return True\n return False\n#60 ms\t18.7 MB\n```\n\n","source":"_posts/2020-03-29-leetcode-1013.md","raw":"---\ntitle: leetcode-1013\ndate: 2020-03-29 21:09:22\ntags:\ncategories: leetcode\n---\n\n### 1013. 将数组分成和相等的三个部分\n\n[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/)\n\n\n\n\n\n\n\n因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。\n\n\n\n```python\nclass Solution:\n def canThreePartsEqualSum(self, A) -> bool:\n if not A:\n return False\n sa = sum(A)\n if sa % 3:\n return False\n s = sa // 3\n s1 = 0\n s2 = 0\n\n\n for i in range(len(A)):\n s1 += A[i]\n if s1 == s and (i+1) < len(A):\n for j in range(len(A[i+1:])):\n s2 += A[i+1+j]\n if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:\n return True\n return False\n#60 ms\t18.7 MB\n```\n\n","slug":"leetcode-1013","published":1,"updated":"2020-03-29T13:15:11.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4i000dsubujxdgfcfh","content":"

1013. 将数组分成和相等的三个部分

题目

\n\n

因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def canThreePartsEqualSum(self, A) -> bool:
if not A:
return False
sa = sum(A)
if sa % 3:
return False
s = sa // 3
s1 = 0
s2 = 0


for i in range(len(A)):
s1 += A[i]
if s1 == s and (i+1) < len(A):
for j in range(len(A[i+1:])):
s2 += A[i+1+j]
if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:
return True
return False
#60 ms\t18.7 MB
\n","site":{"data":{}},"excerpt":"

1013. 将数组分成和相等的三个部分

题目

","more":"

因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def canThreePartsEqualSum(self, A) -> bool:
if not A:
return False
sa = sum(A)
if sa % 3:
return False
s = sa // 3
s1 = 0
s2 = 0


for i in range(len(A)):
s1 += A[i]
if s1 == s and (i+1) < len(A):
for j in range(len(A[i+1:])):
s2 += A[i+1+j]
if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:
return True
return False
#60 ms\t18.7 MB
"},{"title":"leetcode-876","date":"2020-03-26T13:18:41.000Z","_content":"\n### 876. 链表的中间结点\n\n\n\n[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/)\n\n\n\n\n\n\n\n思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。\n\n\n\n```python\n# Definition for singly-linked list.\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n l = []\n n = head\n while n.next:\n l.append(n)\n n = n.next\n l.append(n)\n return l[len(l)//2]\n\n #44 ms\t13.7 MB\n```\n\n\n\n看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。\n\n\n\n```python\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n return slow\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n\n\n","source":"_posts/2020-03-26-leetcode-876.md","raw":"---\ntitle: leetcode-876\ndate: 2020-03-26 21:18:41\ntags:\ncategories: leetcode\n---\n\n### 876. 链表的中间结点\n\n\n\n[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/)\n\n\n\n\n\n\n\n思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。\n\n\n\n```python\n# Definition for singly-linked list.\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n l = []\n n = head\n while n.next:\n l.append(n)\n n = n.next\n l.append(n)\n return l[len(l)//2]\n\n #44 ms\t13.7 MB\n```\n\n\n\n看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。\n\n\n\n```python\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n return slow\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n\n\n","slug":"leetcode-876","published":1,"updated":"2020-03-26T13:19:10.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4m000fsubu530zs4nj","content":"

876. 链表的中间结点

题目

\n\n

思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def middleNode(self, head: ListNode) -> ListNode:
l = []
n = head
while n.next:
l.append(n)
n = n.next
l.append(n)
return l[len(l)//2]

#44 ms\t13.7 MB
\n

看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n","site":{"data":{}},"excerpt":"

876. 链表的中间结点

题目

","more":"

思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def middleNode(self, head: ListNode) -> ListNode:
l = []
n = head
while n.next:
l.append(n)
n = n.next
l.append(n)
return l[len(l)//2]

#44 ms\t13.7 MB
\n

看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"},{"title":"leetcode-914","date":"2020-03-29T14:41:09.000Z","_content":"\n### 914. 卡牌分组\n\n[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/)\n\n\n\n\n\n\n\n将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。\n\n\n\n```python\nclass Solution:\n def hasGroupsSizeX(self, deck) -> bool:\n dc = {}\n max_d = 0\n for d in deck:\n if d not in dc:\n dc[d] = 0\n dc[d] += 1\n if max_d < d:\n max_d = d\n if max_d < dc[d]:\n max_d = dc[d]\n has_x = True\n if max_d == 1:\n max_d = 2\n\n for i in range(2, max_d + 1):\n has_x = True\n for k,v in dc.items():\n if v % i:\n has_x = False\n break\n if has_x and i >= 2:\n return True\n return False\n\n#56 ms\t13.8 MB\n```\n\n","source":"_posts/2020-03-29-leetcode-914.md","raw":"---\ntitle: leetcode-914\ndate: 2020-03-29 22:41:09\ntags:\ncategories: leetcode\n---\n\n### 914. 卡牌分组\n\n[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/)\n\n\n\n\n\n\n\n将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。\n\n\n\n```python\nclass Solution:\n def hasGroupsSizeX(self, deck) -> bool:\n dc = {}\n max_d = 0\n for d in deck:\n if d not in dc:\n dc[d] = 0\n dc[d] += 1\n if max_d < d:\n max_d = d\n if max_d < dc[d]:\n max_d = dc[d]\n has_x = True\n if max_d == 1:\n max_d = 2\n\n for i in range(2, max_d + 1):\n has_x = True\n for k,v in dc.items():\n if v % i:\n has_x = False\n break\n if has_x and i >= 2:\n return True\n return False\n\n#56 ms\t13.8 MB\n```\n\n","slug":"leetcode-914","published":1,"updated":"2020-03-29T14:52:07.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4n000hsubu5guv78od","content":"

914. 卡牌分组

题目

\n\n

将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def hasGroupsSizeX(self, deck) -> bool:
dc = {}
max_d = 0
for d in deck:
if d not in dc:
dc[d] = 0
dc[d] += 1
if max_d < d:
max_d = d
if max_d < dc[d]:
max_d = dc[d]
has_x = True
if max_d == 1:
max_d = 2

for i in range(2, max_d + 1):
has_x = True
for k,v in dc.items():
if v % i:
has_x = False
break
if has_x and i >= 2:
return True
return False

#56 ms\t13.8 MB
\n","site":{"data":{}},"excerpt":"

914. 卡牌分组

题目

","more":"

将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def hasGroupsSizeX(self, deck) -> bool:
dc = {}
max_d = 0
for d in deck:
if d not in dc:
dc[d] = 0
dc[d] += 1
if max_d < d:
max_d = d
if max_d < dc[d]:
max_d = dc[d]
has_x = True
if max_d == 1:
max_d = 2

for i in range(2, max_d + 1):
has_x = True
for k,v in dc.items():
if v % i:
has_x = False
break
if has_x and i >= 2:
return True
return False

#56 ms\t13.8 MB
"},{"title":"leetcode-1071","date":"2020-03-30T14:03:01.000Z","_content":"\n### 1071. 字符串的最大公因子\n\n[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/)\n\n\n\n\n\n\n\n如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。\n\n\n\n```python\nclass Solution:\n def gcdOfStrings(self, str1: str, str2: str) -> str:\n if str1[0] != str2[0]:\n return ''\n\n a = len(str1)\n b = len(str2)\n print(a, b)\n if a < b:\n str1, str2 = str2, str1\n a = len(str1)\n b = len(str2)\n\n if not a%b:\n for x in range(0, a//b):\n if str1[x*b:(x+1)*b] != str2:\n return ''\n return str2\n else:\n for x in range(b, 0, -1):\n print(x)\n if x==b or b%x or a%x:\n continue\n for y in range(0, b//x):\n if str2[y*x:(y+1)*x] != str2[b-x:b]:\n return ''\n for y in range(0, a//x):\n if str1[y*x:(y+1)*x] != str2[0:x]:\n return ''\n return str2[0:x]\n# 44 ms\t13.9 MB\n```\n\n\n\n官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。\n\n","source":"_posts/2020-03-30-leetcode-1071.md","raw":"---\ntitle: leetcode-1071\ndate: 2020-03-30 22:03:01\ntags:\ncategories: leetcode\n---\n\n### 1071. 字符串的最大公因子\n\n[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/)\n\n\n\n\n\n\n\n如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。\n\n\n\n```python\nclass Solution:\n def gcdOfStrings(self, str1: str, str2: str) -> str:\n if str1[0] != str2[0]:\n return ''\n\n a = len(str1)\n b = len(str2)\n print(a, b)\n if a < b:\n str1, str2 = str2, str1\n a = len(str1)\n b = len(str2)\n\n if not a%b:\n for x in range(0, a//b):\n if str1[x*b:(x+1)*b] != str2:\n return ''\n return str2\n else:\n for x in range(b, 0, -1):\n print(x)\n if x==b or b%x or a%x:\n continue\n for y in range(0, b//x):\n if str2[y*x:(y+1)*x] != str2[b-x:b]:\n return ''\n for y in range(0, a//x):\n if str1[y*x:(y+1)*x] != str2[0:x]:\n return ''\n return str2[0:x]\n# 44 ms\t13.9 MB\n```\n\n\n\n官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。\n\n","slug":"leetcode-1071","published":1,"updated":"2020-03-30T14:04:17.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4o000jsubub8g0257f","content":"

1071. 字符串的最大公因子

题目

\n\n

如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def gcdOfStrings(self, str1: str, str2: str) -> str:
if str1[0] != str2[0]:
return ''

a = len(str1)
b = len(str2)
print(a, b)
if a < b:
str1, str2 = str2, str1
a = len(str1)
b = len(str2)

if not a%b:
for x in range(0, a//b):
if str1[x*b:(x+1)*b] != str2:
return ''
return str2
else:
for x in range(b, 0, -1):
print(x)
if x==b or b%x or a%x:
continue
for y in range(0, b//x):
if str2[y*x:(y+1)*x] != str2[b-x:b]:
return ''
for y in range(0, a//x):
if str1[y*x:(y+1)*x] != str2[0:x]:
return ''
return str2[0:x]
# 44 ms\t13.9 MB
\n

官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,可以证明必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。

\n","site":{"data":{}},"excerpt":"

1071. 字符串的最大公因子

题目

","more":"

如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def gcdOfStrings(self, str1: str, str2: str) -> str:
if str1[0] != str2[0]:
return ''

a = len(str1)
b = len(str2)
print(a, b)
if a < b:
str1, str2 = str2, str1
a = len(str1)
b = len(str2)

if not a%b:
for x in range(0, a//b):
if str1[x*b:(x+1)*b] != str2:
return ''
return str2
else:
for x in range(b, 0, -1):
print(x)
if x==b or b%x or a%x:
continue
for y in range(0, b//x):
if str2[y*x:(y+1)*x] != str2[b-x:b]:
return ''
for y in range(0, a//x):
if str1[y*x:(y+1)*x] != str2[0:x]:
return ''
return str2[0:x]
# 44 ms\t13.9 MB
\n

官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,可以证明必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。

"},{"title":"leetcode-999","date":"2020-03-30T13:03:25.000Z","_content":"\n\n### 999. 可以被一步捕获的棋子数\n\n[题目](https://leetcode-cn.com/problems/available-captures-for-rook/)\n\n\n\n\n\n\n\n遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。\n\n\n\n```python\nclass Solution:\n def numRookCaptures(self, board) -> int:\n i = j = 0\n for row in board:\n if 'R' in row:\n break\n i += 1\n j = row.index('R')\n count = 0\n # right\n for x in range(j + 1, 8):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # left\n for x in range(j, 0, -1):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # up\n for x in range(i, 0, -1):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n # down\n for x in range(i+1, 8):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n\n return count\n\n#36 ms\t13.6 MB\n\n```\n\n\n\n问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。\n\n","source":"_posts/2020-03-30-leetcode-999.md","raw":"---\ntitle: leetcode-999\ndate: 2020-03-30 21:03:25\ntags:\ncategories: leetcode\n---\n\n\n### 999. 可以被一步捕获的棋子数\n\n[题目](https://leetcode-cn.com/problems/available-captures-for-rook/)\n\n\n\n\n\n\n\n遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。\n\n\n\n```python\nclass Solution:\n def numRookCaptures(self, board) -> int:\n i = j = 0\n for row in board:\n if 'R' in row:\n break\n i += 1\n j = row.index('R')\n count = 0\n # right\n for x in range(j + 1, 8):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # left\n for x in range(j, 0, -1):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # up\n for x in range(i, 0, -1):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n # down\n for x in range(i+1, 8):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n\n return count\n\n#36 ms\t13.6 MB\n\n```\n\n\n\n问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。\n\n","slug":"leetcode-999","published":1,"updated":"2020-03-30T13:03:41.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4p000lsubu6henmdmq","content":"

999. 可以被一步捕获的棋子数

题目

\n\n

遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def numRookCaptures(self, board) -> int:
i = j = 0
for row in board:
if 'R' in row:
break
i += 1
j = row.index('R')
count = 0
# right
for x in range(j + 1, 8):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# left
for x in range(j, 0, -1):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# up
for x in range(i, 0, -1):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break
# down
for x in range(i+1, 8):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break

return count

#36 ms\t13.6 MB
\n

问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。

\n","site":{"data":{}},"excerpt":"

999. 可以被一步捕获的棋子数

题目

","more":"

遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def numRookCaptures(self, board) -> int:
i = j = 0
for row in board:
if 'R' in row:
break
i += 1
j = row.index('R')
count = 0
# right
for x in range(j + 1, 8):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# left
for x in range(j, 0, -1):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# up
for x in range(i, 0, -1):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break
# down
for x in range(i+1, 8):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break

return count

#36 ms\t13.6 MB
\n

问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。

"},{"title":"leetcode-1103","date":"2020-04-01T03:22:20.000Z","mathjax":true,"_content":"\n### 1103. 分糖果 II\n\n[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/)\n\n\n\n\n\n\n\n小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。\n\n\n\n```python\nclass Solution:\n def distributeCandies(self, candies: int, num_people: int):\n total = 0\n i = 0\n # import ipdb; ipdb.set_trace()\n while total <= candies:\n t = (num_people*i)*num_people + int((1+num_people)*num_people/2)\n if total + t <= candies:\n total += t\n i += 1\n else:\n break\n remaining = candies - total\n print(total, remaining, i)\n l = []\n for n in range(1, num_people+1):\n if not total:\n current_candy = n\n else:\n current_candy = n+i*num_people\n\n n_count = int((0+(i-1))*(i)/2)\n print(current_candy, n_count)\n if remaining >= current_candy:\n l.append(n_count*num_people + n*i + current_candy)\n remaining -= current_candy\n else:\n l.append(n_count*num_people + n*i + remaining)\n remaining = 0\n return l\n# 28 ms\t13.7 MB,\n```\n","source":"_posts/2020-04-01-leetcode-1103.md","raw":"---\ntitle: leetcode-1103\ndate: 2020-04-01 11:22:20\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 1103. 分糖果 II\n\n[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/)\n\n\n\n\n\n\n\n小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。\n\n\n\n```python\nclass Solution:\n def distributeCandies(self, candies: int, num_people: int):\n total = 0\n i = 0\n # import ipdb; ipdb.set_trace()\n while total <= candies:\n t = (num_people*i)*num_people + int((1+num_people)*num_people/2)\n if total + t <= candies:\n total += t\n i += 1\n else:\n break\n remaining = candies - total\n print(total, remaining, i)\n l = []\n for n in range(1, num_people+1):\n if not total:\n current_candy = n\n else:\n current_candy = n+i*num_people\n\n n_count = int((0+(i-1))*(i)/2)\n print(current_candy, n_count)\n if remaining >= current_candy:\n l.append(n_count*num_people + n*i + current_candy)\n remaining -= current_candy\n else:\n l.append(n_count*num_people + n*i + remaining)\n remaining = 0\n return l\n# 28 ms\t13.7 MB,\n```\n","slug":"leetcode-1103","published":1,"updated":"2020-04-08T17:17:27.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4q000nsubuw1s0x6b6","content":"

1103. 分糖果 II

题目

\n\n

小学奥数题。主要思路就是等差数列求和 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def distributeCandies(self, candies: int, num_people: int):
total = 0
i = 0
# import ipdb; ipdb.set_trace()
while total <= candies:
t = (num_people*i)*num_people + int((1+num_people)*num_people/2)
if total + t <= candies:
total += t
i += 1
else:
break
remaining = candies - total
print(total, remaining, i)
l = []
for n in range(1, num_people+1):
if not total:
current_candy = n
else:
current_candy = n+i*num_people

n_count = int((0+(i-1))*(i)/2)
print(current_candy, n_count)
if remaining >= current_candy:
l.append(n_count*num_people + n*i + current_candy)
remaining -= current_candy
else:
l.append(n_count*num_people + n*i + remaining)
remaining = 0
return l
# 28 ms\t13.7 MB,
\n","site":{"data":{}},"excerpt":"

1103. 分糖果 II

题目

","more":"

小学奥数题。主要思路就是等差数列求和 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def distributeCandies(self, candies: int, num_people: int):
total = 0
i = 0
# import ipdb; ipdb.set_trace()
while total <= candies:
t = (num_people*i)*num_people + int((1+num_people)*num_people/2)
if total + t <= candies:
total += t
i += 1
else:
break
remaining = candies - total
print(total, remaining, i)
l = []
for n in range(1, num_people+1):
if not total:
current_candy = n
else:
current_candy = n+i*num_people

n_count = int((0+(i-1))*(i)/2)
print(current_candy, n_count)
if remaining >= current_candy:
l.append(n_count*num_people + n*i + current_candy)
remaining -= current_candy
else:
l.append(n_count*num_people + n*i + remaining)
remaining = 0
return l
# 28 ms\t13.7 MB,
\n"},{"title":"leetcode-1160","date":"2020-03-31T16:18:48.000Z","_content":"\n\n### 1160. 拼写单词\n\n[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/)\n\n\n\n\n\n\n\n利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word\n\n```python\nclass Solution:\n def countCharacters(self, words, chars: str) -> int:\n\n words_ = ''\n for w in words:\n lchars = list(chars)\n try:\n for l in w:\n lchars.remove(l)\n except:\n continue\n words_ += w\n\n return len(words_)\n# 152 ms\t14.1 MB\n```\n\n","source":"_posts/2020-04-01-leetcode-1160.md","raw":"---\ntitle: leetcode-1160\ndate: 2020-04-01 00:18:48\ntags:\ncategories: leetcode\n---\n\n\n### 1160. 拼写单词\n\n[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/)\n\n\n\n\n\n\n\n利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word\n\n```python\nclass Solution:\n def countCharacters(self, words, chars: str) -> int:\n\n words_ = ''\n for w in words:\n lchars = list(chars)\n try:\n for l in w:\n lchars.remove(l)\n except:\n continue\n words_ += w\n\n return len(words_)\n# 152 ms\t14.1 MB\n```\n\n","slug":"leetcode-1160","published":1,"updated":"2020-04-01T07:57:06.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4r000psubu38qpnnv7","content":"

1160. 拼写单词

题目

\n\n

利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def countCharacters(self, words, chars: str) -> int:

words_ = ''
for w in words:
lchars = list(chars)
try:
for l in w:
lchars.remove(l)
except:
continue
words_ += w

return len(words_)
# 152 ms\t14.1 MB
\n","site":{"data":{}},"excerpt":"

1160. 拼写单词

题目

","more":"

利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def countCharacters(self, words, chars: str) -> int:

words_ = ''
for w in words:
lchars = list(chars)
try:
for l in w:
lchars.remove(l)
except:
continue
words_ += w

return len(words_)
# 152 ms\t14.1 MB
"},{"title":"leetcode-compress-string-lcci","date":"2020-04-01T07:51:22.000Z","_content":"\n### 面试题 01.06. 字符串压缩\n\n[题目](https://leetcode-cn.com/problems/compress-string-lcci/)\n\n\n\n\n\n遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。\n\n\n\n```python\nclass Solution:\n def compressString(self, S: str) -> str:\n if not S:\n return S\n c = ''\n prev = S[0]\n p_len = 1\n for w in S[1:]:\n if w != prev:\n c += '%s%s' % (prev, p_len)\n prev = w\n p_len = 1\n else:\n p_len += 1\n c += '%s%s' % (prev, p_len)\n if len(S) > len(c):\n return c\n return S\n# 52 ms\t13.8 MB\n```\n\n","source":"_posts/2020-04-01-leetcode-compress-string-lcci.md","raw":"---\ntitle: leetcode-compress-string-lcci\ndate: 2020-04-01 15:51:22\ntags:\ncategories: leetcode\n---\n\n### 面试题 01.06. 字符串压缩\n\n[题目](https://leetcode-cn.com/problems/compress-string-lcci/)\n\n\n\n\n\n遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。\n\n\n\n```python\nclass Solution:\n def compressString(self, S: str) -> str:\n if not S:\n return S\n c = ''\n prev = S[0]\n p_len = 1\n for w in S[1:]:\n if w != prev:\n c += '%s%s' % (prev, p_len)\n prev = w\n p_len = 1\n else:\n p_len += 1\n c += '%s%s' % (prev, p_len)\n if len(S) > len(c):\n return c\n return S\n# 52 ms\t13.8 MB\n```\n\n","slug":"leetcode-compress-string-lcci","published":1,"updated":"2020-04-01T07:57:26.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4s000rsubusdeyspgy","content":"

面试题 01.06. 字符串压缩

题目

\n\n

遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def compressString(self, S: str) -> str:
if not S:
return S
c = ''
prev = S[0]
p_len = 1
for w in S[1:]:
if w != prev:
c += '%s%s' % (prev, p_len)
prev = w
p_len = 1
else:
p_len += 1
c += '%s%s' % (prev, p_len)
if len(S) > len(c):
return c
return S
# 52 ms\t13.8 MB
\n","site":{"data":{}},"excerpt":"

面试题 01.06. 字符串压缩

题目

","more":"

遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def compressString(self, S: str) -> str:
if not S:
return S
c = ''
prev = S[0]
p_len = 1
for w in S[1:]:
if w != prev:
c += '%s%s' % (prev, p_len)
prev = w
p_len = 1
else:
p_len += 1
c += '%s%s' % (prev, p_len)
if len(S) > len(c):
return c
return S
# 52 ms\t13.8 MB
"},{"title":"leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof","date":"2020-04-09T14:14:56.000Z","mathjax":true,"_content":"\n### 面试题57 - II. 和为s的连续正数序列\n\n[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/)\n\n\n\n\n\n\n\n又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。\n\n由小到大遍历 $n$,可以求得首项。\n\n```python\nimport math\nclass Solution:\n def findContinuousSequence(self, target: int):\n n = int(math.sqrt(2 * target) + 1)\n if n < 2:\n return []\n sum_list = []\n a = 0\n for i in range(2, n+1):\n a = ((2 * target) / i + 1 - i) / 2\n if a and not a % 1:\n a = int(a)\n s_ = []\n for j in range(0, i):\n s_.append(a + j)\n sum_list.append(s_)\n return sorted(sum_list)\n # 60 ms\t13.7 MB\n```\n","source":"_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md","raw":"---\ntitle: leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof\ndate: 2020-04-09 22:14:56\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 面试题57 - II. 和为s的连续正数序列\n\n[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/)\n\n\n\n\n\n\n\n又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。\n\n由小到大遍历 $n$,可以求得首项。\n\n```python\nimport math\nclass Solution:\n def findContinuousSequence(self, target: int):\n n = int(math.sqrt(2 * target) + 1)\n if n < 2:\n return []\n sum_list = []\n a = 0\n for i in range(2, n+1):\n a = ((2 * target) / i + 1 - i) / 2\n if a and not a % 1:\n a = int(a)\n s_ = []\n for j in range(0, i):\n s_.append(a + j)\n sum_list.append(s_)\n return sorted(sum_list)\n # 60 ms\t13.7 MB\n```\n","slug":"leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof","published":1,"updated":"2020-04-14T15:29:40.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4t000tsubuyl29244j","content":"

面试题57 - II. 和为s的连续正数序列

题目

\n\n

又是小学奥数。由等差数列求和公式 可知,当首项为 1 的时候项数最多,又由于是连续正整数,,那最大的 就不大于

\n

由小到大遍历 ,可以求得首项。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Solution:
def findContinuousSequence(self, target: int):
n = int(math.sqrt(2 * target) + 1)
if n < 2:
return []
sum_list = []
a = 0
for i in range(2, n+1):
a = ((2 * target) / i + 1 - i) / 2
if a and not a % 1:
a = int(a)
s_ = []
for j in range(0, i):
s_.append(a + j)
sum_list.append(s_)
return sorted(sum_list)
# 60 ms\t13.7 MB
\n","site":{"data":{}},"excerpt":"

面试题57 - II. 和为s的连续正数序列

题目

","more":"

又是小学奥数。由等差数列求和公式 可知,当首项为 1 的时候项数最多,又由于是连续正整数,,那最大的 就不大于

\n

由小到大遍历 ,可以求得首项。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Solution:
def findContinuousSequence(self, target: int):
n = int(math.sqrt(2 * target) + 1)
if n < 2:
return []
sum_list = []
a = 0
for i in range(2, n+1):
a = ((2 * target) / i + 1 - i) / 2
if a and not a % 1:
a = int(a)
s_ = []
for j in range(0, i):
s_.append(a + j)
sum_list.append(s_)
return sorted(sum_list)
# 60 ms\t13.7 MB
\n"},{"title":"leetcode-add-two-numbers-ii","date":"2020-04-14T15:22:39.000Z","_content":"\n### 445. 两数相加 II\n\n[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/)\n\n\n\n\n\n\n\n看到顺序的链表就想到用倒序链表的方法做,折腾了半天\n\n\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n def _reverse(l):\n if l.next:\n last = _reverse(l.next)\n l.next.next = l\n l.next = None\n return last\n return l\n\n l1e = _reverse(l1)\n l2e = _reverse(l2)\n new_l = ListNode(0)\n head = new_l\n c = 0\n import ipdb; ipdb.set_trace()\n while l1e and l2e:\n new_val = l1e.val + l2e.val\n if c==1:\n new_val += 1\n c = 0\n if new_val >= 10:\n new_val -= 10\n c = 1\n\n new_l.val = new_val\n next_n = None\n if l1e.next and l2e.next or c:\n next_n = ListNode(c)\n new_l.next = next_n\n new_l = next_n\n l1e = l1e.next\n l2e = l2e.next\n if l2e:\n l1e = l2e\n if not l1e and c:\n l1e = ListNode(0)\n while l1e:\n new_l.val = l1e.val\n new_l.val += c\n c = 0\n if new_l.val >= 10:\n c = 1\n new_l.val -= 10\n l1e = l1e.next\n if l1e:\n new_l.next = ListNode(0)\n new_l = new_l.next\n else:\n new_l.next = ListNode(1)\n\n return _reverse(head)\n\n # 84 ms\t13.9 MB\n```\n\n最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。\n\n```python\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n s1, s2 = [], []\n while l1:\n s1.append(l1.val)\n l1 = l1.next\n while l2:\n s2.append(l2.val)\n l2 = l2.next\n ans = None\n carry = 0\n while s1 or s2 or carry != 0:\n a = 0 if not s1 else s1.pop()\n b = 0 if not s2 else s2.pop()\n cur = a + b + carry\n carry = cur // 10\n cur %= 10\n curnode = ListNode(cur)\n curnode.next = ans\n ans = curnode\n return ans\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n不过就执行效率来看差不多。\n","source":"_posts/2020-04-14-leetcode-add-two-numbers-ii.md","raw":"---\ntitle: leetcode-add-two-numbers-ii\ndate: 2020-04-14 23:22:39\ntags:\ncategories: leetcode\n---\n\n### 445. 两数相加 II\n\n[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/)\n\n\n\n\n\n\n\n看到顺序的链表就想到用倒序链表的方法做,折腾了半天\n\n\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n def _reverse(l):\n if l.next:\n last = _reverse(l.next)\n l.next.next = l\n l.next = None\n return last\n return l\n\n l1e = _reverse(l1)\n l2e = _reverse(l2)\n new_l = ListNode(0)\n head = new_l\n c = 0\n import ipdb; ipdb.set_trace()\n while l1e and l2e:\n new_val = l1e.val + l2e.val\n if c==1:\n new_val += 1\n c = 0\n if new_val >= 10:\n new_val -= 10\n c = 1\n\n new_l.val = new_val\n next_n = None\n if l1e.next and l2e.next or c:\n next_n = ListNode(c)\n new_l.next = next_n\n new_l = next_n\n l1e = l1e.next\n l2e = l2e.next\n if l2e:\n l1e = l2e\n if not l1e and c:\n l1e = ListNode(0)\n while l1e:\n new_l.val = l1e.val\n new_l.val += c\n c = 0\n if new_l.val >= 10:\n c = 1\n new_l.val -= 10\n l1e = l1e.next\n if l1e:\n new_l.next = ListNode(0)\n new_l = new_l.next\n else:\n new_l.next = ListNode(1)\n\n return _reverse(head)\n\n # 84 ms\t13.9 MB\n```\n\n最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。\n\n```python\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n s1, s2 = [], []\n while l1:\n s1.append(l1.val)\n l1 = l1.next\n while l2:\n s2.append(l2.val)\n l2 = l2.next\n ans = None\n carry = 0\n while s1 or s2 or carry != 0:\n a = 0 if not s1 else s1.pop()\n b = 0 if not s2 else s2.pop()\n cur = a + b + carry\n carry = cur // 10\n cur %= 10\n curnode = ListNode(cur)\n curnode.next = ans\n ans = curnode\n return ans\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n不过就执行效率来看差不多。\n","slug":"leetcode-add-two-numbers-ii","published":1,"updated":"2020-04-14T15:28:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4u000vsubuzq7vic3v","content":"

445. 两数相加 II

题目

\n\n

看到顺序的链表就想到用倒序链表的方法做,折腾了半天

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def _reverse(l):
if l.next:
last = _reverse(l.next)
l.next.next = l
l.next = None
return last
return l

l1e = _reverse(l1)
l2e = _reverse(l2)
new_l = ListNode(0)
head = new_l
c = 0
import ipdb; ipdb.set_trace()
while l1e and l2e:
new_val = l1e.val + l2e.val
if c==1:
new_val += 1
c = 0
if new_val >= 10:
new_val -= 10
c = 1

new_l.val = new_val
next_n = None
if l1e.next and l2e.next or c:
next_n = ListNode(c)
new_l.next = next_n
new_l = next_n
l1e = l1e.next
l2e = l2e.next
if l2e:
l1e = l2e
if not l1e and c:
l1e = ListNode(0)
while l1e:
new_l.val = l1e.val
new_l.val += c
c = 0
if new_l.val >= 10:
c = 1
new_l.val -= 10
l1e = l1e.next
if l1e:
new_l.next = ListNode(0)
new_l = new_l.next
else:
new_l.next = ListNode(1)

return _reverse(head)

# 84 ms\t13.9 MB
\n

最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
s1, s2 = [], []
while l1:
s1.append(l1.val)
l1 = l1.next
while l2:
s2.append(l2.val)
l2 = l2.next
ans = None
carry = 0
while s1 or s2 or carry != 0:
a = 0 if not s1 else s1.pop()
b = 0 if not s2 else s2.pop()
cur = a + b + carry
carry = cur // 10
cur %= 10
curnode = ListNode(cur)
curnode.next = ans
ans = curnode
return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n

不过就执行效率来看差不多。

\n","site":{"data":{}},"excerpt":"

445. 两数相加 II

题目

","more":"

看到顺序的链表就想到用倒序链表的方法做,折腾了半天

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def _reverse(l):
if l.next:
last = _reverse(l.next)
l.next.next = l
l.next = None
return last
return l

l1e = _reverse(l1)
l2e = _reverse(l2)
new_l = ListNode(0)
head = new_l
c = 0
import ipdb; ipdb.set_trace()
while l1e and l2e:
new_val = l1e.val + l2e.val
if c==1:
new_val += 1
c = 0
if new_val >= 10:
new_val -= 10
c = 1

new_l.val = new_val
next_n = None
if l1e.next and l2e.next or c:
next_n = ListNode(c)
new_l.next = next_n
new_l = next_n
l1e = l1e.next
l2e = l2e.next
if l2e:
l1e = l2e
if not l1e and c:
l1e = ListNode(0)
while l1e:
new_l.val = l1e.val
new_l.val += c
c = 0
if new_l.val >= 10:
c = 1
new_l.val -= 10
l1e = l1e.next
if l1e:
new_l.next = ListNode(0)
new_l = new_l.next
else:
new_l.next = ListNode(1)

return _reverse(head)

# 84 ms\t13.9 MB
\n

最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
s1, s2 = [], []
while l1:
s1.append(l1.val)
l1 = l1.next
while l2:
s2.append(l2.val)
l2 = l2.next
ans = None
carry = 0
while s1 or s2 or carry != 0:
a = 0 if not s1 else s1.pop()
b = 0 if not s2 else s2.pop()
cur = a + b + carry
carry = cur // 10
cur %= 10
curnode = ListNode(cur)
curnode.next = ans
ans = curnode
return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n

不过就执行效率来看差不多。

"},{"title":"leetcode-the-masseuse-lcci","date":"2020-04-08T16:35:26.000Z","mathjax":true,"_content":"\n### 面试题 17.16. 按摩师\n\n[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/)\n\n\n\n\n\n\n\n一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。\n\n\n\n那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$\n\n不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$\n\n最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$\n\n\n\n```python\nclass Solution:\n def massage(self, nums) -> int:\n if not nums:\n return 0\n n = len(nums)\n not_choose = 0\n choose = 0\n for n in nums:\n not_choose, choose = max(not_choose, choose), not_choose+n\n return max(not_choose, choose)\n # 52 ms\t13.6 MB\n```\n\n\n\n这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。\n","source":"_posts/2020-04-09-leetcode-the-masseuse-lcci.md","raw":"---\ntitle: leetcode-the-masseuse-lcci\ndate: 2020-04-09 00:35:26\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 面试题 17.16. 按摩师\n\n[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/)\n\n\n\n\n\n\n\n一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。\n\n\n\n那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$\n\n不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$\n\n最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$\n\n\n\n```python\nclass Solution:\n def massage(self, nums) -> int:\n if not nums:\n return 0\n n = len(nums)\n not_choose = 0\n choose = 0\n for n in nums:\n not_choose, choose = max(not_choose, choose), not_choose+n\n return max(not_choose, choose)\n # 52 ms\t13.6 MB\n```\n\n\n\n这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。\n","slug":"leetcode-the-masseuse-lcci","published":1,"updated":"2020-04-08T17:14:04.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4v000xsubu9bmmz6rr","content":"

面试题 17.16. 按摩师

题目

\n\n

一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 时刻, 为当前预约不接的情况下最长预约时间, 则为接受当前预约的最长预约时间。

\n

那很显然,由于不能接受相邻两个预约,

\n

不接受当前预约的话,上一个预约接不接受都可以,

\n

最后只要比较两种情况即可

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def massage(self, nums) -> int:
if not nums:
return 0
n = len(nums)
not_choose = 0
choose = 0
for n in nums:
not_choose, choose = max(not_choose, choose), not_choose+n
return max(not_choose, choose)
# 52 ms\t13.6 MB
\n

这种问题原来有个名字叫动态规划,上面推导的方程叫状态转移方程,可以找找资料来看一下。

\n","site":{"data":{}},"excerpt":"

面试题 17.16. 按摩师

题目

","more":"

一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 时刻, 为当前预约不接的情况下最长预约时间, 则为接受当前预约的最长预约时间。

\n

那很显然,由于不能接受相邻两个预约,

\n

不接受当前预约的话,上一个预约接不接受都可以,

\n

最后只要比较两种情况即可

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def massage(self, nums) -> int:
if not nums:
return 0
n = len(nums)
not_choose = 0
choose = 0
for n in nums:
not_choose, choose = max(not_choose, choose), not_choose+n
return max(not_choose, choose)
# 52 ms\t13.6 MB
\n

这种问题原来有个名字叫动态规划,上面推导的方程叫状态转移方程,可以找找资料来看一下。

\n"},{"title":"leetcode-01-matrix","date":"2020-04-16T04:26:34.000Z","_content":"\n### 542. 01 矩阵\n\n[题目](https://leetcode-cn.com/problems/01-matrix/)\n\n\n\n\n\n\n\n想了两种思路\n\n1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。\n\n ```python\n class Solution:\n def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:\n m, n = len(matrix), len(matrix[0])\n dist = [[0] * n for _ in range(m)]\n zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]\n # 将所有的 0 添加进初始队列中\n q = collections.deque(zeroes_pos)\n seen = set(zeroes_pos)\n\n # 广度优先搜索\n while q:\n i, j = q.popleft()\n for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:\n if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:\n dist[ni][nj] = dist[i][j] + 1\n q.append((ni, nj))\n seen.add((ni, nj))\n\n return dist\n ```\n\n\n\n2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。\n\n","source":"_posts/2020-04-16-leetcode-01-matrix.md","raw":"---\ntitle: leetcode-01-matrix\ndate: 2020-04-16 12:26:34\ntags:\ncategories: leetcode\n---\n\n### 542. 01 矩阵\n\n[题目](https://leetcode-cn.com/problems/01-matrix/)\n\n\n\n\n\n\n\n想了两种思路\n\n1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。\n\n ```python\n class Solution:\n def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:\n m, n = len(matrix), len(matrix[0])\n dist = [[0] * n for _ in range(m)]\n zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]\n # 将所有的 0 添加进初始队列中\n q = collections.deque(zeroes_pos)\n seen = set(zeroes_pos)\n\n # 广度优先搜索\n while q:\n i, j = q.popleft()\n for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:\n if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:\n dist[ni][nj] = dist[i][j] + 1\n q.append((ni, nj))\n seen.add((ni, nj))\n\n return dist\n ```\n\n\n\n2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。\n\n","slug":"leetcode-01-matrix","published":1,"updated":"2020-04-16T04:26:56.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4w000zsubuceivn0ao","content":"

542. 01 矩阵

题目

\n\n

想了两种思路

\n
    \n
  1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
    m, n = len(matrix), len(matrix[0])
    dist = [[0] * n for _ in range(m)]
    zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
    # 将所有的 0 添加进初始队列中
    q = collections.deque(zeroes_pos)
    seen = set(zeroes_pos)

    # 广度优先搜索
    while q:
    i, j = q.popleft()
    for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
    if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
    dist[ni][nj] = dist[i][j] + 1
    q.append((ni, nj))
    seen.add((ni, nj))

    return dist
    \n
  2. \n
  3. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

    \n
  4. \n
\n","site":{"data":{}},"excerpt":"

542. 01 矩阵

题目

","more":"

想了两种思路

\n
    \n
  1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
    m, n = len(matrix), len(matrix[0])
    dist = [[0] * n for _ in range(m)]
    zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
    # 将所有的 0 添加进初始队列中
    q = collections.deque(zeroes_pos)
    seen = set(zeroes_pos)

    # 广度优先搜索
    while q:
    i, j = q.popleft()
    for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
    if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
    dist[ni][nj] = dist[i][j] + 1
    q.append((ni, nj))
    seen.add((ni, nj))

    return dist
    \n
  2. \n
  3. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

    \n
  4. \n
"},{"title":"leetcode-design-twitter","date":"2020-04-14T08:11:41.000Z","_content":"\n### 355. 设计推特\n\n[题目](https://leetcode-cn.com/problems/design-twitter/)\n\n\n\n\n\n做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 `twitterId` 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。\n\n主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。\n\n\n\n```python\nclass Twitter:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.tweets = {}\n self.followers = {}\n self._tid = 0\n\n\n def postTweet(self, userId: int, tweetId: int) -> None:\n \"\"\"\n Compose a new tweet.\n \"\"\"\n if not self.tweets.get(userId):\n self.tweets[userId] = []\n self.tweets[userId].append((self._tid, tweetId))\n self._tid += 1\n\n\n def getNewsFeed(self, userId: int) :\n \"\"\"\n Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.\n \"\"\"\n foers = self.followers.get(userId, set())\n foers = foers.union((userId,))\n tweets = []\n for fo in foers:\n tweets.extend(self.tweets.get(fo, [])[-10:])\n return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]\n\n\n def follow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower follows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n self.followers[followerId].add(followeeId)\n\n\n def unfollow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower unfollows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n if followeeId in self.followers[followerId]:\n self.followers[followerId].remove(followeeId)\n\n#100 ms\t19.2 MB\n\n# Your Twitter object will be instantiated and called as such:\n# obj = Twitter()\n# obj.postTweet(userId,tweetId)\n# param_2 = obj.getNewsFeed(userId)\n# obj.follow(followerId,followeeId)\n# obj.unfollow(followerId,followeeId)\n```\n\n","source":"_posts/2020-04-14-leetcode-design-twitter.md","raw":"---\ntitle: leetcode-design-twitter\ndate: 2020-04-14 16:11:41\ntags:\ncategories: leetcode\n---\n\n### 355. 设计推特\n\n[题目](https://leetcode-cn.com/problems/design-twitter/)\n\n\n\n\n\n做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 `twitterId` 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。\n\n主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。\n\n\n\n```python\nclass Twitter:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.tweets = {}\n self.followers = {}\n self._tid = 0\n\n\n def postTweet(self, userId: int, tweetId: int) -> None:\n \"\"\"\n Compose a new tweet.\n \"\"\"\n if not self.tweets.get(userId):\n self.tweets[userId] = []\n self.tweets[userId].append((self._tid, tweetId))\n self._tid += 1\n\n\n def getNewsFeed(self, userId: int) :\n \"\"\"\n Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.\n \"\"\"\n foers = self.followers.get(userId, set())\n foers = foers.union((userId,))\n tweets = []\n for fo in foers:\n tweets.extend(self.tweets.get(fo, [])[-10:])\n return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]\n\n\n def follow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower follows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n self.followers[followerId].add(followeeId)\n\n\n def unfollow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower unfollows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n if followeeId in self.followers[followerId]:\n self.followers[followerId].remove(followeeId)\n\n#100 ms\t19.2 MB\n\n# Your Twitter object will be instantiated and called as such:\n# obj = Twitter()\n# obj.postTweet(userId,tweetId)\n# param_2 = obj.getNewsFeed(userId)\n# obj.follow(followerId,followeeId)\n# obj.unfollow(followerId,followeeId)\n```\n\n","slug":"leetcode-design-twitter","published":1,"updated":"2020-04-14T15:29:34.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4x0011subuv9wxy1bt","content":"

355. 设计推特

题目

\n\n

做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 twitterId 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。

\n

主要的考点应该是 多路归并 这个东西。我用的是排序,在数据量大的时候应该会有些问题。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Twitter:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.tweets = {}
self.followers = {}
self._tid = 0


def postTweet(self, userId: int, tweetId: int) -> None:
\"\"\"
Compose a new tweet.
\"\"\"
if not self.tweets.get(userId):
self.tweets[userId] = []
self.tweets[userId].append((self._tid, tweetId))
self._tid += 1


def getNewsFeed(self, userId: int) :
\"\"\"
Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
\"\"\"
foers = self.followers.get(userId, set())
foers = foers.union((userId,))
tweets = []
for fo in foers:
tweets.extend(self.tweets.get(fo, [])[-10:])
return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]


def follow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower follows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
self.followers[followerId].add(followeeId)


def unfollow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower unfollows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
if followeeId in self.followers[followerId]:
self.followers[followerId].remove(followeeId)

#100 ms\t19.2 MB

# Your Twitter object will be instantiated and called as such:
# obj = Twitter()
# obj.postTweet(userId,tweetId)
# param_2 = obj.getNewsFeed(userId)
# obj.follow(followerId,followeeId)
# obj.unfollow(followerId,followeeId)
\n","site":{"data":{}},"excerpt":"

355. 设计推特

题目

","more":"

做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 twitterId 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。

\n

主要的考点应该是 多路归并 这个东西。我用的是排序,在数据量大的时候应该会有些问题。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Twitter:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.tweets = {}
self.followers = {}
self._tid = 0


def postTweet(self, userId: int, tweetId: int) -> None:
\"\"\"
Compose a new tweet.
\"\"\"
if not self.tweets.get(userId):
self.tweets[userId] = []
self.tweets[userId].append((self._tid, tweetId))
self._tid += 1


def getNewsFeed(self, userId: int) :
\"\"\"
Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
\"\"\"
foers = self.followers.get(userId, set())
foers = foers.union((userId,))
tweets = []
for fo in foers:
tweets.extend(self.tweets.get(fo, [])[-10:])
return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]


def follow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower follows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
self.followers[followerId].add(followeeId)


def unfollow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower unfollows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
if followeeId in self.followers[followerId]:
self.followers[followerId].remove(followeeId)

#100 ms\t19.2 MB

# Your Twitter object will be instantiated and called as such:
# obj = Twitter()
# obj.postTweet(userId,tweetId)
# param_2 = obj.getNewsFeed(userId)
# obj.follow(followerId,followeeId)
# obj.unfollow(followerId,followeeId)
"},{"title":"leetcode-merge-intervals","date":"2020-04-16T11:22:26.000Z","_content":"\n\n### 56. 合并区间\n\n\n\n[题目](https://leetcode-cn.com/problems/merge-intervals/)\n\n\n\n\n\n\n\n首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。\n\n\n\n```python\nclass Solution:\n def merge(self, intervals):\n if not intervals:\n return []\n intervals.sort()\n merged = []\n l = len(intervals)\n m = intervals[0]\n for x in range(l-1):\n j = intervals[x+1]\n if m[1] >= j[0]:\n if m[1] <= j[1]:\n m = [m[0], j[1]]\n else:\n continue\n else:\n merged.append(m)\n m = j\n if m:\n merged.append(m)\n return merged\n```\n\n\n\n","source":"_posts/2020-04-16-leetcode-merge-intervals.md","raw":"---\ntitle: leetcode-merge-intervals\ndate: 2020-04-16 19:22:26\ntags:\ncategories: leetcode\n---\n\n\n### 56. 合并区间\n\n\n\n[题目](https://leetcode-cn.com/problems/merge-intervals/)\n\n\n\n\n\n\n\n首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。\n\n\n\n```python\nclass Solution:\n def merge(self, intervals):\n if not intervals:\n return []\n intervals.sort()\n merged = []\n l = len(intervals)\n m = intervals[0]\n for x in range(l-1):\n j = intervals[x+1]\n if m[1] >= j[0]:\n if m[1] <= j[1]:\n m = [m[0], j[1]]\n else:\n continue\n else:\n merged.append(m)\n m = j\n if m:\n merged.append(m)\n return merged\n```\n\n\n\n","slug":"leetcode-merge-intervals","published":1,"updated":"2020-04-16T11:22:48.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4y0013subufp1wokx0","content":"

56. 合并区间

题目

\n\n

首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def merge(self, intervals):
if not intervals:
return []
intervals.sort()
merged = []
l = len(intervals)
m = intervals[0]
for x in range(l-1):
j = intervals[x+1]
if m[1] >= j[0]:
if m[1] <= j[1]:
m = [m[0], j[1]]
else:
continue
else:
merged.append(m)
m = j
if m:
merged.append(m)
return merged
\n","site":{"data":{}},"excerpt":"

56. 合并区间

题目

","more":"

首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def merge(self, intervals):
if not intervals:
return []
intervals.sort()
merged = []
l = len(intervals)
m = intervals[0]
for x in range(l-1):
j = intervals[x+1]
if m[1] >= j[0]:
if m[1] <= j[1]:
m = [m[0], j[1]]
else:
continue
else:
merged.append(m)
m = j
if m:
merged.append(m)
return merged
"},{"title":"leetcode-number-of-islands","date":"2020-04-21T04:55:17.000Z","_content":"\n### 200. 岛屿数量\n\n\n\n[题目](https://leetcode-cn.com/problems/number-of-islands/)\n\n\n\n\n\n\n\n这种矩阵题现在第一反应就是用[广度优先搜索][0]做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。\n\n\n\n```python\nimport collections\nclass Solution:\n def numIslands(self, grid) -> int:\n rows = len(grid)\n if not rows:\n return 0\n cols = len(grid[0])\n islands = 0\n for r in range(rows):\n for l in range(cols):\n if grid[r][l] == '1':\n islands += 1\n grid[r][l] = '0'\n neighbors = collections.deque([(r, l)])\n while neighbors:\n x, y = neighbors.popleft()\n for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:\n if 0<=x_\n\n\n\n这种矩阵题现在第一反应就是用[广度优先搜索][0]做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。\n\n\n\n```python\nimport collections\nclass Solution:\n def numIslands(self, grid) -> int:\n rows = len(grid)\n if not rows:\n return 0\n cols = len(grid[0])\n islands = 0\n for r in range(rows):\n for l in range(cols):\n if grid[r][l] == '1':\n islands += 1\n grid[r][l] = '0'\n neighbors = collections.deque([(r, l)])\n while neighbors:\n x, y = neighbors.popleft()\n for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:\n if 0<=x_200. 岛屿数量

题目

\n\n

这种矩阵题现在第一反应就是用广度优先搜索做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import collections
class Solution:
def numIslands(self, grid) -> int:
rows = len(grid)
if not rows:
return 0
cols = len(grid[0])
islands = 0
for r in range(rows):
for l in range(cols):
if grid[r][l] == '1':
islands += 1
grid[r][l] = '0'
neighbors = collections.deque([(r, l)])
while neighbors:
x, y = neighbors.popleft()
for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:
if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':
neighbors.append([x_, y_])
grid[x_][y_] = '0'
return islands
\n","site":{"data":{}},"excerpt":"

200. 岛屿数量

题目

","more":"

这种矩阵题现在第一反应就是用广度优先搜索做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import collections
class Solution:
def numIslands(self, grid) -> int:
rows = len(grid)
if not rows:
return 0
cols = len(grid[0])
islands = 0
for r in range(rows):
for l in range(cols):
if grid[r][l] == '1':
islands += 1
grid[r][l] = '0'
neighbors = collections.deque([(r, l)])
while neighbors:
x, y = neighbors.popleft()
for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:
if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':
neighbors.append([x_, y_])
grid[x_][y_] = '0'
return islands
"},{"title":"leetcode-string-to-integer-atoi","date":"2020-04-16T11:50:10.000Z","_content":"\n### 8. 字符串转换整数 (atoi)\n\n[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/)\n\n\n\n\n\n\n\n没什么好说的,注意各种情况,识别到数字之后就一直要是数字。\n\n\n\n```python\nclass Solution:\n def myAtoi(self, str: str) -> int:\n p = ''\n str = str.lstrip()\n n = ''\n min_int = -2**31\n max_int = 2**31-1\n isnumeric = False\n for x in str:\n if not isnumeric and x == '-':\n p = '-'\n isnumeric = True\n continue\n if not isnumeric and x == '+':\n isnumeric = True\n continue\n if x.isnumeric():\n n += x\n isnumeric = True\n else:\n break\n if not n:\n return 0\n if int(n) > max_int:\n if p:\n return min_int\n else:\n return max_int\n p += n\n return int(p)\n# 32 ms\t13.6 MB\n```\n\n","source":"_posts/2020-04-16-leetcode-string-to-integer-atoi.md","raw":"---\ntitle: leetcode-string-to-integer-atoi\ndate: 2020-04-16 19:50:10\ntags:\ncategories: leetcode\n---\n\n### 8. 字符串转换整数 (atoi)\n\n[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/)\n\n\n\n\n\n\n\n没什么好说的,注意各种情况,识别到数字之后就一直要是数字。\n\n\n\n```python\nclass Solution:\n def myAtoi(self, str: str) -> int:\n p = ''\n str = str.lstrip()\n n = ''\n min_int = -2**31\n max_int = 2**31-1\n isnumeric = False\n for x in str:\n if not isnumeric and x == '-':\n p = '-'\n isnumeric = True\n continue\n if not isnumeric and x == '+':\n isnumeric = True\n continue\n if x.isnumeric():\n n += x\n isnumeric = True\n else:\n break\n if not n:\n return 0\n if int(n) > max_int:\n if p:\n return min_int\n else:\n return max_int\n p += n\n return int(p)\n# 32 ms\t13.6 MB\n```\n\n","slug":"leetcode-string-to-integer-atoi","published":1,"updated":"2020-04-16T11:56:40.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk500017subu3v0ql53e","content":"

8. 字符串转换整数 (atoi)

题目

\n\n

没什么好说的,注意各种情况,识别到数字之后就一直要是数字。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def myAtoi(self, str: str) -> int:
p = ''
str = str.lstrip()
n = ''
min_int = -2**31
max_int = 2**31-1
isnumeric = False
for x in str:
if not isnumeric and x == '-':
p = '-'
isnumeric = True
continue
if not isnumeric and x == '+':
isnumeric = True
continue
if x.isnumeric():
n += x
isnumeric = True
else:
break
if not n:
return 0
if int(n) > max_int:
if p:
return min_int
else:
return max_int
p += n
return int(p)
# 32 ms\t13.6 MB
\n","site":{"data":{}},"excerpt":"

8. 字符串转换整数 (atoi)

题目

","more":"

没什么好说的,注意各种情况,识别到数字之后就一直要是数字。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def myAtoi(self, str: str) -> int:
p = ''
str = str.lstrip()
n = ''
min_int = -2**31
max_int = 2**31-1
isnumeric = False
for x in str:
if not isnumeric and x == '-':
p = '-'
isnumeric = True
continue
if not isnumeric and x == '+':
isnumeric = True
continue
if x.isnumeric():
n += x
isnumeric = True
else:
break
if not n:
return 0
if int(n) > max_int:
if p:
return min_int
else:
return max_int
p += n
return int(p)
# 32 ms\t13.6 MB
"},{"title":"Postgresql Partitioning","date":"2019-03-11T16:08:48.000Z","_content":"\n`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces.\n\nCurrently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set.\n\nThere are two forms of partitioning can be implemented in PostgreSQL:\n\n* Range Partitioning\n\n ​\tThe table is partitioning into \"range\" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.\n\n* List Partitioning\n\n ​\tThe table is partitioned by explicitly listing which key values appear in each partition.\n\n### Implementing Partitioning\n\n1. Create the \"master\" / \"parent\" table, from which all the partitions will inherit.\n\n ​\tThis table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.\n\n2. Create \"child\" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. \n\n3. Add table constraints to the partition tables to define the allowed key values in each partitions. \n\n ​\tEnsure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. \n\n4. Create indexes on column(s) for each partitions.\n\n5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.\n\n6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired.\n\n### Trigger\n\nAs we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.\n\n","source":"_posts/Postgresql Partitioning.md","raw":"---\ntitle: Postgresql Partitioning\ndate: 2019-03-12 00:08:48\ntags:\n---\n\n`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces.\n\nCurrently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set.\n\nThere are two forms of partitioning can be implemented in PostgreSQL:\n\n* Range Partitioning\n\n ​\tThe table is partitioning into \"range\" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.\n\n* List Partitioning\n\n ​\tThe table is partitioned by explicitly listing which key values appear in each partition.\n\n### Implementing Partitioning\n\n1. Create the \"master\" / \"parent\" table, from which all the partitions will inherit.\n\n ​\tThis table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.\n\n2. Create \"child\" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. \n\n3. Add table constraints to the partition tables to define the allowed key values in each partitions. \n\n ​\tEnsure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. \n\n4. Create indexes on column(s) for each partitions.\n\n5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.\n\n6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired.\n\n### Trigger\n\nAs we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.\n\n","slug":"Postgresql-Partitioning","published":1,"updated":"2019-11-14T08:01:50.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk510019subuzokyjrq6","content":"

Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

\n

Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

\n

There are two forms of partitioning can be implemented in PostgreSQL:

\n
    \n
  • Range Partitioning

    \n

    ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

    \n
  • \n
  • List Partitioning

    \n

    ​ The table is partitioned by explicitly listing which key values appear in each partition.

    \n
  • \n
\n

Implementing Partitioning

    \n
  1. Create the “master” / “parent” table, from which all the partitions will inherit.

    \n

    ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

    \n
  2. \n
  3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

    \n
  4. \n
  5. Add table constraints to the partition tables to define the allowed key values in each partitions.

    \n

    ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

    \n
  6. \n
  7. Create indexes on column(s) for each partitions.

    \n
  8. \n
  9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

    \n
  10. \n
  11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

    \n
  12. \n
\n

Trigger

As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

\n","site":{"data":{}},"excerpt":"","more":"

Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

\n

Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

\n

There are two forms of partitioning can be implemented in PostgreSQL:

\n
    \n
  • Range Partitioning

    \n

    ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

    \n
  • \n
  • List Partitioning

    \n

    ​ The table is partitioned by explicitly listing which key values appear in each partition.

    \n
  • \n
\n

Implementing Partitioning

    \n
  1. Create the “master” / “parent” table, from which all the partitions will inherit.

    \n

    ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

    \n
  2. \n
  3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

    \n
  4. \n
  5. Add table constraints to the partition tables to define the allowed key values in each partitions.

    \n

    ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

    \n
  6. \n
  7. Create indexes on column(s) for each partitions.

    \n
  8. \n
  9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

    \n
  10. \n
  11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

    \n
  12. \n
\n

Trigger

As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

\n"},{"title":"Django Manager Method","date":"2016-04-24T16:00:01.000Z","_content":"\n\n\n#### Django Manager\n\nDjango 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。\n\neg.\n\n```python\nfrom django.db import models\n\nclass Person(models.Model):\n\t...\n\tpeople = models.Manager()\n```\n\n上面这个 model,`Person.objects`会产生一个`AttributeError`,但是`Person.people`就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。\n\n#### 自定义 Manager\n\n通常需要自定义 manager 的情况有两点:\n\n1. 需要修改/扩展 Django 的 manager 方法\n2. 需要修改返回的 QuerySet\n\n#### 默认 Manager\n\n如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。\n\n笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。\n\neg.\n\n```python\nclass Book(models.Model):\n\ttitle = models.CharField(max_length=100)\n\tauthor = models.CharField(max_length=50)\n\t\n\tobjects = models.Manager() # default manager\n\tcustom_objects = CustomBOokManager() # custom manager\n```\n\n\n\n[source](http://blog.csdn.net/sicofield/article/details/49283751)\n\n\n\n","source":"_posts/Django-Manager-Method.md","raw":"---\ntitle: Django Manager Method\ndate: 2016-04-25 00:00:01\n---\n\n\n\n#### Django Manager\n\nDjango 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。\n\neg.\n\n```python\nfrom django.db import models\n\nclass Person(models.Model):\n\t...\n\tpeople = models.Manager()\n```\n\n上面这个 model,`Person.objects`会产生一个`AttributeError`,但是`Person.people`就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。\n\n#### 自定义 Manager\n\n通常需要自定义 manager 的情况有两点:\n\n1. 需要修改/扩展 Django 的 manager 方法\n2. 需要修改返回的 QuerySet\n\n#### 默认 Manager\n\n如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。\n\n笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。\n\neg.\n\n```python\nclass Book(models.Model):\n\ttitle = models.CharField(max_length=100)\n\tauthor = models.CharField(max_length=50)\n\t\n\tobjects = models.Manager() # default manager\n\tcustom_objects = CustomBOokManager() # custom manager\n```\n\n\n\n[source](http://blog.csdn.net/sicofield/article/details/49283751)\n\n\n\n","slug":"Django-Manager-Method","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk52001bsubuwh45f7em","content":"

Django Manager

Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

\n

eg.

\n
1
2
3
4
5
from django.db import models

class Person(models.Model):
\t...
\tpeople = models.Manager()
\n

上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

\n

自定义 Manager

通常需要自定义 manager 的情况有两点:

\n
    \n
  1. 需要修改/扩展 Django 的 manager 方法
  2. \n
  3. 需要修改返回的 QuerySet
  4. \n
\n

默认 Manager

如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

\n

笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

\n

eg.

\n
1
2
3
4
5
6
class Book(models.Model):
\ttitle = models.CharField(max_length=100)
\tauthor = models.CharField(max_length=50)
\t
\tobjects = models.Manager() # default manager
\tcustom_objects = CustomBOokManager() # custom manager
\n

source

\n","site":{"data":{}},"excerpt":"","more":"

Django Manager

Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

\n

eg.

\n
1
2
3
4
5
from django.db import models

class Person(models.Model):
\t...
\tpeople = models.Manager()
\n

上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

\n

自定义 Manager

通常需要自定义 manager 的情况有两点:

\n
    \n
  1. 需要修改/扩展 Django 的 manager 方法
  2. \n
  3. 需要修改返回的 QuerySet
  4. \n
\n

默认 Manager

如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

\n

笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

\n

eg.

\n
1
2
3
4
5
6
class Book(models.Model):
\ttitle = models.CharField(max_length=100)
\tauthor = models.CharField(max_length=50)
\t
\tobjects = models.Manager() # default manager
\tcustom_objects = CustomBOokManager() # custom manager
\n

source

\n"},{"title":"Flask Day 1","date":"2016-02-14T17:23:33.000Z","_content":"\n### \"Hello World\" in Flask\n\nCreate a folder named `microblog` (or whatever you want). Then cd into that folder and run following prompt in terminal:\n\n``` bash\n$ python3 -m venv flask\n```\n\nNow you'll have a folder named `flask` inside `microblog`, containing a private version of Python interpreter.\n\nAnd you should install **flask** and extensions by the commands below:\n\n``` bash\n$ flask/bin/pip install flask\n$ flask/bin/pip install flask-login\n$ flask/bin/pip install flask-openid\n$ flask/bin/pip install flask-mail\n$ flask/bin/pip install flask-sqlalchemy\n$ flask/bin/pip install sqlalchemy-migrate\n$ flask/bin/pip install flask-whooshalchemy\n$ flask/bin/pip install flask-wtf\n$ flask/bin/pip install flask-babel\n$ flask/bin/pip install guess_language\n$ flask/bin/pip install flipflop\n$ flask/bin/pip install coverage\n```\n\nAfter that, let's create the basic structure for our application: `app` `app/static` `app/templates` `tmp`.\n\n1. `app` — where the application package is\n2. `static` — stores static files like images, javascripts, and css.\n3. `templates` — where templates will go.\n\nThen you can start with ``__init__.py`` which should put into app folder (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nThe views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.\n\nLet's see what a views function looks like (file `app/views.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nFinally we should create a script to starts up the web server with our application(file `run.py`):\n\n``` python\n#!flask/bin/python\nfrom app import app\napp.run(debug=True)\n```\n\nTo indicating that is an executable file you need to run this in terminal:\n\n``` bash\n$ chmod a+x run.py\n```\n\nNow the file structure should look like:\n\n``` \n microblog\\\n flask\\\n \n app\\\n static\\\n templates\\\n __init__.py\n views.py\n tmp\\\n run.py\n```\n\nThen start to write the template (file `app/templates/index.html`):\n\n``` html\n\n \n \n {{ title }} - microblog\n \n \n \n

Hello, {{ user.nickname }}!

\n \n \n\n```\n\nNow let's write the view function that uses this template (file `app/views.py`):\n\n``` python\nfrom flask import render_template\nfrom app import app\n\n@app.route('/')\n@app.route('/index')\ndef index():\n user = {'nickname': 'ching'} # fake user\n return render_template('index.html',\n title='Home',\n user=user)\n```\n\n`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine.\n\n","source":"_posts/Flask-Day-1.md","raw":"---\ntitle: Flask Day 1\ndate: 2016-02-15 01:23:33\n---\n\n### \"Hello World\" in Flask\n\nCreate a folder named `microblog` (or whatever you want). Then cd into that folder and run following prompt in terminal:\n\n``` bash\n$ python3 -m venv flask\n```\n\nNow you'll have a folder named `flask` inside `microblog`, containing a private version of Python interpreter.\n\nAnd you should install **flask** and extensions by the commands below:\n\n``` bash\n$ flask/bin/pip install flask\n$ flask/bin/pip install flask-login\n$ flask/bin/pip install flask-openid\n$ flask/bin/pip install flask-mail\n$ flask/bin/pip install flask-sqlalchemy\n$ flask/bin/pip install sqlalchemy-migrate\n$ flask/bin/pip install flask-whooshalchemy\n$ flask/bin/pip install flask-wtf\n$ flask/bin/pip install flask-babel\n$ flask/bin/pip install guess_language\n$ flask/bin/pip install flipflop\n$ flask/bin/pip install coverage\n```\n\nAfter that, let's create the basic structure for our application: `app` `app/static` `app/templates` `tmp`.\n\n1. `app` — where the application package is\n2. `static` — stores static files like images, javascripts, and css.\n3. `templates` — where templates will go.\n\nThen you can start with ``__init__.py`` which should put into app folder (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nThe views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.\n\nLet's see what a views function looks like (file `app/views.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nFinally we should create a script to starts up the web server with our application(file `run.py`):\n\n``` python\n#!flask/bin/python\nfrom app import app\napp.run(debug=True)\n```\n\nTo indicating that is an executable file you need to run this in terminal:\n\n``` bash\n$ chmod a+x run.py\n```\n\nNow the file structure should look like:\n\n``` \n microblog\\\n flask\\\n \n app\\\n static\\\n templates\\\n __init__.py\n views.py\n tmp\\\n run.py\n```\n\nThen start to write the template (file `app/templates/index.html`):\n\n``` html\n\n \n \n {{ title }} - microblog\n \n \n \n

Hello, {{ user.nickname }}!

\n \n \n\n```\n\nNow let's write the view function that uses this template (file `app/views.py`):\n\n``` python\nfrom flask import render_template\nfrom app import app\n\n@app.route('/')\n@app.route('/index')\ndef index():\n user = {'nickname': 'ching'} # fake user\n return render_template('index.html',\n title='Home',\n user=user)\n```\n\n`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine.\n\n","slug":"Flask-Day-1","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk52001dsubuwkxumfmo","content":"

“Hello World” in Flask

Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

\n
1
$ python3 -m venv flask
\n

Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

\n

And you should install flask and extensions by the commands below:

\n
1
2
3
4
5
6
7
8
9
10
11
12
$ flask/bin/pip install flask
$ flask/bin/pip install flask-login
$ flask/bin/pip install flask-openid
$ flask/bin/pip install flask-mail
$ flask/bin/pip install flask-sqlalchemy
$ flask/bin/pip install sqlalchemy-migrate
$ flask/bin/pip install flask-whooshalchemy
$ flask/bin/pip install flask-wtf
$ flask/bin/pip install flask-babel
$ flask/bin/pip install guess_language
$ flask/bin/pip install flipflop
$ flask/bin/pip install coverage
\n

After that, let’s create the basic structure for our application: app app/static app/templates tmp.

\n
    \n
  1. app — where the application package is
  2. \n
  3. static — stores static files like images, javascripts, and css.
  4. \n
  5. templates — where templates will go.
  6. \n
\n

Then you can start with __init__.py which should put into app folder (file app/__init__.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

\n

Let’s see what a views function looks like (file app/views.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

Finally we should create a script to starts up the web server with our application(file run.py):

\n
1
2
3
#!flask/bin/python
from app import app
app.run(debug=True)
\n

To indicating that is an executable file you need to run this in terminal:

\n
1
$ chmod a+x run.py
\n

Now the file structure should look like:

\n
1
2
3
4
5
6
7
8
9
10
microblog\\
flask\\
<virtual environment files>
app\\
static\\
templates\\
__init__.py
views.py
tmp\\
run.py
\n

Then start to write the template (file app/templates/index.html):

\n
1
2
3
4
5
6
7
8
9
10
11
<html>

<head>
<title>{{ title }} - microblog</title>
</head>

<body>
<h1>Hello, {{ user.nickname }}!</h1>
</body>

</html>
\n

Now let’s write the view function that uses this template (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
user = {'nickname': 'ching'} # fake user
return render_template('index.html',
title='Home',
user=user)
\n

render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

\n","site":{"data":{}},"excerpt":"","more":"

“Hello World” in Flask

Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

\n
1
$ python3 -m venv flask
\n

Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

\n

And you should install flask and extensions by the commands below:

\n
1
2
3
4
5
6
7
8
9
10
11
12
$ flask/bin/pip install flask
$ flask/bin/pip install flask-login
$ flask/bin/pip install flask-openid
$ flask/bin/pip install flask-mail
$ flask/bin/pip install flask-sqlalchemy
$ flask/bin/pip install sqlalchemy-migrate
$ flask/bin/pip install flask-whooshalchemy
$ flask/bin/pip install flask-wtf
$ flask/bin/pip install flask-babel
$ flask/bin/pip install guess_language
$ flask/bin/pip install flipflop
$ flask/bin/pip install coverage
\n

After that, let’s create the basic structure for our application: app app/static app/templates tmp.

\n
    \n
  1. app — where the application package is
  2. \n
  3. static — stores static files like images, javascripts, and css.
  4. \n
  5. templates — where templates will go.
  6. \n
\n

Then you can start with __init__.py which should put into app folder (file app/__init__.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

\n

Let’s see what a views function looks like (file app/views.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

Finally we should create a script to starts up the web server with our application(file run.py):

\n
1
2
3
#!flask/bin/python
from app import app
app.run(debug=True)
\n

To indicating that is an executable file you need to run this in terminal:

\n
1
$ chmod a+x run.py
\n

Now the file structure should look like:

\n
1
2
3
4
5
6
7
8
9
10
microblog\\
flask\\
<virtual environment files>
app\\
static\\
templates\\
__init__.py
views.py
tmp\\
run.py
\n

Then start to write the template (file app/templates/index.html):

\n
1
2
3
4
5
6
7
8
9
10
11
<html>

<head>
<title>{{ title }} - microblog</title>
</head>

<body>
<h1>Hello, {{ user.nickname }}!</h1>
</body>

</html>
\n

Now let’s write the view function that uses this template (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
user = {'nickname': 'ching'} # fake user
return render_template('index.html',
title='Home',
user=user)
\n

render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

\n"},{"title":"Flask Day 2","date":"2016-02-16T14:45:06.000Z","_content":"\nTo handle web forms we use [Flask-WTF\t](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`):\n\n``` python\nWTF_CSRF_ENABLED = True\nSECRET_KEY = 'you-will-never-guess'\n```\n\nAnd then you need to use this config (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\napp.config.from_object('config')\n\nfrom app import views\n```\n\nLet's build a simple form (file `app/forms.app`):\n\n``` python\nfrom flask.ext.wtf import Form\nfrom wtforms import StringField, BooleanField\nfrom wtforms.validators import DataRequired\n\nclass LoginForm(Form):\n openid = StringField('openid', validators=[DataRequired()])\n remember_me = BooleanField('remember_me', default=False)\n```\n\nThe `DataRequired()` is a validator that checks the field is empty or not.\n\nAfter that, we need a HTML page to show the form (file `app/templates/login.html`):\n\n``` html\n\n{% extends \"base.html\" %}\n\n{% block content %}\n

Sign In

\n
\n {{ form.hidden_tag() }}\n

\n Please enter your OpenID:
\n {{ form.openid(size=80) }}
\n

\n

{{ form.remember_me }} Remember Me

\n

\n
\n{% endblock %}\n```\n\n\n\nThe final step is to code a view function that renders the template and receiving data from form (file `app/views.py`):\n\n``` python\nfrom flask import render_template, flash, redirect\nfrom app import app\nfrom .forms import LoginForm\n\n# index view function suppressed for brevity\n\napp.route('/login', methods=['GET', 'POST'])\ndef login():\n form = LoginForm()\n if form.validate_on_submit():\n flash('Login requested for OpenID=\"%s\", remember_me=%s' %\n (form.openid.data, str(form.remember_me.data)))\n return redirect('/index')\n return render_template('login.html', \n title='Sign In',\n form=form)\n```\n\n","source":"_posts/Flask-Day-2.md","raw":"---\ntitle: Flask Day 2\ndate: 2016-02-16 22:45:06\n---\n\nTo handle web forms we use [Flask-WTF\t](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`):\n\n``` python\nWTF_CSRF_ENABLED = True\nSECRET_KEY = 'you-will-never-guess'\n```\n\nAnd then you need to use this config (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\napp.config.from_object('config')\n\nfrom app import views\n```\n\nLet's build a simple form (file `app/forms.app`):\n\n``` python\nfrom flask.ext.wtf import Form\nfrom wtforms import StringField, BooleanField\nfrom wtforms.validators import DataRequired\n\nclass LoginForm(Form):\n openid = StringField('openid', validators=[DataRequired()])\n remember_me = BooleanField('remember_me', default=False)\n```\n\nThe `DataRequired()` is a validator that checks the field is empty or not.\n\nAfter that, we need a HTML page to show the form (file `app/templates/login.html`):\n\n``` html\n\n{% extends \"base.html\" %}\n\n{% block content %}\n

Sign In

\n
\n {{ form.hidden_tag() }}\n

\n Please enter your OpenID:
\n {{ form.openid(size=80) }}
\n

\n

{{ form.remember_me }} Remember Me

\n

\n
\n{% endblock %}\n```\n\n\n\nThe final step is to code a view function that renders the template and receiving data from form (file `app/views.py`):\n\n``` python\nfrom flask import render_template, flash, redirect\nfrom app import app\nfrom .forms import LoginForm\n\n# index view function suppressed for brevity\n\napp.route('/login', methods=['GET', 'POST'])\ndef login():\n form = LoginForm()\n if form.validate_on_submit():\n flash('Login requested for OpenID=\"%s\", remember_me=%s' %\n (form.openid.data, str(form.remember_me.data)))\n return redirect('/index')\n return render_template('login.html', \n title='Sign In',\n form=form)\n```\n\n","slug":"Flask-Day-2","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk53001fsubukfg8z46w","content":"

To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

\n
1
2
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
\n

And then you need to use this config (file app/__init__.py):

\n
1
2
3
4
5
6
from flask import Flask

app = Flask(__name__)
app.config.from_object('config')

from app import views
\n

Let’s build a simple form (file app/forms.app):

\n
1
2
3
4
5
6
7
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired

class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
\n

The DataRequired() is a validator that checks the field is empty or not.

\n

After that, we need a HTML page to show the form (file app/templates/login.html):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- extend from base layout -->
{% extends \"base.html\" %}

{% block content %}
<h1>Sign In</h1>
<form action=\"\" method=\"post\" name=\"login\">
{{ form.hidden_tag() }}
<p>
Please enter your OpenID:<br>
{{ form.openid(size=80) }}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type=\"submit\" value=\"Sign In\"></p>
</form>
{% endblock %}
\n

The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm

# index view function suppressed for brevity

app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID=\"%s\", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
return render_template('login.html',
title='Sign In',
form=form)
\n","site":{"data":{}},"excerpt":"","more":"

To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

\n
1
2
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
\n

And then you need to use this config (file app/__init__.py):

\n
1
2
3
4
5
6
from flask import Flask

app = Flask(__name__)
app.config.from_object('config')

from app import views
\n

Let’s build a simple form (file app/forms.app):

\n
1
2
3
4
5
6
7
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired

class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
\n

The DataRequired() is a validator that checks the field is empty or not.

\n

After that, we need a HTML page to show the form (file app/templates/login.html):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- extend from base layout -->
{% extends \"base.html\" %}

{% block content %}
<h1>Sign In</h1>
<form action=\"\" method=\"post\" name=\"login\">
{{ form.hidden_tag() }}
<p>
Please enter your OpenID:<br>
{{ form.openid(size=80) }}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type=\"submit\" value=\"Sign In\"></p>
</form>
{% endblock %}
\n

The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm

# index view function suppressed for brevity

app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID=\"%s\", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
return render_template('login.html',
title='Sign In',
form=form)
\n"},{"title":"Tastypie","date":"2016-05-04T04:02:00.000Z","_content":"\n#### Resources in Tastypie\n\nResources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.\n\n\n\nUnderstanding the process of creating a resource.\n\n1. Import ModelResource from Tastypie.\n2. Import models from services app\n3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. \n\nAdd API URL in the urls.py of app.\n\n\n\n#### Dehydrating the JSON data\n\n![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800)\n\n\n\nDehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.\n\n##### Dehydrate_field method\n\nThis `dehydrate_field` is uesd to modify field on the response JSON. \n\n##### Dehydrate method\n\nDehydrate method is useful for aadding additional fields to bundle (response data). \n\nSimilarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods.","source":"_posts/Tastypie.md","raw":"---\ntitle: Tastypie\ndate: 2016-05-04 12:02:00\n---\n\n#### Resources in Tastypie\n\nResources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.\n\n\n\nUnderstanding the process of creating a resource.\n\n1. Import ModelResource from Tastypie.\n2. Import models from services app\n3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. \n\nAdd API URL in the urls.py of app.\n\n\n\n#### Dehydrating the JSON data\n\n![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800)\n\n\n\nDehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.\n\n##### Dehydrate_field method\n\nThis `dehydrate_field` is uesd to modify field on the response JSON. \n\n##### Dehydrate method\n\nDehydrate method is useful for aadding additional fields to bundle (response data). \n\nSimilarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods.","slug":"Tastypie","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk54001hsubuesca2vhc","content":"

Resources in Tastypie

Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

\n

Understanding the process of creating a resource.

\n
    \n
  1. Import ModelResource from Tastypie.
  2. \n
  3. Import models from services app
  4. \n
  5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
  6. \n
\n

Add API URL in the urls.py of app.

\n

Dehydrating the JSON data

\"flow\"

\n

Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

\n
Dehydrate_field method

This dehydrate_field is uesd to modify field on the response JSON.

\n
Dehydrate method

Dehydrate method is useful for aadding additional fields to bundle (response data).

\n

Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

\n","site":{"data":{}},"excerpt":"","more":"

Resources in Tastypie

Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

\n

Understanding the process of creating a resource.

\n
    \n
  1. Import ModelResource from Tastypie.
  2. \n
  3. Import models from services app
  4. \n
  5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
  6. \n
\n

Add API URL in the urls.py of app.

\n

Dehydrating the JSON data

\"flow\"

\n

Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

\n
Dehydrate_field method

This dehydrate_field is uesd to modify field on the response JSON.

\n
Dehydrate method

Dehydrate method is useful for aadding additional fields to bundle (response data).

\n

Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

\n"},{"title":"First Post","date":"2016-02-12T10:00:00.000Z","_content":"\nThis is the very first post I wrote,\n\nwith [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/).\n\n","source":"_posts/first-post.md","raw":"---\ntitle: First Post\ndate: 2016-02-12 18:00:00\n---\n\nThis is the very first post I wrote,\n\nwith [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/).\n\n","slug":"first-post","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk55001isubut7gdk8uj","content":"

This is the very first post I wrote,

\n

with Typora & Hexo.

\n","site":{"data":{}},"excerpt":"","more":"

This is the very first post I wrote,

\n

with Typora & Hexo.

\n"},{"title":"TastyPie Note 1","date":"2016-05-10T09:00:00.000Z","_content":"\n### Flow Through The Request/Response Cycle\n\nTastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.\n\nWalking through what a GET request to a list endpoint looks like:\n\n- The `Resource.urls` are checked by Django's url resolvers.\n\n- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors.\n\n- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`.\n\n- `dispatch` does a bunch of havy lifting. It ensures:\n\n - the requested HTTP method is in `allowed_methos` (`method_check`).\n - the class has a method that can handle the request(`get_list`)\n - the user is authenticated(`is_authenticated`)\n - the user has no exceeded their throttle(`throttle_check`).\n\n At this point, `dispatch` actually calls the requested method (`get_list`).\n\n- `get_list` does the actual work of API. It does:\n\n - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it.\n - It then sorts the objects based on user input (`ModelResource.apply_sorting`).\n - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized.\n - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.\n - Finally, it calls `Resource.create_response`.\n\n- `create_response` is a shortcut method that:\n\n - Determines the desired response format (`Resource.determine_format`).\n - Serializes the data given to it in the proper format.\n - Returns a Django `HttpResponse` (200 OK) with the serialized data.\n\n- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out).\n\n\n\n","source":"_posts/TastyPie-Note-1.md","raw":"---\ntitle: TastyPie Note 1\ndate: 2016-05-10 17:00:00\n---\n\n### Flow Through The Request/Response Cycle\n\nTastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.\n\nWalking through what a GET request to a list endpoint looks like:\n\n- The `Resource.urls` are checked by Django's url resolvers.\n\n- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors.\n\n- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`.\n\n- `dispatch` does a bunch of havy lifting. It ensures:\n\n - the requested HTTP method is in `allowed_methos` (`method_check`).\n - the class has a method that can handle the request(`get_list`)\n - the user is authenticated(`is_authenticated`)\n - the user has no exceeded their throttle(`throttle_check`).\n\n At this point, `dispatch` actually calls the requested method (`get_list`).\n\n- `get_list` does the actual work of API. It does:\n\n - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it.\n - It then sorts the objects based on user input (`ModelResource.apply_sorting`).\n - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized.\n - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.\n - Finally, it calls `Resource.create_response`.\n\n- `create_response` is a shortcut method that:\n\n - Determines the desired response format (`Resource.determine_format`).\n - Serializes the data given to it in the proper format.\n - Returns a Django `HttpResponse` (200 OK) with the serialized data.\n\n- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out).\n\n\n\n","slug":"TastyPie-Note-1","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk55001jsubuwea2oyll","content":"

Flow Through The Request/Response Cycle

Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

\n

Walking through what a GET request to a list endpoint looks like:

\n
    \n
  • The Resource.urls are checked by Django’s url resolvers.

    \n
  • \n
  • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

    \n
  • \n
  • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

    \n
  • \n
  • dispatch does a bunch of havy lifting. It ensures:

    \n
      \n
    • the requested HTTP method is in allowed_methos (method_check).
    • \n
    • the class has a method that can handle the request(get_list)
    • \n
    • the user is authenticated(is_authenticated)
    • \n
    • the user has no exceeded their throttle(throttle_check).
    • \n
    \n

    At this point, dispatch actually calls the requested method (get_list).

    \n
  • \n
  • get_list does the actual work of API. It does:

    \n
      \n
    • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
    • \n
    • It then sorts the objects based on user input (ModelResource.apply_sorting).
    • \n
    • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
    • \n
    • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
    • \n
    • Finally, it calls Resource.create_response.
    • \n
    \n
  • \n
  • create_response is a shortcut method that:

    \n
      \n
    • Determines the desired response format (Resource.determine_format).
    • \n
    • Serializes the data given to it in the proper format.
    • \n
    • Returns a Django HttpResponse (200 OK) with the serialized data.
    • \n
    \n
  • \n
  • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

    \n
  • \n
\n","site":{"data":{}},"excerpt":"","more":"

Flow Through The Request/Response Cycle

Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

\n

Walking through what a GET request to a list endpoint looks like:

\n
    \n
  • The Resource.urls are checked by Django’s url resolvers.

    \n
  • \n
  • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

    \n
  • \n
  • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

    \n
  • \n
  • dispatch does a bunch of havy lifting. It ensures:

    \n
      \n
    • the requested HTTP method is in allowed_methos (method_check).
    • \n
    • the class has a method that can handle the request(get_list)
    • \n
    • the user is authenticated(is_authenticated)
    • \n
    • the user has no exceeded their throttle(throttle_check).
    • \n
    \n

    At this point, dispatch actually calls the requested method (get_list).

    \n
  • \n
  • get_list does the actual work of API. It does:

    \n
      \n
    • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
    • \n
    • It then sorts the objects based on user input (ModelResource.apply_sorting).
    • \n
    • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
    • \n
    • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
    • \n
    • Finally, it calls Resource.create_response.
    • \n
    \n
  • \n
  • create_response is a shortcut method that:

    \n
      \n
    • Determines the desired response format (Resource.determine_format).
    • \n
    • Serializes the data given to it in the proper format.
    • \n
    • Returns a Django HttpResponse (200 OK) with the serialized data.
    • \n
    \n
  • \n
  • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

    \n
  • \n
\n"}],"PostAsset":[],"PostCategory":[{"post_id":"ck99fqk4c0004subueeqgf7uv","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4g0008subum8bi5yy7"},{"post_id":"ck99fqk450000subu0lleqph1","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4h000asubur95psr19"},{"post_id":"ck99fqk4d0005subutkoz8ewr","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4i000csubu5besjv4j"},{"post_id":"ck99fqk4e0006subugxejhq3n","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4k000esubuf0s2w57y"},{"post_id":"ck99fqk4f0007subugdeybnq7","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4m000gsubu2arb3a1i"},{"post_id":"ck99fqk4g0009subu00ew2ar1","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4n000isububuqku9dk"},{"post_id":"ck99fqk4h000bsubu68ng98xy","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4o000ksubug8jthkif"},{"post_id":"ck99fqk4i000dsubujxdgfcfh","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4p000msubu7h6jk5hd"},{"post_id":"ck99fqk4m000fsubu530zs4nj","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4q000osubum3njs7uo"},{"post_id":"ck99fqk4n000hsubu5guv78od","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4r000qsubumvevrma1"},{"post_id":"ck99fqk4o000jsubub8g0257f","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4s000ssubui455cch9"},{"post_id":"ck99fqk4p000lsubu6henmdmq","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4t000usubuqhjcb82b"},{"post_id":"ck99fqk4q000nsubuw1s0x6b6","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4v000wsubu51z3nnu6"},{"post_id":"ck99fqk4r000psubu38qpnnv7","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4v000ysubuusbadjsl"},{"post_id":"ck99fqk4s000rsubusdeyspgy","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4w0010subuxxknx1yv"},{"post_id":"ck99fqk4t000tsubuyl29244j","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4x0012subub22ede3m"},{"post_id":"ck99fqk4u000vsubuzq7vic3v","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4y0014sububzo3o42i"},{"post_id":"ck99fqk4v000xsubu9bmmz6rr","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4z0016subu9ps93wal"},{"post_id":"ck99fqk4w000zsubuceivn0ao","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk500018subu54ngjaza"},{"post_id":"ck99fqk4x0011subuv9wxy1bt","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk51001asubufr4etkmp"},{"post_id":"ck99fqk4y0013subufp1wokx0","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk52001csubu04fhrgz4"},{"post_id":"ck99fqk4y0015subub2p4shuv","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk53001esubuv5io60ug"},{"post_id":"ck99fqk500017subu3v0ql53e","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk54001gsubuqay6zjd5"}],"PostTag":[],"Tag":[]}} \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000..51bd73a Binary files /dev/null and b/dump.rdb differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b2d5d3c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11685 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "a-sync-waterfall": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/a-sync-waterfall/download/a-sync-waterfall-1.0.0.tgz", + "integrity": "sha1-OOgxnXk3niRiiEW1O5ZyKyng5Hw=" + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/abab/download/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "optional": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "optional": true + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npm.taobao.org/acorn-globals/download/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "optional": true, + "requires": { + "acorn": "^2.1.0" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "optional": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npm.taobao.org/boom/download/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "optional": true, + "requires": { + "hoek": "4.x.x" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-fingerprint": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/browser-fingerprint/download/browser-fingerprint-0.0.1.tgz", + "integrity": "sha1-jfPNyiW/fVs1QtYVRdcwBT/OYEo=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "canvas": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.4.0.tgz", + "integrity": "sha512-+xxeaKwQJyXHBdMhVhqFoGqNAAUW5vr2DbhQEusER2RR4H2m+Zn2QLKiwp43BabNhQBITQ3bp54+DYrGrI+wmA==", + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0" + }, + "dependencies": { + "nan": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", + "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==" + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz", + "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npm.taobao.org/cheerio/download/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "jsdom": "^7.0.2", + "lodash": "^4.1.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.1.tgz", + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-exists": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/command-exists/download/command-exists-1.2.2.tgz", + "integrity": "sha1-EoGcZPr5VEbsCuB/5sr7brNwiyI=" + }, + "commander": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-decorators": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/core-decorators/-/core-decorators-0.11.2.tgz", + "integrity": "sha1-GyQzFZQa598a8938tX3+6mPIsXE=" + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/cryptiles/download/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "optional": true, + "requires": { + "boom": "5.x.x" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/boom/download/boom-5.2.0.tgz", + "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", + "optional": true, + "requires": { + "hoek": "4.x.x" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/cssom/download/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "optional": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npm.taobao.org/cssstyle/download/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "optional": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cuid": { + "version": "1.3.8", + "resolved": "https://registry.npm.taobao.org/cuid/download/cuid-1.3.8.tgz", + "integrity": "sha1-S4deCWm612T37AcGz0T1+wgx9rc=", + "requires": { + "browser-fingerprint": "0.0.1", + "core-js": "^1.1.1", + "node-fingerprint": "0.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.9.0.tgz", + "integrity": "sha1-mBGi8mXcHNOJRCDuNxcGS2MriFI=", + "optional": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.5.6" + } + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "optional": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "optional": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "optional": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "optional": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "optional": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.1.3.tgz", + "integrity": "sha1-EfgjGPX+e7LNIpZaEI6TBiCCFtg=", + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "optional": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "optional": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "optional": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "optional": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "optional": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "optional": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "optional": true, + "requires": { + "mime-db": "~1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "optional": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "optional": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "optional": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "optional": true + } + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "optional": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/hawk/download/hawk-6.0.2.tgz", + "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", + "optional": true, + "requires": { + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" + } + }, + "hexo": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/hexo/download/hexo-3.5.0.tgz", + "integrity": "sha1-haJys25ce/6jVx7KBkkQ7RvBLI8=", + "requires": { + "abbrev": "^1.0.7", + "archy": "^1.0.0", + "bluebird": "^3.4.0", + "chalk": "^2.3.0", + "cheerio": "^0.20.0", + "hexo-cli": "^1.0.2", + "hexo-front-matter": "^0.2.2", + "hexo-fs": "^0.2.0", + "hexo-i18n": "^0.2.1", + "hexo-log": "^0.2.0", + "hexo-util": "^0.6.0", + "js-yaml": "^3.6.1", + "lodash": "^4.13.1", + "minimatch": "^3.0.4", + "moment": "^2.19.4", + "moment-timezone": "^0.5.14", + "nunjucks": "^3.0.1", + "pretty-hrtime": "^1.0.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0", + "swig-extras": "0.0.1", + "swig-templates": "^2.0.2", + "text-table": "^0.2.0", + "tildify": "^1.2.0", + "titlecase": "^1.1.2", + "warehouse": "^2.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "hexo-cli": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/hexo-cli/download/hexo-cli-1.0.4.tgz", + "integrity": "sha1-yPFCHsJCCdj/x7/upJarmfNBkeE=", + "requires": { + "abbrev": "^1.0.7", + "bluebird": "^3.4.0", + "chalk": "^1.1.3", + "command-exists": "^1.2.0", + "hexo-fs": "^0.2.0", + "hexo-log": "^0.2.0", + "hexo-util": "^0.6.0", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "tildify": "^1.2.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "hexo-browsersync": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hexo-browsersync/-/hexo-browsersync-0.2.0.tgz", + "integrity": "sha1-HmwRSgbAqWS/ADPdEXWmQwe2eNg=", + "requires": { + "bluebird": "^2.9.4", + "browser-sync": "^2.0.1", + "connect-injector": "^0.4.2", + "merge": "^1.2.0" + }, + "dependencies": { + "bluebird": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", + "integrity": "sha1-AkpVFylTCIV/FPkfEQb8O1VfRGs=" + }, + "browser-sync": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.11.1.tgz", + "integrity": "sha1-Alzgd6nWLEoRHnyvD3u4yz9SBb4=", + "requires": { + "async-each-series": "^0.1.1", + "browser-sync-client": "^2.3.3", + "browser-sync-ui": "^0.5.16", + "bs-recipes": "^1.0.5", + "chokidar": "1.4.1", + "connect": "^3.4.0", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.1", + "eazy-logger": "^2.1.2", + "emitter-steward": "^1.0.0", + "foxy": "^11.1.2", + "fs-extra": "^0.26.2", + "immutable": "^3.7.4", + "localtunnel": "^1.7.0", + "lodash": "^3.9.3", + "longest": "^1.0.1", + "meow": "3.3.0", + "micromatch": "2.3.5", + "opn": "^3.0.2", + "portscanner": "^1.0.0", + "query-string": "^2.4.0", + "resp-modifier": "^5.0.0", + "serve-index": "^1.7.0", + "serve-static": "^1.10.0", + "socket.io": "1.3.7", + "ua-parser-js": "^0.7.9", + "ucfirst": "^1.0.0" + }, + "dependencies": { + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=" + }, + "browser-sync-client": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.4.1.tgz", + "integrity": "sha1-xy36igsY8hnJ5JCDGHGZgPUdCrk=", + "requires": { + "etag": "^1.7.0", + "fresh": "^0.3.0" + }, + "dependencies": { + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + } + } + }, + "browser-sync-ui": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-0.5.18.tgz", + "integrity": "sha1-rXi0NyAYjqHAP/3RQb5kzmyDlgk=", + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1.1.0", + "immutable": "^3.7.6", + "stream-throttle": "^0.1.3", + "weinre": "^2.0.0-pre-I0Z7U9OV" + }, + "dependencies": { + "connect-history-api-fallback": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.1.0.tgz", + "integrity": "sha1-Wm3ugtmmSMspEx0/ndQA/6RZN0I=" + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + } + } + }, + "limiter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.0.tgz", + "integrity": "sha1-bivRLKP82qEfIk4uU8iW3z8I2RM=" + } + } + }, + "weinre": { + "version": "2.0.0-pre-I0Z7U9OV", + "resolved": "https://registry.npmjs.org/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz", + "integrity": "sha1-/viqIjkh97QLu71MPtQwL2/QqBM=", + "requires": { + "express": "2.5.x", + "nopt": "3.0.x", + "underscore": "1.7.x" + }, + "dependencies": { + "express": { + "version": "2.5.11", + "resolved": "https://registry.npmjs.org/express/-/express-2.5.11.tgz", + "integrity": "sha1-TOjqHzY15p5J8Ou0l7aksKUc5vA=", + "requires": { + "connect": "1.x", + "mime": "1.2.4", + "mkdirp": "0.3.0", + "qs": "0.4.x" + }, + "dependencies": { + "connect": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-1.9.2.tgz", + "integrity": "sha1-QogKIulDiuWait105Df1iujlKAc=", + "requires": { + "formidable": "1.0.x", + "mime": ">= 0.0.1", + "qs": ">= 0.4.0" + }, + "dependencies": { + "formidable": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz", + "integrity": "sha1-71SRSQ+UM7cF+qdyScmQKa40hVk=" + } + } + }, + "mime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.4.tgz", + "integrity": "sha1-EbX9rynCUJJVF2uArVIClPXekrc=" + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + }, + "qs": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.4.2.tgz", + "integrity": "sha1-PKxMhh43GoycR3CsI82o3mObjl8=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + }, + "dependencies": { + "abbrev": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", + "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=" + } + } + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + } + } + } + } + }, + "bs-recipes": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.0.5.tgz", + "integrity": "sha1-sSy6lRhqHjfq6446ysw1wwx1VsY=" + }, + "chokidar": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.4.1.tgz", + "integrity": "sha1-3x2QZ2lwGg899JLDfcw8s15kUOQ=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^0.1.6", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "requires": { + "arrify": "^1.0.0", + "micromatch": "^2.1.5" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + } + } + }, + "async-each": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", + "integrity": "sha1-tn6Z7c3fllQeRK9WKQzX1cbnBDk=" + }, + "fsevents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.7.tgz", + "integrity": "sha1-LZBYW7ysn/U1/xoalLBOu1CAhY8=", + "optional": true, + "requires": { + "nan": "^2.1.0", + "node-pre-gyp": "^0.6.19" + }, + "dependencies": { + "ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz", + "integrity": "sha1-dLLx8YfIVTx/lQFby3YAn7Q9OOA=", + "optional": true + }, + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", + "optional": true + }, + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=", + "optional": true + }, + "are-we-there-yet": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.5.tgz", + "integrity": "sha1-I58mcG2pAqK/+3LDPeZv39N5isU=", + "optional": true, + "requires": { + "delegates": "^0.1.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "optional": true + }, + "async": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.1.tgz", + "integrity": "sha1-sFcU9LEbNXv3mtr/3QbaQtB2bBA=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "bl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "integrity": "sha1-ramoqJptesYIYvfex9sgeHPgw/U=", + "optional": true, + "requires": { + "readable-stream": "~2.0.0" + } + }, + "block-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", + "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "optional": true + }, + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "optional": true, + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "optional": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.11.0.tgz", + "integrity": "sha1-ur04ktcatAOUjGornWX33hrOjpI=", + "optional": true, + "requires": { + "assert-plus": "0.1.x" + } + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "optional": true + }, + "deep-extend": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz", + "integrity": "sha1-9YtG21jrXWQ5zdDy5sr7Rzn8EoM=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true + }, + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha1-tLV74RoWU1F6BLJ/CUm9wyff45A=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=", + "optional": true + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", + "optional": true, + "requires": { + "async": "^1.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.3" + } + }, + "fstream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", + "integrity": "sha1-fo16c6uzZH7zbkuKFcqAHboD0Dg=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", + "integrity": "sha1-THTZH6iLIrQvT4ahiigg3XnY/N0=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "integrity": "sha1-BbZzChmo/K08NAoULwlFIio/gVs=", + "optional": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^1.0.0", + "lodash.pad": "^3.0.0", + "lodash.padleft": "^3.0.0", + "lodash.padright": "^3.0.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "optional": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz", + "integrity": "sha1-/iI5t1dJcuZ+QfgIgj+b+kqZHjc=", + "optional": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "optional": true + }, + "har-validator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz", + "integrity": "sha1-Wp4SVkpXHPC4Hvk8IVe9FhcWiIM=", + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.3", + "pinkie-promise": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz", + "integrity": "sha1-xG/O6gU+uOx4m/+7ol/KUt/c844=", + "optional": true + }, + "hawk": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz", + "integrity": "sha1-kMkBGIhuIZddGtSumz4oTtGaLeg=", + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "optional": true + }, + "http-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.tgz", + "integrity": "sha1-XS1+m270mYCtWxKNjk7wmjHJDZU=", + "optional": true, + "requires": { + "assert-plus": "^0.1.5", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "optional": true + }, + "is-my-json-valid": { + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz", + "integrity": "sha1-WjnR12stu4MUC70Vex1e5L3IWtY=", + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", + "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", + "optional": true + }, + "json-schema": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", + "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsonpointer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", + "optional": true + }, + "jsprim": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", + "integrity": "sha1-8gyQaskqvVjjt5rIvHCkiDJRLaE=", + "optional": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.2", + "verror": "1.3.6" + } + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "optional": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "optional": true, + "requires": { + "lodash.repeat": "^3.0.0" + } + }, + "lodash.pad": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "integrity": "sha1-LgeOvDOzMdK6NL+HMq8Sn9XARiQ=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padleft": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "integrity": "sha1-FQFR8eAkXtuhXVCvLXHx1c/0ZTA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padright": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "integrity": "sha1-efd3C6qjlzjAQK61Rl6NiPKqzsA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + }, + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=", + "optional": true + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "optional": true, + "requires": { + "mime-db": "~1.21.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.19", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.19.tgz", + "integrity": "sha1-hCut/y6cQjxagX4Gj/6PhIfcEBY=", + "optional": true, + "requires": { + "mkdirp": "~0.5.0", + "nopt": "~3.0.1", + "npmlog": "~2.0.0", + "rc": "~1.1.0", + "request": "2.x", + "rimraf": "~2.5.0", + "semver": "~5.1.0", + "tar": "~2.2.0", + "tar-pack": "~3.1.0" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + }, + "dependencies": { + "abbrev": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", + "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=", + "optional": true + } + } + } + } + }, + "node-uuid": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", + "optional": true + }, + "npmlog": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz", + "integrity": "sha1-QHbCAKPdpREz5vPPBSEwEF94u98=", + "optional": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "oauth-sign": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz", + "integrity": "sha1-k4/ch1dlulJxN9iuydF44k3rxVM=", + "optional": true + }, + "once": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz", + "integrity": "sha1-nbV0kzzLCMOnYU0VQDLAnqbzOec=", + "optional": true + }, + "pinkie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz", + "integrity": "sha1-QjbIb8KfJhwgRbvoH3jLsqXoMGw=", + "optional": true + }, + "pinkie-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "integrity": "sha1-TINTjeH25mDCngoTRGhE96foglk=", + "optional": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=", + "optional": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "optional": true + }, + "rc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", + "integrity": "sha1-Q2UbdrauU7XIAvEVH6P8OwWZack=", + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~1.0.4" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.67.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", + "integrity": "sha1-ivdHgOK/EeoK6aqWXBHxGv0nJ0I=", + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "bl": "~1.0.0", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc3", + "har-validator": "~2.0.2", + "hawk": "~3.1.0", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.0", + "qs": "~5.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.2.0", + "tunnel-agent": "~0.4.1" + } + }, + "rimraf": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.0.tgz", + "integrity": "sha1-MMCWzfdy4mvz4dLP+EwhllQam7Y=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + }, + "semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.2.tgz", + "integrity": "sha1-5etD0GYr0gEDcyftuLj2RlasqEI=", + "optional": true, + "requires": { + "asn1": ">=0.2.3 <0.3.0", + "assert-plus": ">=0.2.0 <0.3.0", + "dashdash": ">=1.10.1 <2.0.0", + "ecc-jsbn": ">=0.0.1 <1.0.0", + "jodid25519": ">=1.0.0 <2.0.0", + "jsbn": ">=0.1.0 <0.2.0", + "tweetnacl": ">=0.13.0 <1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "optional": true + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "optional": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.2.tgz", + "integrity": "sha1-FfxXw3kji9NQ73sYKi4rr4Jv4Eg=", + "optional": true, + "requires": { + "debug": "~0.7.2", + "fstream": "~1.0.8", + "fstream-ignore": "~1.0.3", + "once": "~1.1.1", + "readable-stream": "~2.0.4", + "rimraf": "~2.4.4", + "tar": "~2.2.1", + "uid-number": "0.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + } + } + }, + "tough-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", + "integrity": "sha1-OwUWt5nnDoFkQ2oURuflh3/aEY4=", + "optional": true + }, + "tunnel-agent": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", + "integrity": "sha1-EQTj82rIcSXChycAZ9WC0YEzv+4=", + "optional": true + }, + "tweetnacl": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz", + "integrity": "sha1-RTFhdwRp1FzSZsNkBOK8maj6mUQ=", + "optional": true + }, + "uid-number": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz", + "integrity": "sha1-zvsPoTjY2AmNpxpAoNBKgyfW4cw=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "optional": true + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + }, + "dependencies": { + "binary-extensions": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.4.0.tgz", + "integrity": "sha1-1zPMtiiYbXsybYhlbg3b06rDUbc=" + } + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" + }, + "readdirp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", + "integrity": "sha1-zAm6XRLY/rhkvHX24uvBNwYMvYI=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^2.0.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + } + } + } + } + }, + "connect": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "requires": { + "debug": "~2.2.0", + "finalhandler": "0.4.1", + "parseurl": "~1.3.1", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "finalhandler": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "requires": { + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=" + }, + "easy-extender": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", + "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=", + "requires": { + "lodash": "^3.10.1" + } + }, + "eazy-logger": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-2.1.2.tgz", + "integrity": "sha1-eBfBQa6395LrwV77cD+uBQdYnC0=", + "requires": { + "lodash": "^3.0.1", + "opt-merger": "^1.1.0", + "tfunk": "^3.0.1" + }, + "dependencies": { + "opt-merger": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/opt-merger/-/opt-merger-1.1.1.tgz", + "integrity": "sha1-30mVcJlBKHqEZ/nOWO4Gv0pk/0E=", + "requires": { + "lodash": "^3.10.1", + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "tfunk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.0.1.tgz", + "integrity": "sha1-RHLi6LlXVk+/QpyIkElS6yn+kXg=", + "requires": { + "chalk": "^0.5.1", + "object-path": "^0.9.0" + }, + "dependencies": { + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "requires": { + "ansi-regex": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" + } + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "requires": { + "ansi-regex": "^0.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" + } + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" + } + } + }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=" + } + } + } + } + }, + "emitter-steward": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emitter-steward/-/emitter-steward-1.0.0.tgz", + "integrity": "sha1-80Ea3pdYp1Zd+Eiy2gy70bRsvWQ=" + }, + "foxy": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/foxy/-/foxy-11.1.4.tgz", + "integrity": "sha1-iVxNmuU+5/XMRWuHKewARdVbX+w=", + "requires": { + "connect": "^3.3.5", + "dev-ip": "^1.0.1", + "eazy-logger": "^2.0.0", + "http-proxy": "^1.9.0", + "lodash.merge": "^3.3.1", + "meow": "^3.1.0", + "resp-modifier": "^4.0.2" + }, + "dependencies": { + "http-proxy": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.13.1.tgz", + "integrity": "sha1-0+qlTw2NnURK4NlSPJQ5HLi9akM=", + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + }, + "dependencies": { + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + } + } + }, + "lodash.merge": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", + "integrity": "sha1-DZDZPtY3sYeEN7s+IWASYNev6ZQ=", + "requires": { + "lodash._arraycopy": "^3.0.0", + "lodash._arrayeach": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.isplainobject": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.keysin": "^3.0.0", + "lodash.toplainobject": "^3.0.0" + }, + "dependencies": { + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=" + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + }, + "dependencies": { + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + } + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash.isarguments": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.6.tgz", + "integrity": "sha1-Xcr4VVs8zQr7FYErmBnsaMoJggY=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isplainobject": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", + "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", + "requires": { + "lodash._basefor": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.keysin": "^3.0.0" + }, + "dependencies": { + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=" + } + } + }, + "lodash.istypedarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.4.tgz", + "integrity": "sha1-+uW4B/7jyz8Zo903m6vKX1PNtt4=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.keysin": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", + "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.toplainobject": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", + "integrity": "sha1-KHkK2ULSk9eKpmOgfs9/UsoEGY0=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keysin": "^3.0.0" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + } + } + } + } + }, + "resp-modifier": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-4.0.4.tgz", + "integrity": "sha1-jZBcwYxAiUmlVO65yZt1/5zwo/o=", + "requires": { + "minimatch": "^2.0.1" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + } + } + } + } + }, + "fs-extra": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.5.tgz", + "integrity": "sha1-U6x0Znygg/0twXEsgTA5yjLWmn8=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" + }, + "jsonfile": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.2.3.tgz", + "integrity": "sha1-4lK5mmr5AdPsQfMyWJyQUJp7xgU=" + }, + "klaw": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.1.3.tgz", + "integrity": "sha1-faM8a0L5s9yc7ADRfxOvAX/MJyE=" + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" + }, + "rimraf": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.1.tgz", + "integrity": "sha1-UuHpRvP5ubDV2JiLoxkaryotvUM=", + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" + } + } + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" + } + } + } + } + } + } + } + } + }, + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" + }, + "localtunnel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.8.1.tgz", + "integrity": "sha1-1Rsrt6cGavsFtX/J24RAFQmPLhc=", + "requires": { + "debug": "2.2.0", + "openurl": "1.1.0", + "request": "2.65.0", + "yargs": "3.29.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "openurl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.0.tgz", + "integrity": "sha1-4vIYnZmcBIIyAfCD8PGnzYkDGHo=" + }, + "request": { + "version": "2.65.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.65.0.tgz", + "integrity": "sha1-zBo7xyuWJUc0/DQpbaMi+Uht3ro=", + "requires": { + "aws-sign2": "~0.6.0", + "bl": "~1.0.0", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc3", + "har-validator": "~2.0.2", + "hawk": "~3.1.0", + "http-signature": "~0.11.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.3", + "oauth-sign": "~0.8.0", + "qs": "~5.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.2.0", + "tunnel-agent": "~0.4.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "bl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", + "integrity": "sha1-/FQhoo/UImA2w7OJGmaiW8ZNIm4=", + "requires": { + "readable-stream": "~2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "~1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + } + } + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", + "requires": { + "async": "^1.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.3" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=" + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + } + } + }, + "is-my-json-valid": { + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.tgz", + "integrity": "sha1-1O0rwdf4ja+ND3Y7Pj45ppvTeIA=", + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "requires": { + "is-property": "^1.0.0" + }, + "dependencies": { + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + } + } + }, + "jsonpointer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, + "pinkie-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "integrity": "sha1-TINTjeH25mDCngoTRGhE96foglk=", + "requires": { + "pinkie": "^2.0.0" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + } + } + } + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "dependencies": { + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.x.x" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.x.x" + } + } + } + }, + "http-signature": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", + "integrity": "sha1-F5bPZ6ABrVzWhJ3KCZFIXwkIn+Y=", + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + }, + "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "node-uuid": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=" + }, + "oauth-sign": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz", + "integrity": "sha1-GCQ5vbkTeL90YOdcZOpD5kSN7wY=" + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "tough-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", + "integrity": "sha1-OwUWt5nnDoFkQ2oURuflh3/aEY4=" + }, + "tunnel-agent": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", + "integrity": "sha1-EQTj82rIcSXChycAZ9WC0YEzv+4=" + } + } + }, + "yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "requires": { + "camelcase": "^1.2.1", + "cliui": "^3.0.3", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.1.0.tgz", + "integrity": "sha1-o7iAMI4KgZFyHgCBqMKotQbQq/k=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "wrap-ansi": "^1.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", + "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", + "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "wrap-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-1.0.0.tgz", + "integrity": "sha1-9XO7nuI89DiR8zYvXzWaHfo4/DQ=", + "requires": { + "string-width": "^1.0.1" + } + } + } + }, + "decamelize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.2.tgz", + "integrity": "sha1-3Mk3J74gljLpiwJxjvTLeWAjIvI=", + "requires": { + "escape-string-regexp": "^1.0.4" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + } + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + }, + "dependencies": { + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + }, + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + } + } + } + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "y18n": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.0.tgz", + "integrity": "sha1-O+xkyTtzDZJKYUjHZXV5MkM+NMg=" + } + } + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "meow": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.3.0.tgz", + "integrity": "sha1-+Hd/0Ntn9z0d4b7uCMl8hmXvxu0=", + "requires": { + "camelcase-keys": "^1.0.0", + "indent-string": "^1.1.0", + "minimist": "^1.1.0", + "object-assign": "^3.0.0" + }, + "dependencies": { + "camelcase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-1.0.0.tgz", + "integrity": "sha1-vRoRv5sxoc5JNJOpMN4aC69K1+w=", + "requires": { + "camelcase": "^1.0.1", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "indent-string": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-1.2.2.tgz", + "integrity": "sha1-25m8xYPrarux5I3LsZmamGBBy2s=", + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "requires": { + "is-finite": "^1.0.0" + }, + "dependencies": { + "is-finite": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", + "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + } + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } + }, + "micromatch": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.5.tgz", + "integrity": "sha1-2N/tieKEGdBzSJvlXDPwsFwnMhc=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.1", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^0.2.3", + "normalize-path": "^2.0.0", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + }, + "dependencies": { + "arr-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", + "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=" + } + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.3.tgz", + "integrity": "sha1-NdTn3aYysz4hXTioqc9DKcnHXSw=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "dependencies": { + "expand-range": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.1.tgz", + "integrity": "sha1-rL1j5W79kTlyK3VfCZudtawfM/Y=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.0.0.tgz", + "integrity": "sha1-II3ocr1zeMKpKvlCij9W65GhIsQ=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "randomatic": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", + "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", + "requires": { + "is-number": "^2.0.2", + "kind-of": "^3.0.2" + } + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + } + } + }, + "expand-brackets": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.4.tgz", + "integrity": "sha1-eXueSEEBIF9BjOyuxjEsEy9R4q4=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + }, + "normalize-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", + "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=" + }, + "object.omit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", + "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", + "requires": { + "for-own": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.3.tgz", + "integrity": "sha1-YGREzed8LwoRCIFp4uNU6vVudP4=", + "requires": { + "for-in": "^0.1.4" + }, + "dependencies": { + "for-in": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.4.tgz", + "integrity": "sha1-n1z3tP/H4a5lkaTpexd6pZ1w+y4=" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + } + } + }, + "is-dotfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.2.tgz", + "integrity": "sha1-bk+Jwma8A8M/0SnAYhhGh/RmNIc=", + "requires": { + "is-equal-shallow": "^0.1.1", + "is-primitive": "^2.0.0" + }, + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + } + } + } + } + }, + "opn": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", + "requires": { + "object-assign": "^4.0.1" + }, + "dependencies": { + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "portscanner": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.0.0.tgz", + "integrity": "sha1-O1z+OTgotRYKvGAOYnDrwvFZBVg=", + "requires": { + "async": "0.1.15" + }, + "dependencies": { + "async": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz", + "integrity": "sha1-IYDqyizypspSgNQcBYW+ybPkm9M=" + } + } + }, + "query-string": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-2.4.2.tgz", + "integrity": "sha1-fbBmZCCAS6qSrp8miWKFWnYUPfs=", + "requires": { + "strict-uri-encode": "^1.0.0" + }, + "dependencies": { + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + } + } + }, + "resp-modifier": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-5.0.2.tgz", + "integrity": "sha1-vwqm2/KM0MoMtsxJD/tVlDoL9Fw=", + "requires": { + "debug": "^2.2.0", + "minimatch": "^2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + } + } + }, + "serve-index": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", + "requires": { + "accepts": "~1.2.13", + "batch": "0.5.3", + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "http-errors": "~1.3.1", + "mime-types": "~2.1.9", + "parseurl": "~1.3.1" + }, + "dependencies": { + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "requires": { + "mime-types": "~2.1.6", + "negotiator": "0.5.3" + }, + "dependencies": { + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + } + } + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + }, + "dependencies": { + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + } + } + }, + "serve-static": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", + "integrity": "sha1-/rgA0OciEk3QsAMzFgwW6cqovLM=", + "requires": { + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.1" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "send": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + } + } + }, + "socket.io": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.3.7.tgz", + "integrity": "sha1-k3R6KbyrYmbw++GREsyl4TiM960=", + "requires": { + "debug": "2.1.0", + "engine.io": "1.5.4", + "has-binary-data": "0.1.3", + "socket.io-adapter": "0.3.1", + "socket.io-client": "1.3.7", + "socket.io-parser": "2.2.4" + }, + "dependencies": { + "debug": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.0.tgz", + "integrity": "sha1-M6uRVlnYwsyKQUQ9lNbr03aX7SE=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "engine.io": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.5.4.tgz", + "integrity": "sha1-xhQQEpEcNQYxwbOQ9TJOtCAuKfI=", + "requires": { + "base64id": "0.1.0", + "debug": "1.0.3", + "engine.io-parser": "1.2.2", + "ws": "0.8.0" + }, + "dependencies": { + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=" + }, + "debug": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", + "integrity": "sha1-/IxrLWACgEtAgcAgjg9kYLofo+Q=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "engine.io-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.2.tgz", + "integrity": "sha1-zQgQQf7qOcZDI/95uCqQpyr8zN0=", + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.4", + "has-binary": "0.1.6", + "utf8": "2.1.0" + }, + "dependencies": { + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=" + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "base64-arraybuffer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", + "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=" + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "utf8": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", + "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=" + } + } + }, + "ws": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", + "integrity": "sha1-rGDrrTEhIdAeFswzg9fsZ60PDx8=", + "requires": { + "bufferutil": "1.2.x", + "options": ">=0.0.5", + "ultron": "1.0.x", + "utf-8-validate": "1.2.x" + }, + "dependencies": { + "bufferutil": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", + "integrity": "sha1-N75dNuHgZJIiHmjUdLGsWOUQy9c=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "utf-8-validate": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", + "integrity": "sha1-RMt8burXPWtARI9x90WQQ1e59yw=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + } + } + } + } + }, + "has-binary-data": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.3.tgz", + "integrity": "sha1-jrsYOItX8ZpSMSdaFvwY1R83mq4=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "socket.io-adapter": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.3.1.tgz", + "integrity": "sha1-34H5cLTfZJOQLZPlGce3J1XDqVg=", + "requires": { + "debug": "1.0.2", + "object-keys": "1.0.1", + "socket.io-parser": "2.2.2" + }, + "dependencies": { + "debug": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", + "integrity": "sha1-OElZHBDM5khHbDx8Li40FttZY8Q=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "object-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.1.tgz", + "integrity": "sha1-VYAuhYQsJru167wVer874wJWm6g=" + }, + "socket.io-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", + "integrity": "sha1-PXr2tkSX6Va32f53X5mXFgJ/lBc=", + "requires": { + "benchmark": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "isarray": "0.0.1", + "json3": "3.2.6" + }, + "dependencies": { + "benchmark": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", + "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "json3": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", + "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=" + } + } + } + } + }, + "socket.io-client": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.3.7.tgz", + "integrity": "sha1-erfAabjVBCXrJl8DH4Spfm6+cZw=", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "engine.io-client": "1.5.4", + "has-binary": "0.1.6", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.2", + "socket.io-parser": "2.2.4", + "to-array": "0.1.3" + }, + "dependencies": { + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "engine.io-client": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.5.4.tgz", + "integrity": "sha1-xq1lpldSopy5MMaRHledKyjREGw=", + "requires": { + "component-emitter": "1.1.2", + "component-inherit": "0.0.3", + "debug": "1.0.4", + "engine.io-parser": "1.2.2", + "has-cors": "1.0.3", + "indexof": "0.0.1", + "parsejson": "0.0.1", + "parseqs": "0.0.2", + "parseuri": "0.0.4", + "ws": "0.8.0", + "xmlhttprequest": "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz" + }, + "dependencies": { + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "debug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "engine.io-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.2.tgz", + "integrity": "sha1-zQgQQf7qOcZDI/95uCqQpyr8zN0=", + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.4", + "has-binary": "0.1.6", + "utf8": "2.1.0" + }, + "dependencies": { + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=" + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "base64-arraybuffer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", + "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=" + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "utf8": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", + "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=" + } + } + }, + "has-cors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.0.3.tgz", + "integrity": "sha1-UCrLmzEE2sM90mMOry+IiwuvTLM=", + "requires": { + "global": "https://github.com/component/global/archive/v2.0.1.tar.gz" + }, + "dependencies": { + "global": { + "version": "https://github.com/component/global/archive/v2.0.1.tar.gz", + "integrity": "sha1-P7JTQ/tm15mRsPSkKc47VEgO7Dw=" + } + } + }, + "parsejson": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", + "integrity": "sha1-mxDGwNglq1ieaFFTgm3go7oni8w=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "parseqs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", + "integrity": "sha1-nf5wss3aw4i95PNbHyQPpYrb5sc=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "parseuri": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", + "integrity": "sha1-gGWCo5iH4eoY3V4v4OAZAiaOk1A=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "ws": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", + "integrity": "sha1-rGDrrTEhIdAeFswzg9fsZ60PDx8=", + "requires": { + "bufferutil": "1.2.x", + "options": ">=0.0.5", + "ultron": "1.0.x", + "utf-8-validate": "1.2.x" + }, + "dependencies": { + "bufferutil": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", + "integrity": "sha1-N75dNuHgZJIiHmjUdLGsWOUQy9c=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "utf-8-validate": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", + "integrity": "sha1-RMt8burXPWtARI9x90WQQ1e59yw=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + } + } + }, + "xmlhttprequest": { + "version": "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz", + "integrity": "sha1-IMr6XKpV9ttr+u6EnR62DuQ6X8o=" + } + } + }, + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "parseuri": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.2.tgz", + "integrity": "sha1-20GHjy1pZHGL6HCzFAlz2Ak74VY=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "to-array": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz", + "integrity": "sha1-1F2txjY0F/YPKEdP6lDs3btPSZE=" + } + } + }, + "socket.io-parser": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.4.tgz", + "integrity": "sha1-+c4ZvxkJYIzrFdl3IeI7/dHnz2U=", + "requires": { + "benchmark": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "isarray": "0.0.1", + "json3": "3.2.6" + }, + "dependencies": { + "benchmark": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", + "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "json3": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", + "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=" + } + } + } + } + }, + "ua-parser-js": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.10.tgz", + "integrity": "sha1-kXVZ3czgfLwJ7OfYBJXkwmj0758=" + }, + "ucfirst": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ucfirst/-/ucfirst-1.0.0.tgz", + "integrity": "sha1-ThBbZEjQXiZOzsQ14LkZNjxfLy8=" + } + } + }, + "connect-injector": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/connect-injector/-/connect-injector-0.4.2.tgz", + "integrity": "sha1-hJ0eBos2xxNzbtkodKE2v5LkZjM=", + "requires": { + "connect": "^2.7.2", + "debug": "^2.0.0", + "q": "^1.0.1", + "stream-buffers": "^0.2.3", + "uberproto": "^1.1.0", + "underscore": "^1.4.4" + }, + "dependencies": { + "connect": { + "version": "2.30.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", + "integrity": "sha1-jam8vooFTT0xjXTf7JA7XDmhtgk=", + "requires": { + "basic-auth-connect": "1.0.0", + "body-parser": "~1.13.3", + "bytes": "2.1.0", + "compression": "~1.5.2", + "connect-timeout": "~1.6.2", + "content-type": "~1.0.1", + "cookie": "0.1.3", + "cookie-parser": "~1.3.5", + "cookie-signature": "1.0.6", + "csurf": "~1.8.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "errorhandler": "~1.4.2", + "express-session": "~1.11.3", + "finalhandler": "0.4.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "method-override": "~2.3.5", + "morgan": "~1.6.1", + "multiparty": "3.3.2", + "on-headers": "~1.0.0", + "parseurl": "~1.3.0", + "pause": "0.1.0", + "qs": "4.0.0", + "response-time": "~2.3.1", + "serve-favicon": "~2.3.0", + "serve-index": "~1.7.2", + "serve-static": "~1.10.0", + "type-is": "~1.6.6", + "utils-merge": "1.0.0", + "vhost": "~3.0.1" + }, + "dependencies": { + "basic-auth-connect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", + "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=" + }, + "body-parser": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", + "integrity": "sha1-wIzzMMM1jhUQFqBXRvE/ApyX+pc=", + "requires": { + "bytes": "2.1.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.0.1", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.11", + "on-finished": "~2.3.0", + "qs": "4.0.0", + "raw-body": "~2.1.2", + "type-is": "~1.6.6" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", + "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "raw-body": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", + "integrity": "sha1-i+jwnd79DXKtmdiDq38Mw1BCCVY=", + "requires": { + "bytes": "2.2.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=" + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + } + } + }, + "bytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=" + }, + "compression": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", + "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", + "requires": { + "accepts": "~1.2.12", + "bytes": "2.1.0", + "compressible": "~2.0.5", + "debug": "~2.2.0", + "on-headers": "~1.0.0", + "vary": "~1.0.1" + }, + "dependencies": { + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "requires": { + "mime-types": "~2.1.6", + "negotiator": "0.5.3" + }, + "dependencies": { + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + } + } + }, + "compressible": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.7.tgz", + "integrity": "sha1-IFjFJyL9PxU4pPIqsU0GNZBNGa4=", + "requires": { + "mime-db": ">= 1.21.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "vary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" + } + } + }, + "connect-timeout": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", + "integrity": "sha1-3ppexh4zoStu2qt7XwYumMWZuI4=", + "requires": { + "debug": "~2.2.0", + "http-errors": "~1.3.1", + "ms": "0.7.1", + "on-headers": "~1.0.0" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", + "integrity": "sha1-oZ0iRzJ9wDgFDOYit6FU7FnF5gA=" + }, + "cookie": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=" + }, + "cookie-parser": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", + "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "csurf": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", + "integrity": "sha1-I/KhO/HY/OHQyZZYg5RELLqGpWo=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "csrf": "~3.0.0", + "http-errors": "~1.3.1" + }, + "dependencies": { + "csrf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.1.tgz", + "integrity": "sha1-mFshjX4uVY7T2YD6OPaUumgnhMI=", + "requires": { + "base64-url": "1.2.1", + "rndm": "1.2.0", + "scmp": "1.0.0", + "uid-safe": "2.1.0" + }, + "dependencies": { + "base64-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=" + }, + "rndm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" + }, + "scmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-1.0.0.tgz", + "integrity": "sha1-oLJyw/xykvdxFWRvAGGLAmJRTgQ=" + }, + "uid-safe": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.0.tgz", + "integrity": "sha1-0AziKutyHf58Jbst9J/QCWbTimQ=", + "requires": { + "base64-url": "1.2.1", + "random-bytes": "~1.0.0" + }, + "dependencies": { + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + } + } + } + } + } + } + }, + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + }, + "errorhandler": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", + "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", + "requires": { + "accepts": "~1.3.0", + "escape-html": "~1.0.3" + }, + "dependencies": { + "accepts": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.1.tgz", + "integrity": "sha1-3Clfr4UCTgWwT1pvr17sHR/Qd+U=", + "requires": { + "mime-types": "~2.1.9", + "negotiator": "0.6.0" + }, + "dependencies": { + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "negotiator": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.0.tgz", + "integrity": "sha1-M1k6WisM4wyYWEDG9WtvseqeOlU=" + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + } + } + }, + "express-session": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", + "integrity": "sha1-XMmPP1/4Ttg1+Ry/CqvQxxB0AK8=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "crc": "3.3.0", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-headers": "~1.0.0", + "parseurl": "~1.3.0", + "uid-safe": "~2.0.0", + "utils-merge": "1.0.0" + }, + "dependencies": { + "crc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", + "integrity": "sha1-+mIuG8OIvyVzCQgta2UgDOZwkLo=" + }, + "uid-safe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", + "integrity": "sha1-p/PGymSh9qXQTsDvPkw9U2cxcTc=", + "requires": { + "base64-url": "1.2.1" + }, + "dependencies": { + "base64-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=" + } + } + } + } + }, + "finalhandler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=", + "requires": { + "debug": "~2.2.0", + "escape-html": "1.0.2", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "escape-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", + "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + }, + "dependencies": { + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + }, + "method-override": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.5.tgz", + "integrity": "sha1-LNXNv/AMNnPXrjRRGagSpdlbjI4=", + "requires": { + "debug": "~2.2.0", + "methods": "~1.1.1", + "parseurl": "~1.3.0", + "vary": "~1.0.1" + }, + "dependencies": { + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "vary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" + } + } + }, + "morgan": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "requires": { + "basic-auth": "~1.0.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-finished": "~2.3.0", + "on-headers": "~1.0.0" + }, + "dependencies": { + "basic-auth": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.3.tgz", + "integrity": "sha1-QfVVI+WJQFA47jVnlYxipe1wVRo=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + } + } + }, + "multiparty": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", + "integrity": "sha1-Nd5oBNwZZD5SSfPT473GyM4wHT8=", + "requires": { + "readable-stream": "~1.1.9", + "stream-counter": "~0.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", + "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "stream-counter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", + "requires": { + "readable-stream": "~1.1.8" + } + } + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "pause": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", + "integrity": "sha1-68ikqGGf8LioGsFRPDQ0/0af23Q=" + }, + "qs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=" + }, + "response-time": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.1.tgz", + "integrity": "sha1-K94ZGB3myBq5XjIHoo1h2WWzF5c=", + "requires": { + "depd": "~1.0.1", + "on-headers": "~1.0.0" + } + }, + "serve-favicon": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.0.tgz", + "integrity": "sha1-rtNsxoNAaabxicxyIsahqBHcWzk=", + "requires": { + "etag": "~1.7.0", + "fresh": "0.3.0", + "ms": "0.7.1", + "parseurl": "~1.3.0" + }, + "dependencies": { + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "serve-index": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", + "requires": { + "accepts": "~1.2.13", + "batch": "0.5.3", + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "http-errors": "~1.3.1", + "mime-types": "~2.1.9", + "parseurl": "~1.3.1" + }, + "dependencies": { + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "requires": { + "mime-types": "~2.1.6", + "negotiator": "0.5.3" + }, + "dependencies": { + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + } + } + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + } + } + }, + "serve-static": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", + "integrity": "sha1-/rgA0OciEk3QsAMzFgwW6cqovLM=", + "requires": { + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.1" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "send": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "dependencies": { + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + } + } + }, + "type-is": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", + "integrity": "sha1-QuzeeXDyNjc4uYbANR77papTFkg=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.9" + }, + "dependencies": { + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + } + } + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "vhost": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz", + "integrity": "sha1-L7HezUxGaqiLD5NBrzPcGv8keNU=" + } + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "stream-buffers": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-0.2.6.tgz", + "integrity": "sha1-GBwI1bs2kARfaUAbmuanoM8zE/w=" + }, + "uberproto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz", + "integrity": "sha1-YdTqsCT5CcTm6lK+hnxIlKS+63Y=" + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + } + } + }, + "hexo-bunyan": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-bunyan/download/hexo-bunyan-1.0.0.tgz", + "integrity": "sha1-shBrJlR7Iy8BlduGPLXV/4Un/TY=", + "requires": { + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "hexo-deployer-rsync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/hexo-deployer-rsync/-/hexo-deployer-rsync-0.1.3.tgz", + "integrity": "sha1-RwfFpHNxywW0dTmqwX4JtnBgqDI=", + "requires": { + "chalk": "^1.1.3", + "hexo-util": "^0.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "hexo-filter-mathjax": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/hexo-filter-mathjax/-/hexo-filter-mathjax-0.4.1.tgz", + "integrity": "sha512-uUIUhI1S/2bZYAiIX/RtJ3OUt5BGIZVshOulN2jvp4tKGsBC4kH8EGJcN7wwUPhNSEspibqKBhlZnmTr0Ev9FA==", + "requires": { + "mathjax-full": "3.0.1", + "string-width": "4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "hexo-front-matter": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-0.2.3.tgz", + "integrity": "sha1-x8qO9CDqNr2F6ECKLoyb9J76YF4=", + "requires": { + "js-yaml": "^3.6.1" + } + }, + "hexo-fs": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-0.2.2.tgz", + "integrity": "sha1-C5e3n2jfEh92XRKRuOkPrjJtAA4=", + "requires": { + "bluebird": "^3.4.0", + "chokidar": "^1.5.2", + "escape-string-regexp": "^1.0.5", + "graceful-fs": "^4.1.4" + } + }, + "hexo-generator-archive": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hexo-generator-archive/-/hexo-generator-archive-0.1.4.tgz", + "integrity": "sha1-Ft927JGH5RDf9sGSIEsPf3xQYGk=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^2.0.0" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" + } + } + }, + "hexo-generator-category": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/hexo-generator-category/-/hexo-generator-category-0.1.3.tgz", + "integrity": "sha1-uealhiUwqDvdfaTIGcG58+TMtLI=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^2.0.0" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" + } + } + }, + "hexo-generator-feed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hexo-generator-feed/-/hexo-generator-feed-1.1.0.tgz", + "integrity": "sha1-mti45x7bzT2NF15DZwlzadbyHQI=", + "requires": { + "nunjucks": "^1.3.4", + "object-assign": "^4.0.1" + }, + "dependencies": { + "nunjucks": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.3.4.tgz", + "integrity": "sha1-Td0QqDZLGmTT49fSqNQ2gTHTkEI=", + "requires": { + "chokidar": "~0.12.5", + "optimist": "*" + }, + "dependencies": { + "chokidar": { + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.12.6.tgz", + "integrity": "sha1-viBPW5Y04AkxElbl1ujg5QgoTS8=", + "requires": { + "async-each": "~0.1.5", + "fsevents": "~0.3.1", + "readdirp": "~1.3.0" + }, + "dependencies": { + "async-each": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", + "integrity": "sha1-tn6Z7c3fllQeRK9WKQzX1cbnBDk=" + }, + "fsevents": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.8.tgz", + "integrity": "sha1-mZLxAyySXIKVVNDVmAHcoDE6U1Y=", + "optional": true, + "requires": { + "nan": "^2.0.2" + }, + "dependencies": { + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + }, + "readdirp": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-1.3.0.tgz", + "integrity": "sha1-6vGptGO+moGQ/JrhY6oayTSqNAs=", + "requires": { + "graceful-fs": "~2.0.0", + "minimatch": "~0.2.12", + "readable-stream": "~1.0.26-2" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "integrity": "sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + } + } + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-generator-index": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hexo-generator-index/-/hexo-generator-index-0.2.0.tgz", + "integrity": "sha1-5vyAFOD4mTYvOlqelCjO/rzJHAk=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-generator-sitemap": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/hexo-generator-sitemap/-/hexo-generator-sitemap-1.1.2.tgz", + "integrity": "sha1-ep7ddXj0okTVvnx9NiD5dUyrFlo=", + "requires": { + "minimatch": "^3.0.0", + "nunjucks": "^2.3.0", + "object-assign": "^4.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "nunjucks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-2.3.0.tgz", + "integrity": "sha1-put8RLoSh28HY6nFm6f9iVn2X9c=", + "requires": { + "asap": "^2.0.3", + "chokidar": "^1.0.0", + "optimist": "*" + }, + "dependencies": { + "asap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.3.tgz", + "integrity": "sha1-H8HRVk7hFiDfym1nAphQkT+fRnk=" + }, + "chokidar": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.4.2.tgz", + "integrity": "sha1-Pq6mwomPpyCBhKRT1Iiamt31Z9I=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^0.1.6", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "requires": { + "arrify": "^1.0.0", + "micromatch": "^2.1.5" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "micromatch": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz", + "integrity": "sha1-Ly6F70YUDb6my1XnObaxGzDqpQk=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + }, + "dependencies": { + "arr-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", + "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=" + } + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.3.tgz", + "integrity": "sha1-NdTn3aYysz4hXTioqc9DKcnHXSw=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "dependencies": { + "expand-range": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.1.tgz", + "integrity": "sha1-rL1j5W79kTlyK3VfCZudtawfM/Y=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.0.0.tgz", + "integrity": "sha1-II3ocr1zeMKpKvlCij9W65GhIsQ=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "randomatic": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", + "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", + "requires": { + "is-number": "^2.0.2", + "kind-of": "^3.0.2" + } + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + } + } + }, + "expand-brackets": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.4.tgz", + "integrity": "sha1-eXueSEEBIF9BjOyuxjEsEy9R4q4=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "normalize-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", + "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=" + }, + "object.omit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", + "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", + "requires": { + "for-own": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.3.tgz", + "integrity": "sha1-YGREzed8LwoRCIFp4uNU6vVudP4=", + "requires": { + "for-in": "^0.1.4" + }, + "dependencies": { + "for-in": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.4.tgz", + "integrity": "sha1-n1z3tP/H4a5lkaTpexd6pZ1w+y4=" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "is-dotfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.2.tgz", + "integrity": "sha1-bk+Jwma8A8M/0SnAYhhGh/RmNIc=", + "requires": { + "is-equal-shallow": "^0.1.1", + "is-primitive": "^2.0.0" + }, + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + } + } + } + } + } + } + }, + "async-each": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", + "integrity": "sha1-tn6Z7c3fllQeRK9WKQzX1cbnBDk=" + }, + "fsevents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.7.tgz", + "integrity": "sha1-LZBYW7ysn/U1/xoalLBOu1CAhY8=", + "optional": true, + "requires": { + "nan": "^2.1.0", + "node-pre-gyp": "^0.6.19" + }, + "dependencies": { + "ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz", + "integrity": "sha1-dLLx8YfIVTx/lQFby3YAn7Q9OOA=", + "optional": true + }, + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", + "optional": true + }, + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=", + "optional": true + }, + "are-we-there-yet": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.5.tgz", + "integrity": "sha1-I58mcG2pAqK/+3LDPeZv39N5isU=", + "optional": true, + "requires": { + "delegates": "^0.1.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "optional": true + }, + "async": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.1.tgz", + "integrity": "sha1-sFcU9LEbNXv3mtr/3QbaQtB2bBA=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "bl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "integrity": "sha1-ramoqJptesYIYvfex9sgeHPgw/U=", + "optional": true, + "requires": { + "readable-stream": "~2.0.0" + } + }, + "block-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", + "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "optional": true + }, + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "optional": true, + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "optional": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.11.0.tgz", + "integrity": "sha1-ur04ktcatAOUjGornWX33hrOjpI=", + "optional": true, + "requires": { + "assert-plus": "0.1.x" + } + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "optional": true + }, + "deep-extend": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz", + "integrity": "sha1-9YtG21jrXWQ5zdDy5sr7Rzn8EoM=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true + }, + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha1-tLV74RoWU1F6BLJ/CUm9wyff45A=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=", + "optional": true + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", + "optional": true, + "requires": { + "async": "^1.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.3" + } + }, + "fstream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", + "integrity": "sha1-fo16c6uzZH7zbkuKFcqAHboD0Dg=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", + "integrity": "sha1-THTZH6iLIrQvT4ahiigg3XnY/N0=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "integrity": "sha1-BbZzChmo/K08NAoULwlFIio/gVs=", + "optional": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^1.0.0", + "lodash.pad": "^3.0.0", + "lodash.padleft": "^3.0.0", + "lodash.padright": "^3.0.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "optional": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz", + "integrity": "sha1-/iI5t1dJcuZ+QfgIgj+b+kqZHjc=", + "optional": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "optional": true + }, + "har-validator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz", + "integrity": "sha1-Wp4SVkpXHPC4Hvk8IVe9FhcWiIM=", + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.3", + "pinkie-promise": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz", + "integrity": "sha1-xG/O6gU+uOx4m/+7ol/KUt/c844=", + "optional": true + }, + "hawk": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz", + "integrity": "sha1-kMkBGIhuIZddGtSumz4oTtGaLeg=", + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "optional": true + }, + "http-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.tgz", + "integrity": "sha1-XS1+m270mYCtWxKNjk7wmjHJDZU=", + "optional": true, + "requires": { + "assert-plus": "^0.1.5", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "optional": true + }, + "is-my-json-valid": { + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz", + "integrity": "sha1-WjnR12stu4MUC70Vex1e5L3IWtY=", + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", + "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", + "optional": true + }, + "json-schema": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", + "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsonpointer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", + "optional": true + }, + "jsprim": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", + "integrity": "sha1-8gyQaskqvVjjt5rIvHCkiDJRLaE=", + "optional": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.2", + "verror": "1.3.6" + } + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "optional": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "optional": true, + "requires": { + "lodash.repeat": "^3.0.0" + } + }, + "lodash.pad": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "integrity": "sha1-LgeOvDOzMdK6NL+HMq8Sn9XARiQ=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padleft": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "integrity": "sha1-FQFR8eAkXtuhXVCvLXHx1c/0ZTA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padright": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "integrity": "sha1-efd3C6qjlzjAQK61Rl6NiPKqzsA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + }, + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=", + "optional": true + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "optional": true, + "requires": { + "mime-db": "~1.21.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.19", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.19.tgz", + "integrity": "sha1-hCut/y6cQjxagX4Gj/6PhIfcEBY=", + "optional": true, + "requires": { + "mkdirp": "~0.5.0", + "nopt": "~3.0.1", + "npmlog": "~2.0.0", + "rc": "~1.1.0", + "request": "2.x", + "rimraf": "~2.5.0", + "semver": "~5.1.0", + "tar": "~2.2.0", + "tar-pack": "~3.1.0" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + }, + "dependencies": { + "abbrev": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", + "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=", + "optional": true + } + } + } + } + }, + "node-uuid": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", + "optional": true + }, + "npmlog": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz", + "integrity": "sha1-QHbCAKPdpREz5vPPBSEwEF94u98=", + "optional": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "oauth-sign": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz", + "integrity": "sha1-k4/ch1dlulJxN9iuydF44k3rxVM=", + "optional": true + }, + "once": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz", + "integrity": "sha1-nbV0kzzLCMOnYU0VQDLAnqbzOec=", + "optional": true + }, + "pinkie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz", + "integrity": "sha1-QjbIb8KfJhwgRbvoH3jLsqXoMGw=", + "optional": true + }, + "pinkie-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "integrity": "sha1-TINTjeH25mDCngoTRGhE96foglk=", + "optional": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=", + "optional": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "optional": true + }, + "rc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", + "integrity": "sha1-Q2UbdrauU7XIAvEVH6P8OwWZack=", + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~1.0.4" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.67.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", + "integrity": "sha1-ivdHgOK/EeoK6aqWXBHxGv0nJ0I=", + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "bl": "~1.0.0", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc3", + "har-validator": "~2.0.2", + "hawk": "~3.1.0", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.0", + "qs": "~5.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.2.0", + "tunnel-agent": "~0.4.1" + } + }, + "rimraf": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.0.tgz", + "integrity": "sha1-MMCWzfdy4mvz4dLP+EwhllQam7Y=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + }, + "semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.2.tgz", + "integrity": "sha1-5etD0GYr0gEDcyftuLj2RlasqEI=", + "optional": true, + "requires": { + "asn1": ">=0.2.3 <0.3.0", + "assert-plus": ">=0.2.0 <0.3.0", + "dashdash": ">=1.10.1 <2.0.0", + "ecc-jsbn": ">=0.0.1 <1.0.0", + "jodid25519": ">=1.0.0 <2.0.0", + "jsbn": ">=0.1.0 <0.2.0", + "tweetnacl": ">=0.13.0 <1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "optional": true + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "optional": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.2.tgz", + "integrity": "sha1-FfxXw3kji9NQ73sYKi4rr4Jv4Eg=", + "optional": true, + "requires": { + "debug": "~0.7.2", + "fstream": "~1.0.8", + "fstream-ignore": "~1.0.3", + "once": "~1.1.1", + "readable-stream": "~2.0.4", + "rimraf": "~2.4.4", + "tar": "~2.2.1", + "uid-number": "0.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + } + } + }, + "tough-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", + "integrity": "sha1-OwUWt5nnDoFkQ2oURuflh3/aEY4=", + "optional": true + }, + "tunnel-agent": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", + "integrity": "sha1-EQTj82rIcSXChycAZ9WC0YEzv+4=", + "optional": true + }, + "tweetnacl": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz", + "integrity": "sha1-RTFhdwRp1FzSZsNkBOK8maj6mUQ=", + "optional": true + }, + "uid-number": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz", + "integrity": "sha1-zvsPoTjY2AmNpxpAoNBKgyfW4cw=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "optional": true + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + }, + "dependencies": { + "binary-extensions": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.4.0.tgz", + "integrity": "sha1-1zPMtiiYbXsybYhlbg3b06rDUbc=" + } + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" + }, + "readdirp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", + "integrity": "sha1-zAm6XRLY/rhkvHX24uvBNwYMvYI=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^2.0.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + } + } + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-generator-tag": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hexo-generator-tag/-/hexo-generator-tag-0.2.0.tgz", + "integrity": "sha1-xXFYRrtB5X2cIMHWbX2yGhq/emI=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-i18n": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/hexo-i18n/download/hexo-i18n-0.2.1.tgz", + "integrity": "sha1-hPFBQyvwnYtVjth4xygWS20c1t4=", + "requires": { + "sprintf-js": "^1.0.2" + } + }, + "hexo-inject": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexo-inject/-/hexo-inject-1.0.0.tgz", + "integrity": "sha1-pTVXVgUdWrJ5yCtzfacrEzx+Ju0=", + "requires": { + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-polyfill": "^6.7.2", + "bluebird": "^3.3.4", + "core-decorators": "^0.11.0", + "underscore": "^1.8.3" + } + }, + "hexo-log": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/hexo-log/download/hexo-log-0.2.0.tgz", + "integrity": "sha1-0w/UXhoSqDyIAzWGZASF78XfWm8=", + "requires": { + "chalk": "^1.1.1", + "hexo-bunyan": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "hexo-renderer-ejs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/hexo-renderer-ejs/-/hexo-renderer-ejs-0.1.1.tgz", + "integrity": "sha1-QV0voz2ZUHUmpdCjceNoBnibFyw=", + "requires": { + "ejs": "^1.0.0", + "object-assign": "^4.0.1" + }, + "dependencies": { + "ejs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz", + "integrity": "sha1-ycYKSKRu5FL7MqccMXuV5aofyz0=" + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-renderer-jade": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/hexo-renderer-jade/-/hexo-renderer-jade-0.1.0.tgz", + "integrity": "sha1-Cf4udkStwLEf8p/TTgKd/LToQOk=", + "requires": { + "jade": "^1.3.1" + }, + "dependencies": { + "jade": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", + "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", + "requires": { + "character-parser": "1.2.1", + "clean-css": "^3.1.9", + "commander": "~2.6.0", + "constantinople": "~3.0.1", + "jstransformer": "0.0.2", + "mkdirp": "~0.5.0", + "transformers": "2.1.0", + "uglify-js": "^2.4.19", + "void-elements": "~2.0.1", + "with": "~4.0.0" + }, + "dependencies": { + "character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" + }, + "clean-css": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.9.tgz", + "integrity": "sha1-lUxJw0lodj9QsF/Q3eRGlM+dLrk=", + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + } + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + }, + "commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" + }, + "constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", + "requires": { + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + } + } + }, + "jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", + "requires": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" + }, + "dependencies": { + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "promise": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", + "requires": { + "asap": "~1.0.0" + }, + "dependencies": { + "asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", + "requires": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + }, + "dependencies": { + "css": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", + "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", + "requires": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + }, + "dependencies": { + "css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" + }, + "css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" + } + } + }, + "promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", + "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", + "requires": { + "is-promise": "~1" + }, + "dependencies": { + "is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" + } + } + }, + "uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "requires": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + }, + "dependencies": { + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "requires": { + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + } + } + }, + "uglify-js": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.1.tgz", + "integrity": "sha1-7bvhiIujUl3tOnv4NrMLNAXTFhs=", + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", + "integrity": "sha1-gmdLhacbC+dsPnQW0V6fUlLrO+A=" + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + }, + "lazy-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.3.tgz", + "integrity": "sha1-6XdUYY+ciGu5mbL/aceLgkU9ZnQ=" + } + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + } + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "decamelize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.2.tgz", + "integrity": "sha1-3Mk3J74gljLpiwJxjvTLeWAjIvI=", + "requires": { + "escape-string-regexp": "^1.0.4" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + } + } + } + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "with": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", + "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", + "requires": { + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" + }, + "dependencies": { + "acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "requires": { + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + } + } + } + } + } + } + } + } + }, + "hexo-renderer-marked": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/hexo-renderer-marked/-/hexo-renderer-marked-0.2.9.tgz", + "integrity": "sha1-zSytfgtOGiqWR4dIyIAVBgN0GgU=", + "requires": { + "hexo-util": "^0.5.1", + "marked": "^0.3.5", + "object-assign": "^4.0.1", + "strip-indent": "^1.0.1" + }, + "dependencies": { + "hexo-util": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-0.5.2.tgz", + "integrity": "sha1-mHuzD82iPimW2J0KdHT7NVxv/go=", + "requires": { + "bluebird": "^3.0.6", + "camel-case": "^1.2.0", + "cross-spawn": "^2.1.5", + "highlight.js": "^9.0.0", + "html-entities": "^1.2.0", + "striptags": "^2.1.1" + }, + "dependencies": { + "bluebird": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.0.tgz", + "integrity": "sha1-VMqdBB1+XnWTUmR7SZV03fV0qFI=" + }, + "camel-case": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz", + "integrity": "sha1-Gsp8TRlTWaLOmVV5NDPG5VQlEfI=", + "requires": { + "sentence-case": "^1.1.1", + "upper-case": "^1.1.1" + }, + "dependencies": { + "sentence-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz", + "integrity": "sha1-gDSq/CFFdy06vhUJqkLJ4QQtwTk=", + "requires": { + "lower-case": "^1.1.1" + }, + "dependencies": { + "lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.3.tgz", + "integrity": "sha1-ySOT2XZ5Pu5bpO21g8+OrjW9m/s=" + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + } + } + }, + "cross-spawn": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-2.1.5.tgz", + "integrity": "sha1-CeHu+3YXJw9PnK1Bdm5/y9LGrmw=", + "requires": { + "cross-spawn-async": "^2.0.0", + "spawn-sync": "^1.0.15" + }, + "dependencies": { + "cross-spawn-async": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.1.8.tgz", + "integrity": "sha1-LYdpsknUDb4jH90NGM6pkDKKryw=", + "requires": { + "lru-cache": "^4.0.0", + "which": "^1.2.4" + }, + "dependencies": { + "lru-cache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", + "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "yallist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", + "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=" + } + } + }, + "which": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz", + "integrity": "sha1-FVf5YIBgTlsRs1meufRbUKnv1yI=", + "requires": { + "is-absolute": "^0.1.7", + "isexe": "^1.1.1" + }, + "dependencies": { + "is-absolute": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "requires": { + "is-relative": "^0.1.0" + }, + "dependencies": { + "is-relative": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=" + } + } + }, + "isexe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=" + } + } + } + } + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + }, + "dependencies": { + "concat-stream": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", + "integrity": "sha1-87gKz54fSOOHXAaItBtsMWAu6hw=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + } + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" + } + } + } + } + }, + "highlight.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.1.0.tgz", + "integrity": "sha1-65TBJfUrvSXciTVRtFw3xQk/HFw=" + }, + "html-entities": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.0.tgz", + "integrity": "sha1-QZSMr4XOgv7Tbk5qDtNxpmZDeeI=" + }, + "striptags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-2.1.1.tgz", + "integrity": "sha1-53G4sxk7l7vtOS3KWaeCedPIpqY=" + } + } + }, + "marked": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz", + "integrity": "sha1-QROhWsXXvKFYpargciRYe5+hW5Q=" + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + } + } + } + } + }, + "hexo-renderer-stylus": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/hexo-renderer-stylus/-/hexo-renderer-stylus-0.3.1.tgz", + "integrity": "sha1-m5E8FSuwN8k/frPmTSSK4hXIohg=", + "requires": { + "nib": "^1.1.0", + "stylus": "^0.53.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + }, + "nib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.0.tgz", + "integrity": "sha1-UnwZZioQorVl/oXpswnWIqp1V9M=", + "requires": { + "stylus": "0.49.x" + }, + "dependencies": { + "stylus": { + "version": "0.49.3", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.49.3.tgz", + "integrity": "sha1-H72r5HntRghyxxpiUqZ/lQQLpRE=", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "3.2.x", + "mkdirp": "0.3.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + } + } + } + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + } + } + }, + "stylus": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.53.0.tgz", + "integrity": "sha1-a1HnZlCX+N1KaWXhTO6l5Ln9cko=", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "3.2.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + } + } + }, + "hexo-server": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/hexo-server/-/hexo-server-0.1.3.tgz", + "integrity": "sha1-0pxi2kIjj9cOv8wgZcSSDi/tBHc=", + "requires": { + "bluebird": "^3.0.6", + "chalk": "^1.1.1", + "compression": "^1.6.0", + "connect": "3.x", + "mime": "^1.3.4", + "morgan": "^1.6.1", + "object-assign": "^4.0.1", + "opn": "^3.0.3", + "serve-static": "^1.10.0" + }, + "dependencies": { + "bluebird": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.0.tgz", + "integrity": "sha1-VMqdBB1+XnWTUmR7SZV03fV0qFI=" + }, + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=" + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "compression": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.6.1.tgz", + "integrity": "sha1-G/T5b9cgGaP9EVE7T8Tc070W21U=", + "requires": { + "accepts": "~1.3.1", + "bytes": "2.2.0", + "compressible": "~2.0.7", + "debug": "~2.2.0", + "on-headers": "~1.0.1", + "vary": "~1.1.0" + }, + "dependencies": { + "accepts": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.1.tgz", + "integrity": "sha1-3Clfr4UCTgWwT1pvr17sHR/Qd+U=", + "requires": { + "mime-types": "~2.1.9", + "negotiator": "0.6.0" + }, + "dependencies": { + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "negotiator": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.0.tgz", + "integrity": "sha1-M1k6WisM4wyYWEDG9WtvseqeOlU=" + } + } + }, + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=" + }, + "compressible": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.7.tgz", + "integrity": "sha1-IFjFJyL9PxU4pPIqsU0GNZBNGa4=", + "requires": { + "mime-db": ">= 1.21.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "vary": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz", + "integrity": "sha1-4eWv+70WrnaN0mdDlLmtMCJlMUA=" + } + } + }, + "connect": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "requires": { + "debug": "~2.2.0", + "finalhandler": "0.4.1", + "parseurl": "~1.3.1", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "finalhandler": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "requires": { + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "morgan": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "requires": { + "basic-auth": "~1.0.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-finished": "~2.3.0", + "on-headers": "~1.0.0" + }, + "dependencies": { + "basic-auth": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.3.tgz", + "integrity": "sha1-QfVVI+WJQFA47jVnlYxipe1wVRo=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + }, + "opn": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", + "requires": { + "object-assign": "^4.0.1" + } + }, + "serve-static": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", + "integrity": "sha1-/rgA0OciEk3QsAMzFgwW6cqovLM=", + "requires": { + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.1" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "send": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + } + } + } + } + }, + "hexo-util": { + "version": "0.6.3", + "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-0.6.3.tgz", + "integrity": "sha1-FqKt5Fe++VWvDf0io/5vCkmpE3w=", + "requires": { + "bluebird": "^3.4.0", + "camel-case": "^3.0.0", + "cross-spawn": "^4.0.0", + "highlight.js": "^9.4.0", + "html-entities": "^1.2.0", + "striptags": "^2.1.1" + } + }, + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=" + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/hoek/download/hoek-4.2.0.tgz", + "integrity": "sha1-ctnQdU9/4lyi0BrY+PmpRJqJUm0=", + "optional": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npm.taobao.org/jsdom/download/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "optional": true, + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.5.tgz", + "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "markdown": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/markdown/download/markdown-0.5.0.tgz", + "integrity": "sha1-KCBbVlqK51kt4gdGPWY33BgnIrI=", + "requires": { + "nopt": "~2.1.1" + } + }, + "mathjax-full": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.0.1.tgz", + "integrity": "sha512-KE4z2FF9PzKIHnK0HsMkThqLaOi+2DqN2T+QqqP465+vmCzftZyqXr7e6fp60xPC4nXTeMM1rcbBQJ9yjqwPAw==", + "requires": { + "esm": "^3.2.25", + "mj-context-menu": "^0.2.2", + "speech-rule-engine": "^3.0.0-beta.8" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "optional": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "optional": true, + "requires": { + "mime-db": "~1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "mj-context-menu": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.2.2.tgz", + "integrity": "sha512-OHlnKQqfFPEYZGdz2JWL0obrr82vVilha0WCUZslYfN+v+oz4VpmERnoHdTUWvOUVHNYjFkpOYnLEeHnt1BdsQ==" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.20.1.tgz", + "integrity": "sha1-1usaRsvMFKKy+UNBEsH/iQfzE/0=" + }, + "moment-timezone": { + "version": "0.5.14", + "resolved": "https://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.14.tgz", + "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/mv/download/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + } + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "optional": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, + "needle": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fingerprint": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/node-fingerprint/download/node-fingerprint-0.0.2.tgz", + "integrity": "sha1-Mcur63GmeufdWn3AQuUcPHWGhQE=" + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "nopt": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-2.1.2.tgz", + "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nunjucks": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/nunjucks/download/nunjucks-3.0.1.tgz", + "integrity": "sha1-TedKPlULr2+jNwMj89HHwqhr3E0=", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^1.6.0", + "yargs": "^3.32.0" + } + }, + "nwmatcher": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/nwmatcher/download/nwmatcher-1.4.3.tgz", + "integrity": "sha1-ZDSOOz2A8DW0CsEVY9J4+LctuJw=", + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "optional": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "optional": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/randomatic/download/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npm.taobao.org/request/download/request-2.83.0.tgz", + "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + }, + "safe-json-stringify": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/safe-json-stringify/download/safe-json-stringify-1.0.4.tgz", + "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/sntp/download/sntp-2.1.0.tgz", + "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", + "optional": true, + "requires": { + "hoek": "4.x.x" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "speech-rule-engine": { + "version": "3.0.0-beta.8", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-3.0.0-beta.8.tgz", + "integrity": "sha512-gnNap93Xrz5ngIqa/BOaJGatC64B7dqDrXK/pr4yAaZAcW6tKVO5PwaTvw9QqVab86ad5scpA39Nxwhlb11tTg==", + "requires": { + "commander": "*", + "wicked-good-xpath": "*", + "xmldom-sre": "^0.1.31" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npm.taobao.org/stringstream/download/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "striptags": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/striptags/download/striptags-2.2.1.tgz", + "integrity": "sha1-TEULcI1BuL85zyTEn/I0/Gqr/TI=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } + }, + "swig-extras": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/swig-extras/download/swig-extras-0.0.1.tgz", + "integrity": "sha1-tQP+3jcqucJMasaMr2VrzvGHIyg=", + "requires": { + "markdown": "~0.5.0" + } + }, + "swig-templates": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/swig-templates/download/swig-templates-2.0.2.tgz", + "integrity": "sha1-0lAqcwMBk1b06nbqkGXU9Yr2q3U=", + "requires": { + "optimist": "~0.6", + "uglify-js": "2.6.0" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/symbol-tree/download/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "optional": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "titlecase": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.2.tgz", + "integrity": "sha1-eBE9EQgIa4MmMxoyR96o9aSeqFM=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/tr46/download/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uglify-js": { + "version": "2.6.0", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.6.0.tgz", + "integrity": "sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE=", + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "underscore": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.2.1.tgz", + "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=", + "optional": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "warehouse": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/warehouse/download/warehouse-2.2.0.tgz", + "integrity": "sha1-XQnWSUKZK+Zn2PfIagnCuK6gQGI=", + "requires": { + "JSONStream": "^1.0.7", + "bluebird": "^3.2.2", + "cuid": "~1.3.8", + "graceful-fs": "^4.1.3", + "is-plain-object": "^2.0.1", + "lodash": "^4.2.1" + } + }, + "webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "optional": true + }, + "whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npm.taobao.org/whatwg-url-compat/download/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "optional": true, + "requires": { + "tr46": "~0.0.1" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "requires": { + "isexe": "^2.0.0" + } + }, + "wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha1-gbDpXoZQ5JyUsiKY//hoa1VTz2w=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "optional": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "optional": true + }, + "xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2696930 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "hexo": { + "version": "3.5.0" + }, + "dependencies": { + "canvas": "^2.4.0", + "hexo": "^3.5.0", + "hexo-browsersync": "^0.2.0", + "hexo-deployer-rsync": "^0.1.3", + "hexo-filter-mathjax": "^0.4.1", + "hexo-generator-archive": "^0.1.4", + "hexo-generator-category": "^0.1.3", + "hexo-generator-feed": "^1.1.0", + "hexo-generator-index": "^0.2.0", + "hexo-generator-sitemap": "^1.1.2", + "hexo-generator-tag": "^0.2.0", + "hexo-inject": "^1.0.0", + "hexo-renderer-ejs": "^0.1.1", + "hexo-renderer-jade": "^0.1.0", + "hexo-renderer-marked": "^0.2.9", + "hexo-renderer-stylus": "^0.3.0", + "hexo-server": "^0.1.3" + } +} diff --git a/public/2016/02/12/first-post/index.html b/public/2016/02/12/first-post/index.html new file mode 100644 index 0000000..ffdd6a0 --- /dev/null +++ b/public/2016/02/12/first-post/index.html @@ -0,0 +1,120 @@ + First Post · MarkDown

First Post

This is the very first post I wrote,

+

with Typora & Hexo.

+
\ No newline at end of file diff --git a/public/2016/02/15/Flask-Day-1/index.html b/public/2016/02/15/Flask-Day-1/index.html new file mode 100644 index 0000000..29aa144 --- /dev/null +++ b/public/2016/02/15/Flask-Day-1/index.html @@ -0,0 +1,145 @@ + Flask Day 1 · MarkDown

Flask Day 1

“Hello World” in Flask

Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

+
1
$ python3 -m venv flask
+

Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

+

And you should install flask and extensions by the commands below:

+
1
2
3
4
5
6
7
8
9
10
11
12
$ flask/bin/pip install flask
$ flask/bin/pip install flask-login
$ flask/bin/pip install flask-openid
$ flask/bin/pip install flask-mail
$ flask/bin/pip install flask-sqlalchemy
$ flask/bin/pip install sqlalchemy-migrate
$ flask/bin/pip install flask-whooshalchemy
$ flask/bin/pip install flask-wtf
$ flask/bin/pip install flask-babel
$ flask/bin/pip install guess_language
$ flask/bin/pip install flipflop
$ flask/bin/pip install coverage
+

After that, let’s create the basic structure for our application: app app/static app/templates tmp.

+
    +
  1. app — where the application package is
  2. +
  3. static — stores static files like images, javascripts, and css.
  4. +
  5. templates — where templates will go.
  6. +
+

Then you can start with __init__.py which should put into app folder (file app/__init__.py):

+
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
+

The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

+

Let’s see what a views function looks like (file app/views.py):

+
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
+

Finally we should create a script to starts up the web server with our application(file run.py):

+
1
2
3
#!flask/bin/python
from app import app
app.run(debug=True)
+

To indicating that is an executable file you need to run this in terminal:

+
1
$ chmod a+x run.py
+

Now the file structure should look like:

+
1
2
3
4
5
6
7
8
9
10
microblog\
flask\
<virtual environment files>
app\
static\
templates\
__init__.py
views.py
tmp\
run.py
+

Then start to write the template (file app/templates/index.html):

+
1
2
3
4
5
6
7
8
9
10
11
<html>

<head>
<title>{{ title }} - microblog</title>
</head>

<body>
<h1>Hello, {{ user.nickname }}!</h1>
</body>

</html>
+

Now let’s write the view function that uses this template (file app/views.py):

+
1
2
3
4
5
6
7
8
9
10
from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
user = {'nickname': 'ching'} # fake user
return render_template('index.html',
title='Home',
user=user)
+

render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

+
\ No newline at end of file diff --git a/public/2016/02/16/Flask-Day-2/index.html b/public/2016/02/16/Flask-Day-2/index.html new file mode 100644 index 0000000..890d67a --- /dev/null +++ b/public/2016/02/16/Flask-Day-2/index.html @@ -0,0 +1,129 @@ + Flask Day 2 · MarkDown

Flask Day 2

To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

+
1
2
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
+

And then you need to use this config (file app/__init__.py):

+
1
2
3
4
5
6
from flask import Flask

app = Flask(__name__)
app.config.from_object('config')

from app import views
+

Let’s build a simple form (file app/forms.app):

+
1
2
3
4
5
6
7
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired

class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
+

The DataRequired() is a validator that checks the field is empty or not.

+

After that, we need a HTML page to show the form (file app/templates/login.html):

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- extend from base layout -->
{% extends "base.html" %}

{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">
{{ form.hidden_tag() }}
<p>
Please enter your OpenID:<br>
{{ form.openid(size=80) }}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}
+

The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm

# index view function suppressed for brevity

app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID="%s", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
return render_template('login.html',
title='Sign In',
form=form)
+
\ No newline at end of file diff --git a/public/2016/04/25/Django-Manager-Method/index.html b/public/2016/04/25/Django-Manager-Method/index.html new file mode 100644 index 0000000..2b1f4eb --- /dev/null +++ b/public/2016/04/25/Django-Manager-Method/index.html @@ -0,0 +1,132 @@ + Django Manager Method · MarkDown

Django Manager Method

Django Manager

Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

+

eg.

+
1
2
3
4
5
from django.db import models

class Person(models.Model):
...
people = models.Manager()
+

上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

+

自定义 Manager

通常需要自定义 manager 的情况有两点:

+
    +
  1. 需要修改/扩展 Django 的 manager 方法
  2. +
  3. 需要修改返回的 QuerySet
  4. +
+

默认 Manager

如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

+

笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

+

eg.

+
1
2
3
4
5
6
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)

objects = models.Manager() # default manager
custom_objects = CustomBOokManager() # custom manager
+

source

+
\ No newline at end of file diff --git a/public/2016/05/04/Tastypie/index.html b/public/2016/05/04/Tastypie/index.html new file mode 100644 index 0000000..9706ca0 --- /dev/null +++ b/public/2016/05/04/Tastypie/index.html @@ -0,0 +1,131 @@ + Tastypie · MarkDown

Tastypie

Resources in Tastypie

Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

+

Understanding the process of creating a resource.

+
    +
  1. Import ModelResource from Tastypie.
  2. +
  3. Import models from services app
  4. +
  5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
  6. +
+

Add API URL in the urls.py of app.

+

Dehydrating the JSON data

flow

+

Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

+
Dehydrate_field method

This dehydrate_field is uesd to modify field on the response JSON.

+
Dehydrate method

Dehydrate method is useful for aadding additional fields to bundle (response data).

+

Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

+
\ No newline at end of file diff --git a/public/2016/05/10/TastyPie-Note-1/index.html b/public/2016/05/10/TastyPie-Note-1/index.html new file mode 100644 index 0000000..150f3be --- /dev/null +++ b/public/2016/05/10/TastyPie-Note-1/index.html @@ -0,0 +1,155 @@ + TastyPie Note 1 · MarkDown

TastyPie Note 1

Flow Through The Request/Response Cycle

Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

+

Walking through what a GET request to a list endpoint looks like:

+
    +
  • The Resource.urls are checked by Django’s url resolvers.

    +
  • +
  • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

    +
  • +
  • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

    +
  • +
  • dispatch does a bunch of havy lifting. It ensures:

    +
      +
    • the requested HTTP method is in allowed_methos (method_check).
    • +
    • the class has a method that can handle the request(get_list)
    • +
    • the user is authenticated(is_authenticated)
    • +
    • the user has no exceeded their throttle(throttle_check).
    • +
    +

    At this point, dispatch actually calls the requested method (get_list).

    +
  • +
  • get_list does the actual work of API. It does:

    +
      +
    • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
    • +
    • It then sorts the objects based on user input (ModelResource.apply_sorting).
    • +
    • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
    • +
    • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
    • +
    • Finally, it calls Resource.create_response.
    • +
    +
  • +
  • create_response is a shortcut method that:

    +
      +
    • Determines the desired response format (Resource.determine_format).
    • +
    • Serializes the data given to it in the proper format.
    • +
    • Returns a Django HttpResponse (200 OK) with the serialized data.
    • +
    +
  • +
  • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

    +
  • +
+
\ No newline at end of file diff --git a/public/2018/05/16/test/index.html b/public/2018/05/16/test/index.html new file mode 100644 index 0000000..f3cd306 --- /dev/null +++ b/public/2018/05/16/test/index.html @@ -0,0 +1,6 @@ + test · MarkDown

test

test title


+

fadafasd

+

fasdasf

+
+

fasdf

+
\ No newline at end of file diff --git a/public/2018/05/31/bash-function-and-awk/index.html b/public/2018/05/31/bash-function-and-awk/index.html new file mode 100644 index 0000000..50860ea --- /dev/null +++ b/public/2018/05/31/bash-function-and-awk/index.html @@ -0,0 +1,130 @@ + bash function and awk · MarkDown

bash function and awk

I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

+

bash functions

Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

+
1
2
3
4
function run {
source ~/Develop/django/bin/activate
./manage.py runserver
}
+

I activate django virtural enviroment first and then run django serve.

+

Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

+
1
2
function ba { hgba | grep "$1" }
# hgba is an alias for hg branches
+

I can just type ba release then get current release branch info.

+
+

Append:

+

I made some updates to the ba function and make it auto copying the branch result to my clipboard:

+
1
2

function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
+

awk

awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

+
\ No newline at end of file diff --git a/public/2019/03/12/Postgresql-Partitioning/index.html b/public/2019/03/12/Postgresql-Partitioning/index.html new file mode 100644 index 0000000..06b5740 --- /dev/null +++ b/public/2019/03/12/Postgresql-Partitioning/index.html @@ -0,0 +1,146 @@ + Postgresql Partitioning · MarkDown

Postgresql Partitioning

Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

+

Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

+

There are two forms of partitioning can be implemented in PostgreSQL:

+
    +
  • Range Partitioning

    +

    ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

    +
  • +
  • List Partitioning

    +

    ​ The table is partitioned by explicitly listing which key values appear in each partition.

    +
  • +
+

Implementing Partitioning

    +
  1. Create the “master” / “parent” table, from which all the partitions will inherit.

    +

    ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

    +
  2. +
  3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

    +
  4. +
  5. Add table constraints to the partition tables to define the allowed key values in each partitions.

    +

    ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

    +
  6. +
  7. Create indexes on column(s) for each partitions.

    +
  8. +
  9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

    +
  10. +
  11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

    +
  12. +
+

Trigger

As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

+
\ No newline at end of file diff --git a/public/2019/11/14/AWS-KMS/index.html b/public/2019/11/14/AWS-KMS/index.html new file mode 100644 index 0000000..20494a8 --- /dev/null +++ b/public/2019/11/14/AWS-KMS/index.html @@ -0,0 +1,121 @@ + AWS KMS · MarkDown

AWS KMS

We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

+

Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

+

TBD

+
\ No newline at end of file diff --git a/public/2020/03/17/leetcode-121/index.html b/public/2020/03/17/leetcode-121/index.html new file mode 100644 index 0000000..cf8c4db --- /dev/null +++ b/public/2020/03/17/leetcode-121/index.html @@ -0,0 +1,125 @@ + leetcode-121 · MarkDown

leetcode-121

121. 买卖股票的最佳时机

题目

+ +

原始答案:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
max_sellout = prices[0]
l = len(prices)
i = 0
for buyin in prices:
if i == l:
return profit
if min_buyin <= buyin:
max_sellout = max(prices[i:])
p = max_sellout - min_buyin
if p > profit:
profit = p
if buyin < min_buyin:
min_buyin = buyin
i += 1
return profit
#1880 ms 14.4 MB
+

主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。

+

仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
for i in range(1, len(prices)):
min_buyin = min(min_buyin, prices[i-1])
profit = max(prices[i] - min_buyin, profit)
return profit
#44 ms 14.4 MB
+
\ No newline at end of file diff --git a/public/2020/03/18/leetcode-206/index.html b/public/2020/03/18/leetcode-206/index.html new file mode 100644 index 0000000..e05764d --- /dev/null +++ b/public/2020/03/18/leetcode-206/index.html @@ -0,0 +1,128 @@ + leetcode-206 · MarkDown

leetcode-206

206. 反转链表

题目

+ +

最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
nl = []
while head.next:
nl.append(head)
head = head.next
nl.append(head)
l = len(nl)
for x in range(l):
if x == 0:
nl[x].next = None
continue
nl[x].next = nl[x-1]
if x == (l - 1):
return nl[x]
+

仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:

+
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
prev_node = None
next_node = head.next
while head:
next_node = head.next
head.next = prev_node
prev_node = head
head = next_node
return prev_node
+

然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def reverseList(self, head):
if not head:
return head
if head.next:
ss = Solution()
last = ss.reverseList(head.next)
head.next.next = head
head.next = None
return last
return head
+

一开始是用list来打草稿,不过想明白递归之后就大同小异了:

+
1
2
3
4
5
6
7
8
9
def a(l:list)->list:
k=[l[0]]

if l[1:]:
b=a(l[1:])
b.extend(k)
else:
return [l[0]]
return b
+
\ No newline at end of file diff --git a/public/2020/03/23/leetcode-169/index.html b/public/2020/03/23/leetcode-169/index.html new file mode 100644 index 0000000..a6956c9 --- /dev/null +++ b/public/2020/03/23/leetcode-169/index.html @@ -0,0 +1,126 @@ + leetcode-169 · MarkDown

leetcode-169

169. 多数元素

题目

+ +

一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\cfrac{n}{2}$ 时就可以得出结果。

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def majorityElement(self, nums) -> int:
d = {}
l = len(nums)
for n in nums:
if not n in d:
d[n] = 0
d[n] = d[n] + 1
if d[n] > l/2:
return n
# 64 ms 15.1 MB
+

Python 也有专门计数的库,写起来更简单一点:

+
1
2
3
4
5
class Solution:
def majorityElement(self, nums):
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
# 44 ms 15.1 MB
+

由于要找的数出现次数大于 $\cfrac{n}{2}$,脑子里掠过一下蒙特卡罗算法,后来在官方解答中也看到类似的思路了:

+
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate

#作者:LeetCode-Solution
#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/
#来源:力扣(LeetCode)
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
\ No newline at end of file diff --git a/public/2020/03/23/leetcode-225/index.html b/public/2020/03/23/leetcode-225/index.html new file mode 100644 index 0000000..02b6a24 --- /dev/null +++ b/public/2020/03/23/leetcode-225/index.html @@ -0,0 +1,122 @@ + leetcode-225 · MarkDown

leetcode-225

225. 用队列实现栈

题目

+ +

注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class MyStack:

def __init__(self):
"""
Initialize your data structure here.
"""
self.data = []


def push(self, x: int) -> None:
"""
Push element x onto stack.
"""
self.data.append(x)
return


def pop(self) -> int:
"""
Removes the element on top of the stack and returns that element.
"""
return self.data.pop(-1)


def top(self) -> int:
"""
Get the top element.
"""
return self.data[-1]


def empty(self) -> bool:
"""
Returns whether the stack is empty.
"""
return not bool(self.data)



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

#24 ms 13.5 MB
+
\ No newline at end of file diff --git a/public/2020/03/25/leetcode-409/index.html b/public/2020/03/25/leetcode-409/index.html new file mode 100644 index 0000000..ceb8262 --- /dev/null +++ b/public/2020/03/25/leetcode-409/index.html @@ -0,0 +1,123 @@ + leetcode-409 · MarkDown

leetcode-409

409. 最长回文串

题目

+ +

一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。

+

这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def longestPalindrome(self, s: str) -> int:
d = {}
for l in s:
if not l in d:
d[l] = 0
d[l] += 1

i = 0
odd = False
for k, v in d.items():
if v % 2:
i += (v-1)
odd = True
else:
i += v
if odd:
i += 1
return i

#40 ms 13.6 MB
+
\ No newline at end of file diff --git a/public/2020/03/25/leetcode-543/index.html b/public/2020/03/25/leetcode-543/index.html new file mode 100644 index 0000000..7ef6f85 --- /dev/null +++ b/public/2020/03/25/leetcode-543/index.html @@ -0,0 +1,125 @@ + leetcode-543 · MarkDown

leetcode-543

543. 二叉树的直径

题目

+ +

这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
last_node = -1
routes = []
start = root
node_stack = [root]
while (start.left or start.right or node_stack):
if start != node_stack[-1]:
node_stack.append(start)

if last_node == start.right:
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]
continue

if start.left and last_node != start.left:
start = start.left
last_node = start
continue

if start.right:
start = start.right
last_node = start
continue

routes.append(node_stack)
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]

max_l = 0
for route in routes:
for route_ in routes:
intersection = 0
if route != route_:
intersection = len(set(route).intersection(set(route_)))
if intersection:
intersection -= 1
max_l = max(max_l, len(set(route)| set(route_)) - intersection)
return max_l - 1
+

L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。

+

其实以某个点为根节点的树的直径,就是某个节点的左子树的深度和右子树的深度的和,用递归来处理这个会比较容易理解

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def diameterOfBinaryTree(self, root):
self.ans = 1
def depth(node):
# 访问到空节点了,返回0
if not node: return 0
# 左儿子为根的子树的深度
L = depth(node.left)
# 右儿子为根的子树的深度
R = depth(node.right)
# 计算d_node即L+R+1 并更新ans
self.ans = max(self.ans, L+R+1)
# 返回该节点为根的子树的深度
return max(L, R) + 1

depth(root)
return self.ans - 1

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
\ No newline at end of file diff --git a/public/2020/03/25/leetcode-836/index.html b/public/2020/03/25/leetcode-836/index.html new file mode 100644 index 0000000..25944b8 --- /dev/null +++ b/public/2020/03/25/leetcode-836/index.html @@ -0,0 +1,122 @@ + leetcode-836 · MarkDown

leetcode-836

836. 矩形重叠

题目

+ +

看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。

+
1
2
3
4
5
6
7
8
9
class Solution:
def isRectangleOverlap(self, rec1, rec2) -> bool:
return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))
and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))

s = Solution()
s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])

#40 ms 13.7 MB
+
\ No newline at end of file diff --git a/public/2020/03/26/leetcode-876/index.html b/public/2020/03/26/leetcode-876/index.html new file mode 100644 index 0000000..189c66d --- /dev/null +++ b/public/2020/03/26/leetcode-876/index.html @@ -0,0 +1,124 @@ + leetcode-876 · MarkDown

leetcode-876

876. 链表的中间结点

题目

+ +

思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def middleNode(self, head: ListNode) -> ListNode:
l = []
n = head
while n.next:
l.append(n)
n = n.next
l.append(n)
return l[len(l)//2]

#44 ms 13.7 MB
+

看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。

+
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
\ No newline at end of file diff --git a/public/2020/03/29/leetcode-1013/index.html b/public/2020/03/29/leetcode-1013/index.html new file mode 100644 index 0000000..cc4514f --- /dev/null +++ b/public/2020/03/29/leetcode-1013/index.html @@ -0,0 +1,122 @@ + leetcode-1013 · MarkDown

leetcode-1013

1013. 将数组分成和相等的三个部分

题目

+ +

因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def canThreePartsEqualSum(self, A) -> bool:
if not A:
return False
sa = sum(A)
if sa % 3:
return False
s = sa // 3
s1 = 0
s2 = 0


for i in range(len(A)):
s1 += A[i]
if s1 == s and (i+1) < len(A):
for j in range(len(A[i+1:])):
s2 += A[i+1+j]
if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:
return True
return False
#60 ms 18.7 MB
+
\ No newline at end of file diff --git a/public/2020/03/29/leetcode-914/index.html b/public/2020/03/29/leetcode-914/index.html new file mode 100644 index 0000000..c7c5317 --- /dev/null +++ b/public/2020/03/29/leetcode-914/index.html @@ -0,0 +1,122 @@ + leetcode-914 · MarkDown

leetcode-914

914. 卡牌分组

题目

+ +

将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def hasGroupsSizeX(self, deck) -> bool:
dc = {}
max_d = 0
for d in deck:
if d not in dc:
dc[d] = 0
dc[d] += 1
if max_d < d:
max_d = d
if max_d < dc[d]:
max_d = dc[d]
has_x = True
if max_d == 1:
max_d = 2

for i in range(2, max_d + 1):
has_x = True
for k,v in dc.items():
if v % i:
has_x = False
break
if has_x and i >= 2:
return True
return False

#56 ms 13.8 MB
+
\ No newline at end of file diff --git a/public/2020/03/30/leetcode-1071/index.html b/public/2020/03/30/leetcode-1071/index.html new file mode 100644 index 0000000..0871898 --- /dev/null +++ b/public/2020/03/30/leetcode-1071/index.html @@ -0,0 +1,123 @@ + leetcode-1071 · MarkDown

leetcode-1071

1071. 字符串的最大公因子

题目

+ +

如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def gcdOfStrings(self, str1: str, str2: str) -> str:
if str1[0] != str2[0]:
return ''

a = len(str1)
b = len(str2)
print(a, b)
if a < b:
str1, str2 = str2, str1
a = len(str1)
b = len(str2)

if not a%b:
for x in range(0, a//b):
if str1[x*b:(x+1)*b] != str2:
return ''
return str2
else:
for x in range(b, 0, -1):
print(x)
if x==b or b%x or a%x:
continue
for y in range(0, b//x):
if str2[y*x:(y+1)*x] != str2[b-x:b]:
return ''
for y in range(0, a//x):
if str1[y*x:(y+1)*x] != str2[0:x]:
return ''
return str2[0:x]
# 44 ms 13.9 MB
+

官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,可以证明必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。

+
\ No newline at end of file diff --git a/public/2020/03/30/leetcode-999/index.html b/public/2020/03/30/leetcode-999/index.html new file mode 100644 index 0000000..92c4c9b --- /dev/null +++ b/public/2020/03/30/leetcode-999/index.html @@ -0,0 +1,123 @@ + leetcode-999 · MarkDown

leetcode-999

999. 可以被一步捕获的棋子数

题目

+ +

遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def numRookCaptures(self, board) -> int:
i = j = 0
for row in board:
if 'R' in row:
break
i += 1
j = row.index('R')
count = 0
# right
for x in range(j + 1, 8):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# left
for x in range(j, 0, -1):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# up
for x in range(i, 0, -1):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break
# down
for x in range(i+1, 8):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break

return count

#36 ms 13.6 MB
+

问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。

+
\ No newline at end of file diff --git a/public/2020/04/01/leetcode-1103/index.html b/public/2020/04/01/leetcode-1103/index.html new file mode 100644 index 0000000..c2a16a2 --- /dev/null +++ b/public/2020/04/01/leetcode-1103/index.html @@ -0,0 +1,122 @@ + leetcode-1103 · MarkDown

leetcode-1103

1103. 分糖果 II

题目

+ +

小学奥数题。主要思路就是等差数列求和 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def distributeCandies(self, candies: int, num_people: int):
total = 0
i = 0
# import ipdb; ipdb.set_trace()
while total <= candies:
t = (num_people*i)*num_people + int((1+num_people)*num_people/2)
if total + t <= candies:
total += t
i += 1
else:
break
remaining = candies - total
print(total, remaining, i)
l = []
for n in range(1, num_people+1):
if not total:
current_candy = n
else:
current_candy = n+i*num_people

n_count = int((0+(i-1))*(i)/2)
print(current_candy, n_count)
if remaining >= current_candy:
l.append(n_count*num_people + n*i + current_candy)
remaining -= current_candy
else:
l.append(n_count*num_people + n*i + remaining)
remaining = 0
return l
# 28 ms 13.7 MB,
+
\ No newline at end of file diff --git a/public/2020/04/01/leetcode-1160/index.html b/public/2020/04/01/leetcode-1160/index.html new file mode 100644 index 0000000..8ca9277 --- /dev/null +++ b/public/2020/04/01/leetcode-1160/index.html @@ -0,0 +1,122 @@ + leetcode-1160 · MarkDown

leetcode-1160

1160. 拼写单词

题目

+ +

利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def countCharacters(self, words, chars: str) -> int:

words_ = ''
for w in words:
lchars = list(chars)
try:
for l in w:
lchars.remove(l)
except:
continue
words_ += w

return len(words_)
# 152 ms 14.1 MB
+
\ No newline at end of file diff --git a/public/2020/04/01/leetcode-compress-string-lcci/index.html b/public/2020/04/01/leetcode-compress-string-lcci/index.html new file mode 100644 index 0000000..1d54f2f --- /dev/null +++ b/public/2020/04/01/leetcode-compress-string-lcci/index.html @@ -0,0 +1,122 @@ + leetcode-compress-string-lcci · MarkDown

leetcode-compress-string-lcci

面试题 01.06. 字符串压缩

题目

+ +

遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def compressString(self, S: str) -> str:
if not S:
return S
c = ''
prev = S[0]
p_len = 1
for w in S[1:]:
if w != prev:
c += '%s%s' % (prev, p_len)
prev = w
p_len = 1
else:
p_len += 1
c += '%s%s' % (prev, p_len)
if len(S) > len(c):
return c
return S
# 52 ms 13.8 MB
+
\ No newline at end of file diff --git a/public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html b/public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html new file mode 100644 index 0000000..c6367ef --- /dev/null +++ b/public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html @@ -0,0 +1,123 @@ + leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof · MarkDown

leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof

面试题57 - II. 和为s的连续正数序列

题目

+ +

又是小学奥数。由等差数列求和公式 可知,当首项为 1 的时候项数最多,又由于是连续正整数,,那最大的 就不大于

+

由小到大遍历 ,可以求得首项。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Solution:
def findContinuousSequence(self, target: int):
n = int(math.sqrt(2 * target) + 1)
if n < 2:
return []
sum_list = []
a = 0
for i in range(2, n+1):
a = ((2 * target) / i + 1 - i) / 2
if a and not a % 1:
a = int(a)
s_ = []
for j in range(0, i):
s_.append(a + j)
sum_list.append(s_)
return sorted(sum_list)
# 60 ms 13.7 MB
+
\ No newline at end of file diff --git a/public/2020/04/09/leetcode-the-masseuse-lcci/index.html b/public/2020/04/09/leetcode-the-masseuse-lcci/index.html new file mode 100644 index 0000000..8e0e735 --- /dev/null +++ b/public/2020/04/09/leetcode-the-masseuse-lcci/index.html @@ -0,0 +1,126 @@ + leetcode-the-masseuse-lcci · MarkDown

leetcode-the-masseuse-lcci

面试题 17.16. 按摩师

题目

+ +

一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 时刻, 为当前预约不接的情况下最长预约时间, 则为接受当前预约的最长预约时间。

+

那很显然,由于不能接受相邻两个预约,

+

不接受当前预约的话,上一个预约接不接受都可以,

+

最后只要比较两种情况即可

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def massage(self, nums) -> int:
if not nums:
return 0
n = len(nums)
not_choose = 0
choose = 0
for n in nums:
not_choose, choose = max(not_choose, choose), not_choose+n
return max(not_choose, choose)
# 52 ms 13.6 MB
+

这种问题原来有个名字叫动态规划,上面推导的方程叫状态转移方程,可以找找资料来看一下。

+
\ No newline at end of file diff --git a/public/2020/04/14/leetcode-add-two-numbers-ii/index.html b/public/2020/04/14/leetcode-add-two-numbers-ii/index.html new file mode 100644 index 0000000..af69e6e --- /dev/null +++ b/public/2020/04/14/leetcode-add-two-numbers-ii/index.html @@ -0,0 +1,125 @@ + leetcode-add-two-numbers-ii · MarkDown

leetcode-add-two-numbers-ii

445. 两数相加 II

题目

+ +

看到顺序的链表就想到用倒序链表的方法做,折腾了半天

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def _reverse(l):
if l.next:
last = _reverse(l.next)
l.next.next = l
l.next = None
return last
return l

l1e = _reverse(l1)
l2e = _reverse(l2)
new_l = ListNode(0)
head = new_l
c = 0
import ipdb; ipdb.set_trace()
while l1e and l2e:
new_val = l1e.val + l2e.val
if c==1:
new_val += 1
c = 0
if new_val >= 10:
new_val -= 10
c = 1

new_l.val = new_val
next_n = None
if l1e.next and l2e.next or c:
next_n = ListNode(c)
new_l.next = next_n
new_l = next_n
l1e = l1e.next
l2e = l2e.next
if l2e:
l1e = l2e
if not l1e and c:
l1e = ListNode(0)
while l1e:
new_l.val = l1e.val
new_l.val += c
c = 0
if new_l.val >= 10:
c = 1
new_l.val -= 10
l1e = l1e.next
if l1e:
new_l.next = ListNode(0)
new_l = new_l.next
else:
new_l.next = ListNode(1)

return _reverse(head)

# 84 ms 13.9 MB
+

最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
s1, s2 = [], []
while l1:
s1.append(l1.val)
l1 = l1.next
while l2:
s2.append(l2.val)
l2 = l2.next
ans = None
carry = 0
while s1 or s2 or carry != 0:
a = 0 if not s1 else s1.pop()
b = 0 if not s2 else s2.pop()
cur = a + b + carry
carry = cur // 10
cur %= 10
curnode = ListNode(cur)
curnode.next = ans
ans = curnode
return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+

不过就执行效率来看差不多。

+
\ No newline at end of file diff --git a/public/2020/04/14/leetcode-design-twitter/index.html b/public/2020/04/14/leetcode-design-twitter/index.html new file mode 100644 index 0000000..05857eb --- /dev/null +++ b/public/2020/04/14/leetcode-design-twitter/index.html @@ -0,0 +1,123 @@ + leetcode-design-twitter · MarkDown

leetcode-design-twitter

355. 设计推特

题目

+ +

做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 twitterId 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。

+

主要的考点应该是 多路归并 这个东西。我用的是排序,在数据量大的时候应该会有些问题。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Twitter:

def __init__(self):
"""
Initialize your data structure here.
"""
self.tweets = {}
self.followers = {}
self._tid = 0


def postTweet(self, userId: int, tweetId: int) -> None:
"""
Compose a new tweet.
"""
if not self.tweets.get(userId):
self.tweets[userId] = []
self.tweets[userId].append((self._tid, tweetId))
self._tid += 1


def getNewsFeed(self, userId: int) :
"""
Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
"""
foers = self.followers.get(userId, set())
foers = foers.union((userId,))
tweets = []
for fo in foers:
tweets.extend(self.tweets.get(fo, [])[-10:])
return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]


def follow(self, followerId: int, followeeId: int) -> None:
"""
Follower follows a followee. If the operation is invalid, it should be a no-op.
"""
if not self.followers.get(followerId):
self.followers[followerId] = set()
self.followers[followerId].add(followeeId)


def unfollow(self, followerId: int, followeeId: int) -> None:
"""
Follower unfollows a followee. If the operation is invalid, it should be a no-op.
"""
if not self.followers.get(followerId):
self.followers[followerId] = set()
if followeeId in self.followers[followerId]:
self.followers[followerId].remove(followeeId)

#100 ms 19.2 MB

# Your Twitter object will be instantiated and called as such:
# obj = Twitter()
# obj.postTweet(userId,tweetId)
# param_2 = obj.getNewsFeed(userId)
# obj.follow(followerId,followeeId)
# obj.unfollow(followerId,followeeId)
+
\ No newline at end of file diff --git a/public/2020/04/16/leetcode-01-matrix/index.html b/public/2020/04/16/leetcode-01-matrix/index.html new file mode 100644 index 0000000..232e7b8 --- /dev/null +++ b/public/2020/04/16/leetcode-01-matrix/index.html @@ -0,0 +1,128 @@ + leetcode-01-matrix · MarkDown

leetcode-01-matrix

542. 01 矩阵

题目

+ +

想了两种思路

+
    +
  1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
    m, n = len(matrix), len(matrix[0])
    dist = [[0] * n for _ in range(m)]
    zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
    # 将所有的 0 添加进初始队列中
    q = collections.deque(zeroes_pos)
    seen = set(zeroes_pos)

    # 广度优先搜索
    while q:
    i, j = q.popleft()
    for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
    if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
    dist[ni][nj] = dist[i][j] + 1
    q.append((ni, nj))
    seen.add((ni, nj))

    return dist
    +
  2. +
  3. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

    +
  4. +
+
\ No newline at end of file diff --git a/public/2020/04/16/leetcode-merge-intervals/index.html b/public/2020/04/16/leetcode-merge-intervals/index.html new file mode 100644 index 0000000..989db1e --- /dev/null +++ b/public/2020/04/16/leetcode-merge-intervals/index.html @@ -0,0 +1,122 @@ + leetcode-merge-intervals · MarkDown

leetcode-merge-intervals

56. 合并区间

题目

+ +

首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def merge(self, intervals):
if not intervals:
return []
intervals.sort()
merged = []
l = len(intervals)
m = intervals[0]
for x in range(l-1):
j = intervals[x+1]
if m[1] >= j[0]:
if m[1] <= j[1]:
m = [m[0], j[1]]
else:
continue
else:
merged.append(m)
m = j
if m:
merged.append(m)
return merged
+
\ No newline at end of file diff --git a/public/2020/04/16/leetcode-string-to-integer-atoi/index.html b/public/2020/04/16/leetcode-string-to-integer-atoi/index.html new file mode 100644 index 0000000..eb7feb3 --- /dev/null +++ b/public/2020/04/16/leetcode-string-to-integer-atoi/index.html @@ -0,0 +1,122 @@ + leetcode-string-to-integer-atoi · MarkDown

leetcode-string-to-integer-atoi

8. 字符串转换整数 (atoi)

题目

+ +

没什么好说的,注意各种情况,识别到数字之后就一直要是数字。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def myAtoi(self, str: str) -> int:
p = ''
str = str.lstrip()
n = ''
min_int = -2**31
max_int = 2**31-1
isnumeric = False
for x in str:
if not isnumeric and x == '-':
p = '-'
isnumeric = True
continue
if not isnumeric and x == '+':
isnumeric = True
continue
if x.isnumeric():
n += x
isnumeric = True
else:
break
if not n:
return 0
if int(n) > max_int:
if p:
return min_int
else:
return max_int
p += n
return int(p)
# 32 ms 13.6 MB
+
\ No newline at end of file diff --git a/public/2020/04/21/leetcode-number-of-islands/index.html b/public/2020/04/21/leetcode-number-of-islands/index.html new file mode 100644 index 0000000..38c4715 --- /dev/null +++ b/public/2020/04/21/leetcode-number-of-islands/index.html @@ -0,0 +1,122 @@ + leetcode-number-of-islands · MarkDown

leetcode-number-of-islands

200. 岛屿数量

题目

+ +

这种矩阵题现在第一反应就是用广度优先搜索做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import collections
class Solution:
def numIslands(self, grid) -> int:
rows = len(grid)
if not rows:
return 0
cols = len(grid[0])
islands = 0
for r in range(rows):
for l in range(cols):
if grid[r][l] == '1':
islands += 1
grid[r][l] = '0'
neighbors = collections.deque([(r, l)])
while neighbors:
x, y = neighbors.popleft()
for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:
if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':
neighbors.append([x_, y_])
grid[x_][y_] = '0'
return islands
+
\ No newline at end of file diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..bc9fd8c --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +blog.tunpok.com diff --git a/public/archives/2016/02/index.html b/public/archives/2016/02/index.html new file mode 100644 index 0000000..f5a7462 --- /dev/null +++ b/public/archives/2016/02/index.html @@ -0,0 +1,158 @@ + MarkDown
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/archives/2016/04/index.html b/public/archives/2016/04/index.html new file mode 100644 index 0000000..e777061 --- /dev/null +++ b/public/archives/2016/04/index.html @@ -0,0 +1,132 @@ + MarkDown
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
\ No newline at end of file diff --git a/public/archives/2016/05/index.html b/public/archives/2016/05/index.html new file mode 100644 index 0000000..a467293 --- /dev/null +++ b/public/archives/2016/05/index.html @@ -0,0 +1,168 @@ + MarkDown
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
\ No newline at end of file diff --git a/public/archives/2016/index.html b/public/archives/2016/index.html new file mode 100644 index 0000000..9176c86 --- /dev/null +++ b/public/archives/2016/index.html @@ -0,0 +1,222 @@ + MarkDown
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/archives/2018/05/index.html b/public/archives/2018/05/index.html new file mode 100644 index 0000000..556b39a --- /dev/null +++ b/public/archives/2018/05/index.html @@ -0,0 +1,130 @@ + MarkDown
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
\ No newline at end of file diff --git a/public/archives/2018/index.html b/public/archives/2018/index.html new file mode 100644 index 0000000..556b39a --- /dev/null +++ b/public/archives/2018/index.html @@ -0,0 +1,130 @@ + MarkDown
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
\ No newline at end of file diff --git a/public/archives/2019/03/index.html b/public/archives/2019/03/index.html new file mode 100644 index 0000000..f8211f2 --- /dev/null +++ b/public/archives/2019/03/index.html @@ -0,0 +1,146 @@ + MarkDown
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
\ No newline at end of file diff --git a/public/archives/2019/11/index.html b/public/archives/2019/11/index.html new file mode 100644 index 0000000..3bd95e0 --- /dev/null +++ b/public/archives/2019/11/index.html @@ -0,0 +1,121 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
\ No newline at end of file diff --git a/public/archives/2019/index.html b/public/archives/2019/index.html new file mode 100644 index 0000000..d04f525 --- /dev/null +++ b/public/archives/2019/index.html @@ -0,0 +1,149 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
\ No newline at end of file diff --git a/public/archives/2020/03/index.html b/public/archives/2020/03/index.html new file mode 100644 index 0000000..dbc6343 --- /dev/null +++ b/public/archives/2020/03/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/03/page/2/index.html b/public/archives/2020/03/page/2/index.html new file mode 100644 index 0000000..50cad29 --- /dev/null +++ b/public/archives/2020/03/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/04/index.html b/public/archives/2020/04/index.html new file mode 100644 index 0000000..96dba0a --- /dev/null +++ b/public/archives/2020/04/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/04/page/2/index.html b/public/archives/2020/04/page/2/index.html new file mode 100644 index 0000000..0c96e94 --- /dev/null +++ b/public/archives/2020/04/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/index.html b/public/archives/2020/index.html new file mode 100644 index 0000000..caf4158 --- /dev/null +++ b/public/archives/2020/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/page/2/index.html b/public/archives/2020/page/2/index.html new file mode 100644 index 0000000..a1382a9 --- /dev/null +++ b/public/archives/2020/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/page/3/index.html b/public/archives/2020/page/3/index.html new file mode 100644 index 0000000..0359242 --- /dev/null +++ b/public/archives/2020/page/3/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/index.html b/public/archives/index.html new file mode 100644 index 0000000..5f799b2 --- /dev/null +++ b/public/archives/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/page/2/index.html b/public/archives/page/2/index.html new file mode 100644 index 0000000..203d934 --- /dev/null +++ b/public/archives/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/page/3/index.html b/public/archives/page/3/index.html new file mode 100644 index 0000000..d63c43d --- /dev/null +++ b/public/archives/page/3/index.html @@ -0,0 +1,236 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
\ No newline at end of file diff --git a/public/archives/page/4/index.html b/public/archives/page/4/index.html new file mode 100644 index 0000000..815557f --- /dev/null +++ b/public/archives/page/4/index.html @@ -0,0 +1,147 @@ + MarkDown
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/atom.xml b/public/atom.xml new file mode 100644 index 0000000..fc20171 --- /dev/null +++ b/public/atom.xml @@ -0,0 +1,521 @@ + + + MarkDown + 「靡不有初,鲜克有终」 + + + + 2020-04-21T04:55:46.000Z + http://blog.tunpok.com/ + + + Ching + + + + Hexo + + + leetcode-number-of-islands + + http://blog.tunpok.com/2020/04/21/leetcode-number-of-islands/ + 2020-04-21T04:55:17.000Z + 2020-04-21T04:55:46.000Z + + <h3 id="200-__u5C9B_u5C7F_u6570_u91CF"><a href="#200-__u5C9B_u5C7F_u6570_u91CF" class="headerlink" title="200. 岛屿数量"></a>200. 岛屿数量</h3><p><a href="https://leetcode-cn.com/problems/number-of-islands/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>这种矩阵题现在第一反应就是用<a href="(https://zh.wikipedia.org/zh-cn/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)">广度优先搜索</a>做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> collections</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">numIslands</span><span class="params">(self, grid)</span> -&gt; int:</span></span><br><span class="line"> rows = len(grid)</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> rows:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> cols = len(grid[<span class="number">0</span>])</span><br><span class="line"> islands = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> r <span class="keyword">in</span> range(rows):</span><br><span class="line"> <span class="keyword">for</span> l <span class="keyword">in</span> range(cols):</span><br><span class="line"> <span class="keyword">if</span> grid[r][l] == <span class="string">'1'</span>:</span><br><span class="line"> islands += <span class="number">1</span></span><br><span class="line"> grid[r][l] = <span class="string">'0'</span></span><br><span class="line"> neighbors = collections.deque([(r, l)])</span><br><span class="line"> <span class="keyword">while</span> neighbors:</span><br><span class="line"> x, y = neighbors.popleft()</span><br><span class="line"> <span class="keyword">for</span> x_, y_ <span class="keyword">in</span> [[x<span class="number">-1</span>, y], [x+<span class="number">1</span>, y], [x, y<span class="number">-1</span>], [x, y+<span class="number">1</span>]]:</span><br><span class="line"> <span class="keyword">if</span> <span class="number">0</span>&lt;=x_&lt;rows <span class="keyword">and</span> <span class="number">0</span>&lt;=y_&lt;cols <span class="keyword">and</span> grid[x_][y_] == <span class="string">'1'</span>:</span><br><span class="line"> neighbors.append([x_, y_])</span><br><span class="line"> grid[x_][y_] = <span class="string">'0'</span></span><br><span class="line"> <span class="keyword">return</span> islands</span><br></pre></td></tr></table></figure> + + + + + <h3 id="200-__u5C9B_u5C7F_u6570_u91CF"><a href="#200-__u5C9B_u5C7F_u6570_u91CF" class="headerlink" title="200. 岛屿数量"></a>200. 岛屿数量</h3><p><a href="https://leetcode-cn.com/problems/number-of-islands/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-string-to-integer-atoi + + http://blog.tunpok.com/2020/04/16/leetcode-string-to-integer-atoi/ + 2020-04-16T11:50:10.000Z + 2020-04-16T11:56:40.000Z + + <h3 id="8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29"><a href="#8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29" class="headerlink" title="8. 字符串转换整数 (atoi)"></a>8. 字符串转换整数 (atoi)</h3><p><a href="https://leetcode-cn.com/problems/string-to-integer-atoi/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>没什么好说的,注意各种情况,识别到数字之后就一直要是数字。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">myAtoi</span><span class="params">(self, str: str)</span> -&gt; int:</span></span><br><span class="line"> p = <span class="string">''</span></span><br><span class="line"> str = str.lstrip()</span><br><span class="line"> n = <span class="string">''</span></span><br><span class="line"> min_int = <span class="number">-2</span>**<span class="number">31</span></span><br><span class="line"> max_int = <span class="number">2</span>**<span class="number">31</span><span class="number">-1</span></span><br><span class="line"> isnumeric = <span class="keyword">False</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> str:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> isnumeric <span class="keyword">and</span> x == <span class="string">'-'</span>:</span><br><span class="line"> p = <span class="string">'-'</span></span><br><span class="line"> isnumeric = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> isnumeric <span class="keyword">and</span> x == <span class="string">'+'</span>:</span><br><span class="line"> isnumeric = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">if</span> x.isnumeric():</span><br><span class="line"> n += x</span><br><span class="line"> isnumeric = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> n:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> int(n) &gt; max_int:</span><br><span class="line"> <span class="keyword">if</span> p:</span><br><span class="line"> <span class="keyword">return</span> min_int</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> max_int</span><br><span class="line"> p += n</span><br><span class="line"> <span class="keyword">return</span> int(p)</span><br><span class="line"><span class="comment"># 32 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29"><a href="#8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29" class="headerlink" title="8. 字符串转换整数 (atoi)"></a>8. 字符串转换整数 (atoi)</h3><p><a href="https://leetcode-cn.com/problems/string-to-integer-atoi/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-merge-intervals + + http://blog.tunpok.com/2020/04/16/leetcode-merge-intervals/ + 2020-04-16T11:22:26.000Z + 2020-04-16T11:22:48.000Z + + <h3 id="56-__u5408_u5E76_u533A_u95F4"><a href="#56-__u5408_u5E76_u533A_u95F4" class="headerlink" title="56. 合并区间"></a>56. 合并区间</h3><p><a href="https://leetcode-cn.com/problems/merge-intervals/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">merge</span><span class="params">(self, intervals)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> intervals:</span><br><span class="line"> <span class="keyword">return</span> []</span><br><span class="line"> intervals.sort()</span><br><span class="line"> merged = []</span><br><span class="line"> l = len(intervals)</span><br><span class="line"> m = intervals[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(l<span class="number">-1</span>):</span><br><span class="line"> j = intervals[x+<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">if</span> m[<span class="number">1</span>] &gt;= j[<span class="number">0</span>]:</span><br><span class="line"> <span class="keyword">if</span> m[<span class="number">1</span>] &lt;= j[<span class="number">1</span>]:</span><br><span class="line"> m = [m[<span class="number">0</span>], j[<span class="number">1</span>]]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> merged.append(m)</span><br><span class="line"> m = j</span><br><span class="line"> <span class="keyword">if</span> m:</span><br><span class="line"> merged.append(m)</span><br><span class="line"> <span class="keyword">return</span> merged</span><br></pre></td></tr></table></figure> + + + + + <h3 id="56-__u5408_u5E76_u533A_u95F4"><a href="#56-__u5408_u5E76_u533A_u95F4" class="headerlink" title="56. 合并区间"></a>56. 合并区间</h3><p><a href="https://leetcode-cn.com/problems/merge-intervals/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-01-matrix + + http://blog.tunpok.com/2020/04/16/leetcode-01-matrix/ + 2020-04-16T04:26:34.000Z + 2020-04-16T04:26:56.000Z + + <h3 id="542-_01__u77E9_u9635"><a href="#542-_01__u77E9_u9635" class="headerlink" title="542. 01 矩阵"></a>542. 01 矩阵</h3><p><a href="https://leetcode-cn.com/problems/01-matrix/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>想了两种思路</p> +<ol> +<li><p>0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">updateMatrix</span><span class="params">(self, matrix: List[List[int]])</span> -&gt; List[List[int]]:</span></span><br><span class="line"> m, n = len(matrix), len(matrix[<span class="number">0</span>])</span><br><span class="line"> dist = [[<span class="number">0</span>] * n <span class="keyword">for</span> _ <span class="keyword">in</span> range(m)]</span><br><span class="line"> zeroes_pos = [(i, j) <span class="keyword">for</span> i <span class="keyword">in</span> range(m) <span class="keyword">for</span> j <span class="keyword">in</span> range(n) <span class="keyword">if</span> matrix[i][j] == <span class="number">0</span>]</span><br><span class="line"> <span class="comment"># 将所有的 0 添加进初始队列中</span></span><br><span class="line"> q = collections.deque(zeroes_pos)</span><br><span class="line"> seen = set(zeroes_pos)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 广度优先搜索</span></span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> i, j = q.popleft()</span><br><span class="line"> <span class="keyword">for</span> ni, nj <span class="keyword">in</span> [(i - <span class="number">1</span>, j), (i + <span class="number">1</span>, j), (i, j - <span class="number">1</span>), (i, j + <span class="number">1</span>)]:</span><br><span class="line"> <span class="keyword">if</span> <span class="number">0</span> &lt;= ni &lt; m <span class="keyword">and</span> <span class="number">0</span> &lt;= nj &lt; n <span class="keyword">and</span> (ni, nj) <span class="keyword">not</span> <span class="keyword">in</span> seen:</span><br><span class="line"> dist[ni][nj] = dist[i][j] + <span class="number">1</span></span><br><span class="line"> q.append((ni, nj))</span><br><span class="line"> seen.add((ni, nj))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> dist</span><br></pre></td></tr></table></figure> +</li> +<li><p>从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。</p> +</li> +</ol> + + + + + <h3 id="542-_01__u77E9_u9635"><a href="#542-_01__u77E9_u9635" class="headerlink" title="542. 01 矩阵"></a>542. 01 矩阵</h3><p><a href="https://leetcode-cn.com/problems/01-matrix/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-add-two-numbers-ii + + http://blog.tunpok.com/2020/04/14/leetcode-add-two-numbers-ii/ + 2020-04-14T15:22:39.000Z + 2020-04-14T15:28:35.000Z + + <h3 id="445-__u4E24_u6570_u76F8_u52A0_II"><a href="#445-__u4E24_u6570_u76F8_u52A0_II" class="headerlink" title="445. 两数相加 II"></a>445. 两数相加 II</h3><p><a href="https://leetcode-cn.com/problems/add-two-numbers-ii/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>看到顺序的链表就想到用倒序链表的方法做,折腾了半天</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ListNode</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x)</span>:</span></span><br><span class="line"> self.val = x</span><br><span class="line"> self.next = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">addTwoNumbers</span><span class="params">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_reverse</span><span class="params">(l)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> l.next:</span><br><span class="line"> last = _reverse(l.next)</span><br><span class="line"> l.next.next = l</span><br><span class="line"> l.next = <span class="keyword">None</span></span><br><span class="line"> <span class="keyword">return</span> last</span><br><span class="line"> <span class="keyword">return</span> l</span><br><span class="line"></span><br><span class="line"> l1e = _reverse(l1)</span><br><span class="line"> l2e = _reverse(l2)</span><br><span class="line"> new_l = ListNode(<span class="number">0</span>)</span><br><span class="line"> head = new_l</span><br><span class="line"> c = <span class="number">0</span></span><br><span class="line"> <span class="keyword">import</span> ipdb; ipdb.set_trace()</span><br><span class="line"> <span class="keyword">while</span> l1e <span class="keyword">and</span> l2e:</span><br><span class="line"> new_val = l1e.val + l2e.val</span><br><span class="line"> <span class="keyword">if</span> c==<span class="number">1</span>:</span><br><span class="line"> new_val += <span class="number">1</span></span><br><span class="line"> c = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> new_val &gt;= <span class="number">10</span>:</span><br><span class="line"> new_val -= <span class="number">10</span></span><br><span class="line"> c = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> new_l.val = new_val</span><br><span class="line"> next_n = <span class="keyword">None</span></span><br><span class="line"> <span class="keyword">if</span> l1e.next <span class="keyword">and</span> l2e.next <span class="keyword">or</span> c:</span><br><span class="line"> next_n = ListNode(c)</span><br><span class="line"> new_l.next = next_n</span><br><span class="line"> new_l = next_n</span><br><span class="line"> l1e = l1e.next</span><br><span class="line"> l2e = l2e.next</span><br><span class="line"> <span class="keyword">if</span> l2e:</span><br><span class="line"> l1e = l2e</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> l1e <span class="keyword">and</span> c:</span><br><span class="line"> l1e = ListNode(<span class="number">0</span>)</span><br><span class="line"> <span class="keyword">while</span> l1e:</span><br><span class="line"> new_l.val = l1e.val</span><br><span class="line"> new_l.val += c</span><br><span class="line"> c = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> new_l.val &gt;= <span class="number">10</span>:</span><br><span class="line"> c = <span class="number">1</span></span><br><span class="line"> new_l.val -= <span class="number">10</span></span><br><span class="line"> l1e = l1e.next</span><br><span class="line"> <span class="keyword">if</span> l1e:</span><br><span class="line"> new_l.next = ListNode(<span class="number">0</span>)</span><br><span class="line"> new_l = new_l.next</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> new_l.next = ListNode(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> _reverse(head)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 84 ms 13.9 MB</span></span><br></pre></td></tr></table></figure> +<p>最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">addTwoNumbers</span><span class="params">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> s1, s2 = [], []</span><br><span class="line"> <span class="keyword">while</span> l1:</span><br><span class="line"> s1.append(l1.val)</span><br><span class="line"> l1 = l1.next</span><br><span class="line"> <span class="keyword">while</span> l2:</span><br><span class="line"> s2.append(l2.val)</span><br><span class="line"> l2 = l2.next</span><br><span class="line"> ans = <span class="keyword">None</span></span><br><span class="line"> carry = <span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span> s1 <span class="keyword">or</span> s2 <span class="keyword">or</span> carry != <span class="number">0</span>:</span><br><span class="line"> a = <span class="number">0</span> <span class="keyword">if</span> <span class="keyword">not</span> s1 <span class="keyword">else</span> s1.pop()</span><br><span class="line"> b = <span class="number">0</span> <span class="keyword">if</span> <span class="keyword">not</span> s2 <span class="keyword">else</span> s2.pop()</span><br><span class="line"> cur = a + b + carry</span><br><span class="line"> carry = cur // <span class="number">10</span></span><br><span class="line"> cur %= <span class="number">10</span></span><br><span class="line"> curnode = ListNode(cur)</span><br><span class="line"> curnode.next = ans</span><br><span class="line"> ans = curnode</span><br><span class="line"> <span class="keyword">return</span> ans</span><br><span class="line"></span><br><span class="line">作者:LeetCode-Solution</span><br><span class="line">链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/</span><br><span class="line">来源:力扣(LeetCode)</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure> +<p>不过就执行效率来看差不多。</p> + + + + + <h3 id="445-__u4E24_u6570_u76F8_u52A0_II"><a href="#445-__u4E24_u6570_u76F8_u52A0_II" class="headerlink" title="445. 两数相加 II"></a>445. 两数相加 II</h3><p><a href="https://leetcode-cn.com/problems/add-two-numbers-ii/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-design-twitter + + http://blog.tunpok.com/2020/04/14/leetcode-design-twitter/ + 2020-04-14T08:11:41.000Z + 2020-04-14T15:29:34.000Z + + <h3 id="355-__u8BBE_u8BA1_u63A8_u7279"><a href="#355-__u8BBE_u8BA1_u63A8_u7279" class="headerlink" title="355. 设计推特"></a>355. 设计推特</h3><p><a href="https://leetcode-cn.com/problems/design-twitter/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 <code>twitterId</code> 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。</p> +<p>主要的考点应该是 <code>多路归并</code> 这个东西。我用的是排序,在数据量大的时候应该会有些问题。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Twitter</span>:</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Initialize your data structure here.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.tweets = &#123;&#125;</span><br><span class="line"> self.followers = &#123;&#125;</span><br><span class="line"> self._tid = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">postTweet</span><span class="params">(self, userId: int, tweetId: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Compose a new tweet.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.tweets.get(userId):</span><br><span class="line"> self.tweets[userId] = []</span><br><span class="line"> self.tweets[userId].append((self._tid, tweetId))</span><br><span class="line"> self._tid += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">getNewsFeed</span><span class="params">(self, userId: int)</span> :</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> foers = self.followers.get(userId, set())</span><br><span class="line"> foers = foers.union((userId,))</span><br><span class="line"> tweets = []</span><br><span class="line"> <span class="keyword">for</span> fo <span class="keyword">in</span> foers:</span><br><span class="line"> tweets.extend(self.tweets.get(fo, [])[<span class="number">-10</span>:])</span><br><span class="line"> <span class="keyword">return</span> [tw[<span class="number">1</span>] <span class="keyword">for</span> tw <span class="keyword">in</span> sorted(tweets, reverse=<span class="keyword">True</span>)[:<span class="number">10</span>]]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">follow</span><span class="params">(self, followerId: int, followeeId: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Follower follows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.followers.get(followerId):</span><br><span class="line"> self.followers[followerId] = set()</span><br><span class="line"> self.followers[followerId].add(followeeId)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">unfollow</span><span class="params">(self, followerId: int, followeeId: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Follower unfollows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.followers.get(followerId):</span><br><span class="line"> self.followers[followerId] = set()</span><br><span class="line"> <span class="keyword">if</span> followeeId <span class="keyword">in</span> self.followers[followerId]:</span><br><span class="line"> self.followers[followerId].remove(followeeId)</span><br><span class="line"></span><br><span class="line"><span class="comment">#100 ms 19.2 MB</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Your Twitter object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment"># obj = Twitter()</span></span><br><span class="line"><span class="comment"># obj.postTweet(userId,tweetId)</span></span><br><span class="line"><span class="comment"># param_2 = obj.getNewsFeed(userId)</span></span><br><span class="line"><span class="comment"># obj.follow(followerId,followeeId)</span></span><br><span class="line"><span class="comment"># obj.unfollow(followerId,followeeId)</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="355-__u8BBE_u8BA1_u63A8_u7279"><a href="#355-__u8BBE_u8BA1_u63A8_u7279" class="headerlink" title="355. 设计推特"></a>355. 设计推特</h3><p><a href="https://leetcode-cn.com/problems/design-twitter/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof + + http://blog.tunpok.com/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/ + 2020-04-09T14:14:56.000Z + 2020-04-14T15:29:40.000Z + + <h3 id="u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217"><a href="#u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217" class="headerlink" title="面试题57 - II. 和为s的连续正数序列"></a>面试题57 - II. 和为s的连续正数序列</h3><p><a href="https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>又是小学奥数。由等差数列求和公式<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -1.625ex" xmlns="http://www.w3.org/2000/svg" width="20.379ex" height="4.656ex" role="img" focusable="false" viewbox="0 -1340 9007.3 2058.1" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mfrac"><g data-mml-node="mrow" transform="translate(220, 590) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mo"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mo" transform="translate(389, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">首</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(2466.8, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mo" transform="translate(3522.6, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">末</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(5322.6, 0)"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mo" transform="translate(5711.6, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mo" transform="translate(6767.3, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">数</text></g></g></g></g><g data-mml-node="mrow" transform="translate(4253.7, -506) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mn"><use xlink:href="#MJX-TEX-N-32"/></g></g></g></g><rect width="8767.3" height="60" x="120" y="220"/></g></g></g></svg></mjx-container> 可知,当首项为 1 的时候项数最多,又由于是连续正整数,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="27.37ex" height="2.452ex" role="img" focusable="false" viewbox="0 -833.9 12097.6 1083.9" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mn" transform="translate(600, 363) scale(0.707)"><use xlink:href="#MJX-TEX-N-32"/></g></g><g data-mml-node="mo" transform="translate(1281.3, 0)"><use xlink:href="#MJX-TEX-N-3C"/></g><g data-mml-node="mo" transform="translate(2337.1, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mn" transform="translate(2726.1, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(3448.3, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mi" transform="translate(4448.6, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mo" transform="translate(5048.6, 0)"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mo" transform="translate(5659.8, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mi" transform="translate(6660, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mo" transform="translate(7537.8, 0)"><use xlink:href="#MJX-TEX-N-3C"/></g><g data-mml-node="mo" transform="translate(8593.6, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mi" transform="translate(8982.6, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mo" transform="translate(9804.8, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mn" transform="translate(10805, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="msup" transform="translate(11305, 0)"><g data-mml-node="mo"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mn" transform="translate(389, 363) scale(0.707)"><use xlink:href="#MJX-TEX-N-32"/></g></g></g></g></svg></mjx-container>,那最大的 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex" xmlns="http://www.w3.org/2000/svg" width="1.357ex" height="1.025ex" role="img" focusable="false" viewbox="0 -442 600 453" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6E"/></g></g></g></svg></mjx-container> 就不大于 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.683ex" xmlns="http://www.w3.org/2000/svg" width="16.086ex" height="2.851ex" role="img" focusable="false" viewbox="0 -958 7109.9 1260" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msqrt"><g transform="translate(1020, 0)"><g data-mml-node="mn"><use xlink:href="#MJX-TEX-N-32"/></g><g data-mml-node="mo" transform="translate(722.2, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mi" transform="translate(1722.4, 0)"><use xlink:href="#MJX-TEX-I-74"/></g><g data-mml-node="mi" transform="translate(2083.4, 0)"><use xlink:href="#MJX-TEX-I-61"/></g><g data-mml-node="mi" transform="translate(2612.4, 0)"><use xlink:href="#MJX-TEX-I-72"/></g><g data-mml-node="mi" transform="translate(3063.4, 0)"><use xlink:href="#MJX-TEX-I-67"/></g><g data-mml-node="mi" transform="translate(3540.4, 0)"><use xlink:href="#MJX-TEX-I-65"/></g><g data-mml-node="mi" transform="translate(4006.4, 0)"><use xlink:href="#MJX-TEX-I-74"/></g></g><g data-mml-node="mo" transform="translate(0, 48)"><use xlink:href="#MJX-TEX-SO-221A"/></g><rect width="4367.4" height="60" x="1020" y="838"/></g><g data-mml-node="mo" transform="translate(5609.7, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mn" transform="translate(6609.9, 0)"><use xlink:href="#MJX-TEX-N-31"/></g></g></g></svg></mjx-container>。</p> +<p>由小到大遍历 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex" xmlns="http://www.w3.org/2000/svg" width="1.357ex" height="1.025ex" role="img" focusable="false" viewbox="0 -442 600 453" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6E"/></g></g></g></svg></mjx-container>,可以求得首项。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">findContinuousSequence</span><span class="params">(self, target: int)</span>:</span></span><br><span class="line"> n = int(math.sqrt(<span class="number">2</span> * target) + <span class="number">1</span>)</span><br><span class="line"> <span class="keyword">if</span> n &lt; <span class="number">2</span>:</span><br><span class="line"> <span class="keyword">return</span> []</span><br><span class="line"> sum_list = []</span><br><span class="line"> a = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">2</span>, n+<span class="number">1</span>):</span><br><span class="line"> a = ((<span class="number">2</span> * target) / i + <span class="number">1</span> - i) / <span class="number">2</span></span><br><span class="line"> <span class="keyword">if</span> a <span class="keyword">and</span> <span class="keyword">not</span> a % <span class="number">1</span>:</span><br><span class="line"> a = int(a)</span><br><span class="line"> s_ = []</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> range(<span class="number">0</span>, i):</span><br><span class="line"> s_.append(a + j)</span><br><span class="line"> sum_list.append(s_)</span><br><span class="line"> <span class="keyword">return</span> sorted(sum_list)</span><br><span class="line"> <span class="comment"># 60 ms 13.7 MB</span></span><br></pre></td></tr></table></figure> +<svg style="display: none" id="MJX-SVG-global-cache"><defs><path id="MJX-TEX-N-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"/><path id="MJX-TEX-N-2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"/><path id="MJX-TEX-N-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"/><path id="MJX-TEX-N-D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"/><path id="MJX-TEX-N-32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"/><path id="MJX-TEX-I-6E" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-N-3C" d="M694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19Z"/><path id="MJX-TEX-N-31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"/><path id="MJX-TEX-SO-221A" d="M263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249Z"/><path id="MJX-TEX-I-74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"/><path id="MJX-TEX-I-61" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"/><path id="MJX-TEX-I-72" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"/><path id="MJX-TEX-I-65" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"/></defs></svg> + + + + <h3 id="u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217"><a href="#u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217" class="headerlink" title="面试题57 - II. 和为s的连续正数序列"></a>面试题57 - II. 和为s的连续正数序列</h3><p><a href="https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-the-masseuse-lcci + + http://blog.tunpok.com/2020/04/09/leetcode-the-masseuse-lcci/ + 2020-04-08T16:35:26.000Z + 2020-04-08T17:14:04.000Z + + <h3 id="u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08"><a href="#u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08" class="headerlink" title="面试题 17.16. 按摩师"></a>面试题 17.16. 按摩师</h3><p><a href="https://leetcode-cn.com/problems/the-masseuse-lcci/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex" xmlns="http://www.w3.org/2000/svg" width="0.781ex" height="1.52ex" role="img" focusable="false" viewbox="0 -661 345 672" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-69"/></g></g></g></svg></mjx-container> 时刻,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="6.742ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 2980 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g></g></g></svg></mjx-container> 为当前预约不接的情况下最长预约时间,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="6.742ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 2980 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g></g></g></svg></mjx-container> 则为接受当前预约的最长预约时间。</p> +<p>那很显然,由于不能接受相邻两个预约,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="29.528ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 13051.4 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(3257.8, 0)"><use xlink:href="#MJX-TEX-N-3D"/></g><g data-mml-node="mi" transform="translate(4313.6, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(4833.6, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(5336.6, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(5614.6, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(6181.8, 0)"><use xlink:href="#MJX-TEX-N-2212"/></g><g data-mml-node="mn" transform="translate(7182, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(7682, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(7960, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(8238, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(8738, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(9238.2, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mi" transform="translate(10238.4, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mi" transform="translate(10838.4, 0)"><use xlink:href="#MJX-TEX-I-75"/></g><g data-mml-node="mi" transform="translate(11410.4, 0)"><use xlink:href="#MJX-TEX-I-6D"/></g><g data-mml-node="msub" transform="translate(12288.4, 0)"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-73"/></g><g data-mml-node="mi" transform="translate(469, -150) scale(0.707)"><use xlink:href="#MJX-TEX-I-69"/></g></g></g></g></svg></mjx-container></p> +<p>不接受当前预约的话,上一个预约接不接受都可以,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="38.281ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 16920.1 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(3257.8, 0)"><use xlink:href="#MJX-TEX-N-3D"/></g><g data-mml-node="mi" transform="translate(4313.6, 0)"><use xlink:href="#MJX-TEX-I-6D"/></g><g data-mml-node="mi" transform="translate(5191.6, 0)"><use xlink:href="#MJX-TEX-I-61"/></g><g data-mml-node="mi" transform="translate(5720.6, 0)"><use xlink:href="#MJX-TEX-I-78"/></g><g data-mml-node="mo" transform="translate(6292.6, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mi" transform="translate(6681.6, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(7201.6, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(7704.6, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(7982.6, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(8549.8, 0)"><use xlink:href="#MJX-TEX-N-2212"/></g><g data-mml-node="mn" transform="translate(9550, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(10050, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(10328, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(10606, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(11106, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(11384, 0)"><use xlink:href="#MJX-TEX-N-2C"/></g><g data-mml-node="mi" transform="translate(11828.7, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(12348.7, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(12851.7, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(13129.7, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(13696.9, 0)"><use xlink:href="#MJX-TEX-N-2212"/></g><g data-mml-node="mn" transform="translate(14697.1, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(15197.1, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(15475.1, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(15753.1, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(16253.1, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(16531.1, 0)"><use xlink:href="#MJX-TEX-N-29"/></g></g></g></svg></mjx-container></p> +<p>最后只要比较两种情况即可 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="20.728ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 9161.7 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6D"/></g><g data-mml-node="mi" transform="translate(878, 0)"><use xlink:href="#MJX-TEX-I-61"/></g><g data-mml-node="mi" transform="translate(1407, 0)"><use xlink:href="#MJX-TEX-I-78"/></g><g data-mml-node="mo" transform="translate(1979, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mi" transform="translate(2368, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(2888, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(3391, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(3669, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(4014, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(4292, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(4570, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(5070, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(5348, 0)"><use xlink:href="#MJX-TEX-N-2C"/></g><g data-mml-node="mi" transform="translate(5792.7, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(6312.7, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(6815.7, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(7093.7, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(7438.7, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(7716.7, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(7994.7, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(8494.7, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(8772.7, 0)"><use xlink:href="#MJX-TEX-N-29"/></g></g></g></svg></mjx-container></p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">massage</span><span class="params">(self, nums)</span> -&gt; int:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> nums:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> n = len(nums)</span><br><span class="line"> not_choose = <span class="number">0</span></span><br><span class="line"> choose = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> n <span class="keyword">in</span> nums:</span><br><span class="line"> not_choose, choose = max(not_choose, choose), not_choose+n</span><br><span class="line"> <span class="keyword">return</span> max(not_choose, choose)</span><br><span class="line"> <span class="comment"># 52 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> +<p>这种问题原来有个名字叫<a href="https://zh.wikipedia.org/wiki/动态规划" target="_blank" rel="noopener">动态规划</a>,上面推导的方程叫<a href="https://baike.baidu.com/item/状态转移方程" target="_blank" rel="noopener">状态转移方程</a>,可以找找资料来看一下。</p> +<svg style="display: none" id="MJX-SVG-global-cache"><defs><path id="MJX-TEX-I-69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"/><path id="MJX-TEX-I-70" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"/><path id="MJX-TEX-N-5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"/><path id="MJX-TEX-N-5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"/><path id="MJX-TEX-N-30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"/><path id="MJX-TEX-N-31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"/><path id="MJX-TEX-N-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"/><path id="MJX-TEX-N-2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"/><path id="MJX-TEX-N-2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"/><path id="MJX-TEX-I-6E" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-75" d="M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-6D" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-73" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"/><path id="MJX-TEX-I-61" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"/><path id="MJX-TEX-I-78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"/><path id="MJX-TEX-N-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"/><path id="MJX-TEX-N-2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"/><path id="MJX-TEX-N-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"/></defs></svg> + + + + <h3 id="u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08"><a href="#u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08" class="headerlink" title="面试题 17.16. 按摩师"></a>面试题 17.16. 按摩师</h3><p><a href="https://leetcode-cn.com/problems/the-masseuse-lcci/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-compress-string-lcci + + http://blog.tunpok.com/2020/04/01/leetcode-compress-string-lcci/ + 2020-04-01T07:51:22.000Z + 2020-04-01T07:57:26.000Z + + <h3 id="u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29"><a href="#u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29" class="headerlink" title="面试题 01.06. 字符串压缩"></a>面试题 01.06. 字符串压缩</h3><p><a href="https://leetcode-cn.com/problems/compress-string-lcci/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">compressString</span><span class="params">(self, S: str)</span> -&gt; str:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> S:</span><br><span class="line"> <span class="keyword">return</span> S</span><br><span class="line"> c = <span class="string">''</span></span><br><span class="line"> prev = S[<span class="number">0</span>]</span><br><span class="line"> p_len = <span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> w <span class="keyword">in</span> S[<span class="number">1</span>:]:</span><br><span class="line"> <span class="keyword">if</span> w != prev:</span><br><span class="line"> c += <span class="string">'%s%s'</span> % (prev, p_len)</span><br><span class="line"> prev = w</span><br><span class="line"> p_len = <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> p_len += <span class="number">1</span></span><br><span class="line"> c += <span class="string">'%s%s'</span> % (prev, p_len)</span><br><span class="line"> <span class="keyword">if</span> len(S) &gt; len(c):</span><br><span class="line"> <span class="keyword">return</span> c</span><br><span class="line"> <span class="keyword">return</span> S</span><br><span class="line"><span class="comment"># 52 ms 13.8 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29"><a href="#u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29" class="headerlink" title="面试题 01.06. 字符串压缩"></a>面试题 01.06. 字符串压缩</h3><p><a href="https://leetcode-cn.com/problems/compress-string-lcci/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1103 + + http://blog.tunpok.com/2020/04/01/leetcode-1103/ + 2020-04-01T03:22:20.000Z + 2020-04-08T17:17:27.000Z + + <h3 id="1103-__u5206_u7CD6_u679C_II"><a href="#1103-__u5206_u7CD6_u679C_II" class="headerlink" title="1103. 分糖果 II"></a>1103. 分糖果 II</h3><p><a href="https://leetcode-cn.com/problems/distribute-candies-to-people/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>小学奥数题。主要思路就是等差数列求和 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -1.625ex" xmlns="http://www.w3.org/2000/svg" width="20.379ex" height="4.656ex" role="img" focusable="false" viewbox="0 -1340 9007.3 2058.1" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mfrac"><g data-mml-node="mrow" transform="translate(220, 590) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mo"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mo" transform="translate(389, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">首</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(2466.8, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mo" transform="translate(3522.6, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">末</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(5322.6, 0)"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mo" transform="translate(5711.6, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mo" transform="translate(6767.3, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">数</text></g></g></g></g><g data-mml-node="mrow" transform="translate(4253.7, -506) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mn"><use xlink:href="#MJX-TEX-N-32"/></g></g></g></g><rect width="8767.3" height="60" x="120" y="220"/></g></g></g></svg></mjx-container> 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">distributeCandies</span><span class="params">(self, candies: int, num_people: int)</span>:</span></span><br><span class="line"> total = <span class="number">0</span></span><br><span class="line"> i = <span class="number">0</span></span><br><span class="line"> <span class="comment"># import ipdb; ipdb.set_trace()</span></span><br><span class="line"> <span class="keyword">while</span> total &lt;= candies:</span><br><span class="line"> t = (num_people*i)*num_people + int((<span class="number">1</span>+num_people)*num_people/<span class="number">2</span>)</span><br><span class="line"> <span class="keyword">if</span> total + t &lt;= candies:</span><br><span class="line"> total += t</span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> remaining = candies - total</span><br><span class="line"> print(total, remaining, i)</span><br><span class="line"> l = []</span><br><span class="line"> <span class="keyword">for</span> n <span class="keyword">in</span> range(<span class="number">1</span>, num_people+<span class="number">1</span>):</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> total:</span><br><span class="line"> current_candy = n</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> current_candy = n+i*num_people</span><br><span class="line"></span><br><span class="line"> n_count = int((<span class="number">0</span>+(i<span class="number">-1</span>))*(i)/<span class="number">2</span>)</span><br><span class="line"> print(current_candy, n_count)</span><br><span class="line"> <span class="keyword">if</span> remaining &gt;= current_candy:</span><br><span class="line"> l.append(n_count*num_people + n*i + current_candy)</span><br><span class="line"> remaining -= current_candy</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> l.append(n_count*num_people + n*i + remaining)</span><br><span class="line"> remaining = <span class="number">0</span></span><br><span class="line"> <span class="keyword">return</span> l</span><br><span class="line"><span class="comment"># 28 ms 13.7 MB,</span></span><br></pre></td></tr></table></figure> +<svg style="display: none" id="MJX-SVG-global-cache"><defs><path id="MJX-TEX-N-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"/><path id="MJX-TEX-N-2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"/><path id="MJX-TEX-N-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"/><path id="MJX-TEX-N-D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"/><path id="MJX-TEX-N-32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"/></defs></svg> + + + + <h3 id="1103-__u5206_u7CD6_u679C_II"><a href="#1103-__u5206_u7CD6_u679C_II" class="headerlink" title="1103. 分糖果 II"></a>1103. 分糖果 II</h3><p><a href="https://leetcode-cn.com/problems/distribute-candies-to-people/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1160 + + http://blog.tunpok.com/2020/04/01/leetcode-1160/ + 2020-03-31T16:18:48.000Z + 2020-04-01T07:57:06.000Z + + <h3 id="1160-__u62FC_u5199_u5355_u8BCD"><a href="#1160-__u62FC_u5199_u5355_u8BCD" class="headerlink" title="1160. 拼写单词"></a>1160. 拼写单词</h3><p><a href="https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">countCharacters</span><span class="params">(self, words, chars: str)</span> -&gt; int:</span></span><br><span class="line"></span><br><span class="line"> words_ = <span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> w <span class="keyword">in</span> words:</span><br><span class="line"> lchars = list(chars)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">for</span> l <span class="keyword">in</span> w:</span><br><span class="line"> lchars.remove(l)</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> words_ += w</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> len(words_)</span><br><span class="line"><span class="comment"># 152 ms 14.1 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="1160-__u62FC_u5199_u5355_u8BCD"><a href="#1160-__u62FC_u5199_u5355_u8BCD" class="headerlink" title="1160. 拼写单词"></a>1160. 拼写单词</h3><p><a href="https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1071 + + http://blog.tunpok.com/2020/03/30/leetcode-1071/ + 2020-03-30T14:03:01.000Z + 2020-03-30T14:04:17.000Z + + <h3 id="1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50"><a href="#1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50" class="headerlink" title="1071. 字符串的最大公因子"></a>1071. 字符串的最大公因子</h3><p><a href="https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">gcdOfStrings</span><span class="params">(self, str1: str, str2: str)</span> -&gt; str:</span></span><br><span class="line"> <span class="keyword">if</span> str1[<span class="number">0</span>] != str2[<span class="number">0</span>]:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"></span><br><span class="line"> a = len(str1)</span><br><span class="line"> b = len(str2)</span><br><span class="line"> print(a, b)</span><br><span class="line"> <span class="keyword">if</span> a &lt; b:</span><br><span class="line"> str1, str2 = str2, str1</span><br><span class="line"> a = len(str1)</span><br><span class="line"> b = len(str2)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> a%b:</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">0</span>, a//b):</span><br><span class="line"> <span class="keyword">if</span> str1[x*b:(x+<span class="number">1</span>)*b] != str2:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"> <span class="keyword">return</span> str2</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(b, <span class="number">0</span>, <span class="number">-1</span>):</span><br><span class="line"> print(x)</span><br><span class="line"> <span class="keyword">if</span> x==b <span class="keyword">or</span> b%x <span class="keyword">or</span> a%x:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">for</span> y <span class="keyword">in</span> range(<span class="number">0</span>, b//x):</span><br><span class="line"> <span class="keyword">if</span> str2[y*x:(y+<span class="number">1</span>)*x] != str2[b-x:b]:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> y <span class="keyword">in</span> range(<span class="number">0</span>, a//x):</span><br><span class="line"> <span class="keyword">if</span> str1[y*x:(y+<span class="number">1</span>)*x] != str2[<span class="number">0</span>:x]:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"> <span class="keyword">return</span> str2[<span class="number">0</span>:x]</span><br><span class="line"><span class="comment"># 44 ms 13.9 MB</span></span><br></pre></td></tr></table></figure> +<p>官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,<a href="https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/" target="_blank" rel="noopener">可以证明</a>必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。</p> + + + + + <h3 id="1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50"><a href="#1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50" class="headerlink" title="1071. 字符串的最大公因子"></a>1071. 字符串的最大公因子</h3><p><a href="https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-999 + + http://blog.tunpok.com/2020/03/30/leetcode-999/ + 2020-03-30T13:03:25.000Z + 2020-03-30T13:03:41.000Z + + <h3 id="999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570"><a href="#999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570" class="headerlink" title="999. 可以被一步捕获的棋子数"></a>999. 可以被一步捕获的棋子数</h3><p><a href="https://leetcode-cn.com/problems/available-captures-for-rook/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">numRookCaptures</span><span class="params">(self, board)</span> -&gt; int:</span></span><br><span class="line"> i = j = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> board:</span><br><span class="line"> <span class="keyword">if</span> <span class="string">'R'</span> <span class="keyword">in</span> row:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"> j = row.index(<span class="string">'R'</span>)</span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="comment"># right</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(j + <span class="number">1</span>, <span class="number">8</span>):</span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="comment"># left</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(j, <span class="number">0</span>, <span class="number">-1</span>):</span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="comment"># up</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(i, <span class="number">0</span>, <span class="number">-1</span>):</span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="comment"># down</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(i+<span class="number">1</span>, <span class="number">8</span>):</span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> count</span><br><span class="line"></span><br><span class="line"><span class="comment">#36 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> +<p>问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。</p> + + + + + <h3 id="999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570"><a href="#999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570" class="headerlink" title="999. 可以被一步捕获的棋子数"></a>999. 可以被一步捕获的棋子数</h3><p><a href="https://leetcode-cn.com/problems/available-captures-for-rook/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-914 + + http://blog.tunpok.com/2020/03/29/leetcode-914/ + 2020-03-29T14:41:09.000Z + 2020-03-29T14:52:07.000Z + + <h3 id="914-__u5361_u724C_u5206_u7EC4"><a href="#914-__u5361_u724C_u5206_u7EC4" class="headerlink" title="914. 卡牌分组"></a>914. 卡牌分组</h3><p><a href="https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">hasGroupsSizeX</span><span class="params">(self, deck)</span> -&gt; bool:</span></span><br><span class="line"> dc = &#123;&#125;</span><br><span class="line"> max_d = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> d <span class="keyword">in</span> deck:</span><br><span class="line"> <span class="keyword">if</span> d <span class="keyword">not</span> <span class="keyword">in</span> dc:</span><br><span class="line"> dc[d] = <span class="number">0</span></span><br><span class="line"> dc[d] += <span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> max_d &lt; d:</span><br><span class="line"> max_d = d</span><br><span class="line"> <span class="keyword">if</span> max_d &lt; dc[d]:</span><br><span class="line"> max_d = dc[d]</span><br><span class="line"> has_x = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">if</span> max_d == <span class="number">1</span>:</span><br><span class="line"> max_d = <span class="number">2</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">2</span>, max_d + <span class="number">1</span>):</span><br><span class="line"> has_x = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">for</span> k,v <span class="keyword">in</span> dc.items():</span><br><span class="line"> <span class="keyword">if</span> v % i:</span><br><span class="line"> has_x = <span class="keyword">False</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> has_x <span class="keyword">and</span> i &gt;= <span class="number">2</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#56 ms 13.8 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="914-__u5361_u724C_u5206_u7EC4"><a href="#914-__u5361_u724C_u5206_u7EC4" class="headerlink" title="914. 卡牌分组"></a>914. 卡牌分组</h3><p><a href="https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1013 + + http://blog.tunpok.com/2020/03/29/leetcode-1013/ + 2020-03-29T13:09:22.000Z + 2020-03-29T13:15:11.000Z + + <h3 id="1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206"><a href="#1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206" class="headerlink" title="1013. 将数组分成和相等的三个部分"></a>1013. 将数组分成和相等的三个部分</h3><p><a href="https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">canThreePartsEqualSum</span><span class="params">(self, A)</span> -&gt; bool:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> A:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"> sa = sum(A)</span><br><span class="line"> <span class="keyword">if</span> sa % <span class="number">3</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"> s = sa // <span class="number">3</span></span><br><span class="line"> s1 = <span class="number">0</span></span><br><span class="line"> s2 = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(len(A)):</span><br><span class="line"> s1 += A[i]</span><br><span class="line"> <span class="keyword">if</span> s1 == s <span class="keyword">and</span> (i+<span class="number">1</span>) &lt; len(A):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> range(len(A[i+<span class="number">1</span>:])):</span><br><span class="line"> s2 += A[i+<span class="number">1</span>+j]</span><br><span class="line"> <span class="keyword">if</span> s2 == s <span class="keyword">and</span> j+<span class="number">1</span> &lt; len(A[i+<span class="number">1</span>:]) <span class="keyword">and</span> sum(A[i+j+<span class="number">2</span>:])== s:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"><span class="comment">#60 ms 18.7 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206"><a href="#1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206" class="headerlink" title="1013. 将数组分成和相等的三个部分"></a>1013. 将数组分成和相等的三个部分</h3><p><a href="https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-876 + + http://blog.tunpok.com/2020/03/26/leetcode-876/ + 2020-03-26T13:18:41.000Z + 2020-03-26T13:19:10.000Z + + <h3 id="876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9"><a href="#876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9" class="headerlink" title="876. 链表的中间结点"></a>876. 链表的中间结点</h3><p><a href="https://leetcode-cn.com/problems/middle-of-the-linked-list/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for singly-linked list.</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ListNode</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x)</span>:</span></span><br><span class="line"> self.val = x</span><br><span class="line"> self.next = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">middleNode</span><span class="params">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> l = []</span><br><span class="line"> n = head</span><br><span class="line"> <span class="keyword">while</span> n.next:</span><br><span class="line"> l.append(n)</span><br><span class="line"> n = n.next</span><br><span class="line"> l.append(n)</span><br><span class="line"> <span class="keyword">return</span> l[len(l)//<span class="number">2</span>]</span><br><span class="line"></span><br><span class="line"> <span class="comment">#44 ms 13.7 MB</span></span><br></pre></td></tr></table></figure> +<p>看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">middleNode</span><span class="params">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> slow = fast = head</span><br><span class="line"> <span class="keyword">while</span> fast <span class="keyword">and</span> fast.next:</span><br><span class="line"> slow = slow.next</span><br><span class="line"> fast = fast.next.next</span><br><span class="line"> <span class="keyword">return</span> slow</span><br><span class="line"></span><br><span class="line">作者:LeetCode-Solution</span><br><span class="line">链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/</span><br><span class="line">来源:力扣(LeetCode)</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure> + + + + + <h3 id="876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9"><a href="#876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9" class="headerlink" title="876. 链表的中间结点"></a>876. 链表的中间结点</h3><p><a href="https://leetcode-cn.com/problems/middle-of-the-linked-list/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-836 + + http://blog.tunpok.com/2020/03/25/leetcode-836/ + 2020-03-25T14:41:25.000Z + 2020-03-25T14:41:44.000Z + + <h3 id="836-__u77E9_u5F62_u91CD_u53E0"><a href="#836-__u77E9_u5F62_u91CD_u53E0" class="headerlink" title="836. 矩形重叠"></a>836. 矩形重叠</h3><p><a href="https://leetcode-cn.com/problems/rectangle-overlap/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">isRectangleOverlap</span><span class="params">(self, rec1, rec2)</span> -&gt; bool:</span></span><br><span class="line"> <span class="keyword">return</span> ((min(rec1[<span class="number">2</span>], rec2[<span class="number">2</span>]) &gt; max(rec1[<span class="number">0</span>], rec2[<span class="number">0</span>]))</span><br><span class="line"> <span class="keyword">and</span> (min(rec1[<span class="number">3</span>], rec2[<span class="number">3</span>]) &gt; max(rec1[<span class="number">1</span>], rec2[<span class="number">1</span>])))</span><br><span class="line"></span><br><span class="line">s = Solution()</span><br><span class="line">s.isRectangleOverlap(rec1 = [<span class="number">0</span>,<span class="number">0</span>,<span class="number">2</span>,<span class="number">2</span>], rec2 = [<span class="number">1</span>,<span class="number">1</span>,<span class="number">3</span>,<span class="number">3</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment">#40 ms 13.7 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="836-__u77E9_u5F62_u91CD_u53E0"><a href="#836-__u77E9_u5F62_u91CD_u53E0" class="headerlink" title="836. 矩形重叠"></a>836. 矩形重叠</h3><p><a href="https://leetcode-cn.com/problems/rectangle-overlap/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-409 + + http://blog.tunpok.com/2020/03/25/leetcode-409/ + 2020-03-25T13:55:38.000Z + 2020-03-25T13:55:54.000Z + + <h3 id="409-__u6700_u957F_u56DE_u6587_u4E32"><a href="#409-__u6700_u957F_u56DE_u6587_u4E32" class="headerlink" title="409. 最长回文串"></a>409. 最长回文串</h3><p><a href="https://leetcode-cn.com/problems/longest-palindrome/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。</p> +<p>这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">longestPalindrome</span><span class="params">(self, s: str)</span> -&gt; int:</span></span><br><span class="line"> d = &#123;&#125;</span><br><span class="line"> <span class="keyword">for</span> l <span class="keyword">in</span> s:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> l <span class="keyword">in</span> d:</span><br><span class="line"> d[l] = <span class="number">0</span></span><br><span class="line"> d[l] += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> i = <span class="number">0</span></span><br><span class="line"> odd = <span class="keyword">False</span></span><br><span class="line"> <span class="keyword">for</span> k, v <span class="keyword">in</span> d.items():</span><br><span class="line"> <span class="keyword">if</span> v % <span class="number">2</span>:</span><br><span class="line"> i += (v<span class="number">-1</span>)</span><br><span class="line"> odd = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> i += v</span><br><span class="line"> <span class="keyword">if</span> odd:</span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"></span><br><span class="line"><span class="comment">#40 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="409-__u6700_u957F_u56DE_u6587_u4E32"><a href="#409-__u6700_u957F_u56DE_u6587_u4E32" class="headerlink" title="409. 最长回文串"></a>409. 最长回文串</h3><p><a href="https://leetcode-cn.com/problems/longest-palindrome/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-543 + + http://blog.tunpok.com/2020/03/25/leetcode-543/ + 2020-03-25T11:13:52.000Z + 2020-04-14T15:29:53.000Z + + <h3 id="543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84"><a href="#543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84" class="headerlink" title="543. 二叉树的直径"></a>543. 二叉树的直径</h3><p><a href="https://leetcode-cn.com/problems/diameter-of-binary-tree/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for a binary tree node.</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TreeNode</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x)</span>:</span></span><br><span class="line"> self.val = x</span><br><span class="line"> self.left = <span class="keyword">None</span></span><br><span class="line"> self.right = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">diameterOfBinaryTree</span><span class="params">(self, root: TreeNode)</span> -&gt; int:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> root:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> last_node = <span class="number">-1</span></span><br><span class="line"> routes = []</span><br><span class="line"> start = root</span><br><span class="line"> node_stack = [root]</span><br><span class="line"> <span class="keyword">while</span> (start.left <span class="keyword">or</span> start.right <span class="keyword">or</span> node_stack):</span><br><span class="line"> <span class="keyword">if</span> start != node_stack[<span class="number">-1</span>]:</span><br><span class="line"> node_stack.append(start)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> last_node == start.right:</span><br><span class="line"> node_stack = node_stack[:<span class="number">-1</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node_stack:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> last_node = start</span><br><span class="line"> start = node_stack[<span class="number">-1</span>]</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> start.left <span class="keyword">and</span> last_node != start.left:</span><br><span class="line"> start = start.left</span><br><span class="line"> last_node = start</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> start.right:</span><br><span class="line"> start = start.right</span><br><span class="line"> last_node = start</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> routes.append(node_stack)</span><br><span class="line"> node_stack = node_stack[:<span class="number">-1</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node_stack:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> last_node = start</span><br><span class="line"> start = node_stack[<span class="number">-1</span>]</span><br><span class="line"></span><br><span class="line"> max_l = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> route <span class="keyword">in</span> routes:</span><br><span class="line"> <span class="keyword">for</span> route_ <span class="keyword">in</span> routes:</span><br><span class="line"> intersection = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> route != route_:</span><br><span class="line"> intersection = len(set(route).intersection(set(route_)))</span><br><span class="line"> <span class="keyword">if</span> intersection:</span><br><span class="line"> intersection -= <span class="number">1</span></span><br><span class="line"> max_l = max(max_l, len(set(route)| set(route_)) - intersection)</span><br><span class="line"> <span class="keyword">return</span> max_l - <span class="number">1</span></span><br></pre></td></tr></table></figure> +<p>L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。</p> +<p>其实以某个点为根节点的树的直径,就是某个节点的<strong>左子树的深度和右子树的深度的和</strong>,用递归来处理这个会比较容易理解</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">diameterOfBinaryTree</span><span class="params">(self, root)</span>:</span></span><br><span class="line"> self.ans = <span class="number">1</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">depth</span><span class="params">(node)</span>:</span></span><br><span class="line"> <span class="comment"># 访问到空节点了,返回0</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node: <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="comment"># 左儿子为根的子树的深度</span></span><br><span class="line"> L = depth(node.left)</span><br><span class="line"> <span class="comment"># 右儿子为根的子树的深度</span></span><br><span class="line"> R = depth(node.right)</span><br><span class="line"> <span class="comment"># 计算d_node即L+R+1 并更新ans</span></span><br><span class="line"> self.ans = max(self.ans, L+R+<span class="number">1</span>)</span><br><span class="line"> <span class="comment"># 返回该节点为根的子树的深度</span></span><br><span class="line"> <span class="keyword">return</span> max(L, R) + <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> depth(root)</span><br><span class="line"> <span class="keyword">return</span> self.ans - <span class="number">1</span></span><br><span class="line"></span><br><span class="line">作者:LeetCode-Solution</span><br><span class="line">链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/</span><br><span class="line">来源:力扣(LeetCode)</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure> + + + + + <h3 id="543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84"><a href="#543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84" class="headerlink" title="543. 二叉树的直径"></a>543. 二叉树的直径</h3><p><a href="https://leetcode-cn.com/problems/diameter-of-binary-tree/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-225 + + http://blog.tunpok.com/2020/03/23/leetcode-225/ + 2020-03-23T15:35:05.000Z + 2020-03-23T15:35:24.000Z + + <h3 id="225-__u7528_u961F_u5217_u5B9E_u73B0_u6808"><a href="#225-__u7528_u961F_u5217_u5B9E_u73B0_u6808" class="headerlink" title="225. 用队列实现栈"></a>225. 用队列实现栈</h3><p><a href="https://leetcode-cn.com/problems/implement-stack-using-queues/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyStack</span>:</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Initialize your data structure here.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.data = []</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">push</span><span class="params">(self, x: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Push element x onto stack.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.data.append(x)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">pop</span><span class="params">(self)</span> -&gt; int:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Removes the element on top of the stack and returns that element.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">return</span> self.data.pop(<span class="number">-1</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">top</span><span class="params">(self)</span> -&gt; int:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Get the top element.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">return</span> self.data[<span class="number">-1</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">empty</span><span class="params">(self)</span> -&gt; bool:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Returns whether the stack is empty.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">not</span> bool(self.data)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># Your MyStack object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment"># obj = MyStack()</span></span><br><span class="line"><span class="comment"># obj.push(x)</span></span><br><span class="line"><span class="comment"># param_2 = obj.pop()</span></span><br><span class="line"><span class="comment"># param_3 = obj.top()</span></span><br><span class="line"><span class="comment"># param_4 = obj.empty()</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#24 ms 13.5 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="225-__u7528_u961F_u5217_u5B9E_u73B0_u6808"><a href="#225-__u7528_u961F_u5217_u5B9E_u73B0_u6808" class="headerlink" title="225. 用队列实现栈"></a>225. 用队列实现栈</h3><p><a href="https://leetcode-cn.com/problems/implement-stack-using-queues/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + diff --git a/public/categories/leetcode/index.html b/public/categories/leetcode/index.html new file mode 100644 index 0000000..0356b98 --- /dev/null +++ b/public/categories/leetcode/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/categories/leetcode/page/2/index.html b/public/categories/leetcode/page/2/index.html new file mode 100644 index 0000000..f73cc41 --- /dev/null +++ b/public/categories/leetcode/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/categories/leetcode/page/3/index.html b/public/categories/leetcode/page/3/index.html new file mode 100644 index 0000000..ec42c2f --- /dev/null +++ b/public/categories/leetcode/page/3/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/css/apollo.css b/public/css/apollo.css new file mode 100644 index 0000000..375a69b --- /dev/null +++ b/public/css/apollo.css @@ -0,0 +1 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}body{margin:0;color:#34495e;font-size:15px;line-height:1.6;font-family:'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif}ul.nav,ul.post-list{margin:0;padding:0;list-style-type:none}a,a:active{color:#2c3e50;text-decoration:none}a.nav-list-link.active,a.nav-list-link:hover,a.post-title-link:hover{border-bottom:2px solid #42b983}hr{border:0}code{margin:0 2px;padding:3px 5px;color:#e96900;border-radius:2px;white-space:inherit}table{width:100%}table thead{background-color:#ddd}table thead th{padding:5px}table tbody tr:nth-child(2n){background-color:#eee}table tbody td{padding:5px}header{height:60px}header .logo-link{float:left}header .nav{float:right;left:80px}header .logo-link img{height:60px}header .nav-list-item{display:inline-block;padding:19px 10px}header .nav-list-item a{font-size:16px;line-height:1.4}.home.post-list{margin:2em 0}.home.post-list .post-list-item{padding:1em 0 2em;border-bottom:1px solid #ddd}.home.post-list .post-content h2:before,.home.post-list .post-content h3:before,.home.post-list .post-content h4:before,.home.post-list .post-content h5:before,.home.post-list .post-content h6:before{content:''}.home.post-list .post-content>ul{list-style:initial}.home.post-list .read-more{color:#42b983}.post{padding-top:1em}.post-block .post-title{margin:0.65em 0;color:#2c3e50;font-size:1.5em}.post-block .post-time{color:#7f8c8d;margin:1.2em 0}.post-content h2,.post-content h3,.post-content h4,.post-content h5,.post-content h6{position:relative;margin:1em 0}.post-content h2:before,.post-content h3:before,.post-content h4:before,.post-content h5:before,.post-content h6:before{content:"#";color:#42b983;position:absolute;left:-0.7em;top:-4px;font-size:1.2em;font-weight:bold}.post-content h2,.post-content h3{font-size:22px}.post-content h4,.post-content h5,.post-content h6{font-size:18px}.post-content a{color:#42b983}.post-content blockquote{margin:2em 0;padding-left:20px;border-left:4px solid #42b983}.post-content img{display:block;max-width:100%;margin:1em auto}.post-content .tip{position:relative;margin:2em 0;padding:12px 24px 12px 30px;border-left:4px solid #f66;border-top-right-radius:2px;border-bottom-right-radius:2px;background-color:#f8f8f8}.post-content .tip br{display:none}.post-content .tip:before{position:absolute;top:14px;left:-12px;content:"!";width:20px;height:20px;border-radius:100%;color:#fff;font-size:14px;line-height:20px;font-weight:bold;text-align:center;background-color:#f66;font-family:'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif}code,pre{font-size:0.8em;background-color:#f8f8f8;font-family:'Roboto Mono', Monaco, courier, monospace}.highlight{position:relative;margin:1em 0;border-radius:2px;line-height:1.1em;background-color:#f8f8f8;overflow-x:auto}.highlight table,.highlight tr,.highlight td{width:100%;border-collapse:collapse;padding:0;margin:0}.highlight .gutter{display:none}.highlight .code pre{padding:1.2em 1.4em;line-height:1.5em;margin:0}.highlight.html .code:after,.highlight.js .code:after,.highlight.bash .code:after,.highlight.css .code:after,.highlight.scss .code:after,.highlight.diff .code:after,.highlight.java .code:after,.highlight.xml .code:after,.highlight.python .code:after,.highlight.json .code:after,.highlight.swift .code:after,.highlight.ruby .code:after,.highlight.perl .code:after,.highlight.php .code:after,.highlight.c .code:after{position:absolute;top:0;right:0;color:#ccc;text-align:right;font-size:0.75em;padding:5px 10px 0;line-height:15px;height:15px;font-weight:600}.highlight.html .code:after{content:"HTML"}.highlight.js .code:after{content:"JS"}.highlight.bash .code:after{content:"BASH"}.highlight.css .code:after{content:"CSS"}.highlight.scss .code:after{content:"SCSS"}.highlight.diff .code:after{content:"DIFF"}.highlight.java .code:after{content:"JAVA"}.highlight.xml .code:after{content:"XML"}.highlight.python .code:after{content:"PYTHON"}.highlight.json .code:after{content:"JSON"}.highlight.swift .code:after{content:"SWIFT"}.highlight.ruby .code:after{content:"RUBY"}.highlight.perl .code:after{content:"PERL"}.highlight.php .code:after{content:"PHP"}.highlight.c .code:after{content:"C"}.highlight.java .code:after{content:"JAVA"}pre{color:#525252}pre .function .keyword,pre .constant{color:#0092db}pre .keyword,pre .attribute{color:#e96900}pre .number,pre .literal{color:#ae81ff}pre .tag,pre .tag .title,pre .change,pre .winutils,pre .flow,pre .lisp .title,pre .clojure .built_in,pre .nginx .title,pre .tex .special{color:#2973b7}pre .symbol,pre .symbol .string,pre .value,pre .regexp{color:#42b983}pre .title{color:#83B917}pre .tag .value,pre .string,pre .subst,pre .haskell .type,pre .preprocessor,pre .ruby .class .parent,pre .built_in,pre .sql .aggregate,pre .django .template_tag,pre .django .variable,pre .smalltalk .class,pre .javadoc,pre .django .filter .argument,pre .smalltalk .localvars,pre .smalltalk .array,pre .attr_selector,pre .pseudo,pre .addition,pre .stream,pre .envvar,pre .apache .tag,pre .apache .cbracket,pre .tex .command,pre .prompt{color:#42b983}pre .comment,pre .java .annotation,pre .python .decorator,pre .template_comment,pre .pi,pre .doctype,pre .shebang,pre .apache .sqbracket,pre .tex .formula{color:#b3b3b3}pre .deletion{color:#BA4545}pre .coffeescript .javascript,pre .javascript .xml,pre .tex .formula,pre .xml .javascript,pre .xml .vbscript,pre .xml .css,pre .xml .cdata{opacity:0.5}.paginator{margin:4em 0;text-align:center}.paginator .prev,.paginator .next{display:inline-block;margin:0 4px;padding:4px 12px;border-radius:4px;border-bottom:4px solid #3aa373;font-size:14px;color:#fff;background-color:#4fc08d}.paginator .prev:hover,.paginator .next:hover{background-color:#22bd77}.ds-thread,#disqus_thread{margin-bottom:2em}section.container{margin:2em 10px}@media screen and (min-width: 700px){body{width:700px;margin:0 auto}header{padding:20px 100px}}@media screen and (max-width: 700px){body{width:100%}header{padding:20px 40px}header a.logo-link,header ul.nav.nav-list{float:none;display:block;text-align:center}.post-content h2,.post-content h3,.post-content h4,.post-content h5,.post-content h6{max-width:300px;left:15px}.ds-thread,#disqus_thread{margin:2em 10px}}.copyright{margin:4em 0;border-top:1px solid #ddd;text-align:center}.copyright p,.copyright a{color:#aaa;font-size:14px;font-weight:100}.copyright a:hover{color:#888} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..fc0bd8b Binary files /dev/null and b/public/favicon.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..7ba8455 --- /dev/null +++ b/public/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..97c6230 Binary files /dev/null and b/public/logo.png differ diff --git a/public/page/2/index.html b/public/page/2/index.html new file mode 100644 index 0000000..4b3037c --- /dev/null +++ b/public/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/page/3/index.html b/public/page/3/index.html new file mode 100644 index 0000000..45cda11 --- /dev/null +++ b/public/page/3/index.html @@ -0,0 +1,236 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
\ No newline at end of file diff --git a/public/page/4/index.html b/public/page/4/index.html new file mode 100644 index 0000000..d1353e3 --- /dev/null +++ b/public/page/4/index.html @@ -0,0 +1,147 @@ + MarkDown
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/scss/apollo.scss b/public/scss/apollo.scss new file mode 100644 index 0000000..b9ddbf2 --- /dev/null +++ b/public/scss/apollo.scss @@ -0,0 +1,10 @@ +@charset "utf-8"; + +@import "_partial/normalize"; +@import "_partial/base"; +@import "_partial/header"; +@import "_partial/home-post-list"; +@import "_partial/post"; +@import "_partial/footer"; +@import "_partial/mq"; +@import "_partial/copyright"; \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..0822543 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,228 @@ + + + + + http://blog.tunpok.com/2020/04/21/leetcode-number-of-islands/ + + 2020-04-21T04:55:46.000Z + + + + + http://blog.tunpok.com/2020/04/16/leetcode-string-to-integer-atoi/ + + 2020-04-16T11:56:40.000Z + + + + + http://blog.tunpok.com/2020/04/16/leetcode-merge-intervals/ + + 2020-04-16T11:22:48.000Z + + + + + http://blog.tunpok.com/2020/04/16/leetcode-01-matrix/ + + 2020-04-16T04:26:56.000Z + + + + + http://blog.tunpok.com/2020/03/25/leetcode-543/ + + 2020-04-14T15:29:53.000Z + + + + + http://blog.tunpok.com/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/ + + 2020-04-14T15:29:40.000Z + + + + + http://blog.tunpok.com/2020/04/14/leetcode-design-twitter/ + + 2020-04-14T15:29:34.000Z + + + + + http://blog.tunpok.com/2020/04/14/leetcode-add-two-numbers-ii/ + + 2020-04-14T15:28:35.000Z + + + + + http://blog.tunpok.com/2020/04/01/leetcode-1103/ + + 2020-04-08T17:17:27.000Z + + + + + http://blog.tunpok.com/2020/04/09/leetcode-the-masseuse-lcci/ + + 2020-04-08T17:14:04.000Z + + + + + http://blog.tunpok.com/2020/04/01/leetcode-compress-string-lcci/ + + 2020-04-01T07:57:26.000Z + + + + + http://blog.tunpok.com/2020/04/01/leetcode-1160/ + + 2020-04-01T07:57:06.000Z + + + + + http://blog.tunpok.com/2020/03/30/leetcode-1071/ + + 2020-03-30T14:04:17.000Z + + + + + http://blog.tunpok.com/2020/03/30/leetcode-999/ + + 2020-03-30T13:03:41.000Z + + + + + http://blog.tunpok.com/2020/03/29/leetcode-914/ + + 2020-03-29T14:52:07.000Z + + + + + http://blog.tunpok.com/2020/03/29/leetcode-1013/ + + 2020-03-29T13:15:11.000Z + + + + + http://blog.tunpok.com/2020/03/26/leetcode-876/ + + 2020-03-26T13:19:10.000Z + + + + + http://blog.tunpok.com/2020/03/25/leetcode-836/ + + 2020-03-25T14:41:44.000Z + + + + + http://blog.tunpok.com/2020/03/25/leetcode-409/ + + 2020-03-25T13:55:54.000Z + + + + + http://blog.tunpok.com/2020/03/23/leetcode-225/ + + 2020-03-23T15:35:24.000Z + + + + + http://blog.tunpok.com/2020/03/23/leetcode-169/ + + 2020-03-23T15:13:49.000Z + + + + + http://blog.tunpok.com/2020/03/18/leetcode-206/ + + 2020-03-18T15:44:12.000Z + + + + + http://blog.tunpok.com/2020/03/17/leetcode-121/ + + 2020-03-17T10:54:03.000Z + + + + + http://blog.tunpok.com/2019/11/14/AWS-KMS/ + + 2019-11-14T08:03:24.000Z + + + + + http://blog.tunpok.com/2018/05/31/bash-function-and-awk/ + + 2019-11-14T08:01:50.000Z + + + + + http://blog.tunpok.com/2019/03/12/Postgresql-Partitioning/ + + 2019-11-14T08:01:50.000Z + + + + + http://blog.tunpok.com/2016/04/25/Django-Manager-Method/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/02/15/Flask-Day-1/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/02/16/Flask-Day-2/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/05/04/Tastypie/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/02/12/first-post/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/05/10/TastyPie-Note-1/ + + 2018-05-15T14:58:35.000Z + + + + diff --git a/scaffolds/draft.md b/scaffolds/draft.md new file mode 100644 index 0000000..498e95b --- /dev/null +++ b/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/scaffolds/page.md b/scaffolds/page.md new file mode 100644 index 0000000..f01ba3c --- /dev/null +++ b/scaffolds/page.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +date: {{ date }} +--- diff --git a/scaffolds/post.md b/scaffolds/post.md new file mode 100644 index 0000000..47e6b91 --- /dev/null +++ b/scaffolds/post.md @@ -0,0 +1,6 @@ +--- +title: {{ title }} +date: {{ date }} +tags: +categories: +--- diff --git a/source/.MWebMetaData/setting.json b/source/.MWebMetaData/setting.json new file mode 100644 index 0000000..8fc031b --- /dev/null +++ b/source/.MWebMetaData/setting.json @@ -0,0 +1,10 @@ +{ + "name" : "hexo_blog_tunpok", + "fileExtension" : ".md", + "autoUploadInsertedImageKey" : "looching-https:\/\/looching.imgur.com\/", + "autoUploadInsertedImage" : false, + "folderType" : 11, + "mediaFloder" : "media", + "orderBy" : 0, + "newlinesToBR" : 0 +} \ No newline at end of file diff --git a/source/CNAME b/source/CNAME new file mode 100644 index 0000000..bc9fd8c --- /dev/null +++ b/source/CNAME @@ -0,0 +1 @@ +blog.tunpok.com diff --git a/source/_posts/2018-05-31-bash-function-and-awk.md b/source/_posts/2018-05-31-bash-function-and-awk.md new file mode 100644 index 0000000..874ffcc --- /dev/null +++ b/source/_posts/2018-05-31-bash-function-and-awk.md @@ -0,0 +1,52 @@ +--- +title: bash function and awk +date: 2018-05-31 00:00:48 +tags: +--- + + + +I'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity. + + + +#### bash functions + +Bash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess: + +```bash +function run { + source ~/Develop/django/bin/activate + ./manage.py runserver +} +``` + +I activate django virtural enviroment first and then run django serve. + +Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work: + +```bash +function ba { hgba | grep "$1" } +# hgba is an alias for hg branches +``` + +I can just type `ba release` then get current release branch info. + +----- + +Append: + +I made some updates to the `ba` function and make it auto copying the branch result to my clipboard: + +```bash + +function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var } +``` + + + +#### awk + +`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. + + diff --git a/source/_posts/2019-11-14-AWS-KMS.md b/source/_posts/2019-11-14-AWS-KMS.md new file mode 100644 index 0000000..73a8723 --- /dev/null +++ b/source/_posts/2019-11-14-AWS-KMS.md @@ -0,0 +1,14 @@ +--- +title: AWS KMS +date: 2019-11-14 15:19:05 +tags: +--- + +We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons. + +Since AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3. + +*TBD* + + +[1]: https://www.amazonaws.cn/kms/ \ No newline at end of file diff --git a/source/_posts/2020-03-17-leetcode-121.md b/source/_posts/2020-03-17-leetcode-121.md new file mode 100644 index 0000000..8afe2a0 --- /dev/null +++ b/source/_posts/2020-03-17-leetcode-121.md @@ -0,0 +1,59 @@ +--- +title: leetcode-121 +date: 2020-03-17 18:06:45 +tags: +categories: leetcode +--- + +### 121. 买卖股票的最佳时机 + +[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/) + + + +原始答案: + +```python +class Solution: + def maxProfit(self, prices) -> int: + profit = 0 + if not prices: + return profit + min_buyin = prices[0] + max_sellout = prices[0] + l = len(prices) + i = 0 + for buyin in prices: + if i == l: + return profit + if min_buyin <= buyin: + max_sellout = max(prices[i:]) + p = max_sellout - min_buyin + if p > profit: + profit = p + if buyin < min_buyin: + min_buyin = buyin + i += 1 + return profit +#1880 ms 14.4 MB +``` + +主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。 + +仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样 + +```python +class Solution: + def maxProfit(self, prices) -> int: + profit = 0 + if not prices: + return profit + min_buyin = prices[0] + for i in range(1, len(prices)): + min_buyin = min(min_buyin, prices[i-1]) + profit = max(prices[i] - min_buyin, profit) + return profit + #44 ms 14.4 MB +``` + + diff --git a/source/_posts/2020-03-18-leetcode-206.md b/source/_posts/2020-03-18-leetcode-206.md new file mode 100644 index 0000000..c88df6b --- /dev/null +++ b/source/_posts/2020-03-18-leetcode-206.md @@ -0,0 +1,88 @@ +--- +title: leetcode-206 +date: 2020-03-18 23:33:03 +tags: +categories: leetcode +--- + +### 206. 反转链表 + +[题目](https://leetcode-cn.com/problems/reverse-linked-list/) + + + +最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。 + +```python +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + +class Solution: + def reverseList(self, head): + if not head or not head.next: + return head + nl = [] + while head.next: + nl.append(head) + head = head.next + nl.append(head) + l = len(nl) + for x in range(l): + if x == 0: + nl[x].next = None + continue + nl[x].next = nl[x-1] + if x == (l - 1): + return nl[x] +``` + +仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了: + +```python +class Solution: + def reverseList(self, head): + if not head or not head.next: + return head + prev_node = None + next_node = head.next + while head: + next_node = head.next + head.next = prev_node + prev_node = head + head = next_node + return prev_node +``` + +然后是递归的做法,主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。 + +```python +class Solution: + def reverseList(self, head): + if not head: + return head + if head.next: + ss = Solution() + last = ss.reverseList(head.next) + head.next.next = head + head.next = None + return last + return head +``` + +一开始是用list来打草稿,不过想明白递归之后就大同小异了: + +```python +def a(l:list)->list: + k=[l[0]] + + if l[1:]: + b=a(l[1:]) + b.extend(k) + else: + return [l[0]] + return b +``` + + diff --git a/source/_posts/2020-03-23-leetcode-169.md b/source/_posts/2020-03-23-leetcode-169.md new file mode 100644 index 0000000..0ced4b2 --- /dev/null +++ b/source/_posts/2020-03-23-leetcode-169.md @@ -0,0 +1,62 @@ +--- +title: leetcode-169 +date: 2020-03-23 23:12:57 +tags: +categories: leetcode +--- + + +### 169. 多数元素 + +[题目](https://leetcode-cn.com/problems/majority-element/) + + + + + + + +一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\cfrac{n}{2}$ 时就可以得出结果。 + +```python +class Solution: + def majorityElement(self, nums) -> int: + d = {} + l = len(nums) + for n in nums: + if not n in d: + d[n] = 0 + d[n] = d[n] + 1 + if d[n] > l/2: + return n +# 64 ms 15.1 MB +``` + +Python 也有专门计数的库,写起来更简单一点: + +```python +class Solution: + def majorityElement(self, nums): + counts = collections.Counter(nums) + return max(counts.keys(), key=counts.get) +# 44 ms 15.1 MB +``` + +由于要找的数出现次数大于 $\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了: + +```python +class Solution: + def majorityElement(self, nums): + majority_count = len(nums)//2 + while True: + candidate = random.choice(nums) + if sum(1 for elem in nums if elem == candidate) > majority_count: + return candidate + +#作者:LeetCode-Solution +#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/ +#来源:力扣(LeetCode) +#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + + diff --git a/source/_posts/2020-03-23-leetcode-225.md b/source/_posts/2020-03-23-leetcode-225.md new file mode 100644 index 0000000..2784356 --- /dev/null +++ b/source/_posts/2020-03-23-leetcode-225.md @@ -0,0 +1,69 @@ +--- +title: leetcode-225 +date: 2020-03-23 23:35:05 +tags: +categories: leetcode +--- + +### 225. 用队列实现栈 + +[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/) + + + + + + + +注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。 + +```python +class MyStack: + + def __init__(self): + """ + Initialize your data structure here. + """ + self.data = [] + + + def push(self, x: int) -> None: + """ + Push element x onto stack. + """ + self.data.append(x) + return + + + def pop(self) -> int: + """ + Removes the element on top of the stack and returns that element. + """ + return self.data.pop(-1) + + + def top(self) -> int: + """ + Get the top element. + """ + return self.data[-1] + + + def empty(self) -> bool: + """ + Returns whether the stack is empty. + """ + return not bool(self.data) + + + +# Your MyStack object will be instantiated and called as such: +# obj = MyStack() +# obj.push(x) +# param_2 = obj.pop() +# param_3 = obj.top() +# param_4 = obj.empty() + +#24 ms 13.5 MB +``` + diff --git a/source/_posts/2020-03-25-leetcode-409.md b/source/_posts/2020-03-25-leetcode-409.md new file mode 100644 index 0000000..51cf8ea --- /dev/null +++ b/source/_posts/2020-03-25-leetcode-409.md @@ -0,0 +1,49 @@ +--- +title: leetcode-409 +date: 2020-03-25 21:55:38 +tags: +categories: leetcode +--- + +### 409. 最长回文串 + +[题目](https://leetcode-cn.com/problems/longest-palindrome/) + + + + + + + + + +一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。 + +这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。 + + + +```python +class Solution: + def longestPalindrome(self, s: str) -> int: + d = {} + for l in s: + if not l in d: + d[l] = 0 + d[l] += 1 + + i = 0 + odd = False + for k, v in d.items(): + if v % 2: + i += (v-1) + odd = True + else: + i += v + if odd: + i += 1 + return i + +#40 ms 13.6 MB +``` + diff --git a/source/_posts/2020-03-25-leetcode-543.md b/source/_posts/2020-03-25-leetcode-543.md new file mode 100644 index 0000000..bec6212 --- /dev/null +++ b/source/_posts/2020-03-25-leetcode-543.md @@ -0,0 +1,112 @@ +--- +title: leetcode-543 +date: 2020-03-25 19:13:52 +tags: +categories: leetcode +--- + +### 543. 二叉树的直径 + + +[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/) + + + + + + +这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。 + +```python +# Definition for a binary tree node. +class TreeNode: + def __init__(self, x): + self.val = x + self.left = None + self.right = None + +class Solution: + def diameterOfBinaryTree(self, root: TreeNode) -> int: + if not root: + return 0 + last_node = -1 + routes = [] + start = root + node_stack = [root] + while (start.left or start.right or node_stack): + if start != node_stack[-1]: + node_stack.append(start) + + if last_node == start.right: + node_stack = node_stack[:-1] + if not node_stack: + break + last_node = start + start = node_stack[-1] + continue + + if start.left and last_node != start.left: + start = start.left + last_node = start + continue + + if start.right: + start = start.right + last_node = start + continue + + routes.append(node_stack) + node_stack = node_stack[:-1] + if not node_stack: + break + last_node = start + start = node_stack[-1] + + max_l = 0 + for route in routes: + for route_ in routes: + intersection = 0 + if route != route_: + intersection = len(set(route).intersection(set(route_))) + if intersection: + intersection -= 1 + max_l = max(max_l, len(set(route)| set(route_)) - intersection) + return max_l - 1 +``` + + + +L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。 + + + +其实以某个点为根节点的树的直径,就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解 + + + +```python +class Solution(object): + def diameterOfBinaryTree(self, root): + self.ans = 1 + def depth(node): + # 访问到空节点了,返回0 + if not node: return 0 + # 左儿子为根的子树的深度 + L = depth(node.left) + # 右儿子为根的子树的深度 + R = depth(node.right) + # 计算d_node即L+R+1 并更新ans + self.ans = max(self.ans, L+R+1) + # 返回该节点为根的子树的深度 + return max(L, R) + 1 + + depth(root) + return self.ans - 1 + +作者:LeetCode-Solution +链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/ +来源:力扣(LeetCode) +著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + + diff --git a/source/_posts/2020-03-25-leetcode-836.md b/source/_posts/2020-03-25-leetcode-836.md new file mode 100644 index 0000000..77d82f8 --- /dev/null +++ b/source/_posts/2020-03-25-leetcode-836.md @@ -0,0 +1,33 @@ +--- +title: leetcode-836 +date: 2020-03-25 22:41:25 +tags: +categories: leetcode +--- + +### 836. 矩形重叠 + +[题目](https://leetcode-cn.com/problems/rectangle-overlap/) + + + + + + + +看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。 + + + +```python +class Solution: + def isRectangleOverlap(self, rec1, rec2) -> bool: + return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0])) + and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]))) + +s = Solution() +s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3]) + +#40 ms 13.7 MB +``` + diff --git a/source/_posts/2020-03-26-leetcode-876.md b/source/_posts/2020-03-26-leetcode-876.md new file mode 100644 index 0000000..0bb9a44 --- /dev/null +++ b/source/_posts/2020-03-26-leetcode-876.md @@ -0,0 +1,67 @@ +--- +title: leetcode-876 +date: 2020-03-26 21:18:41 +tags: +categories: leetcode +--- + +### 876. 链表的中间结点 + + + +[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/) + + + + + + + +思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。 + + + +```python +# Definition for singly-linked list. +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + +class Solution: + def middleNode(self, head: ListNode) -> ListNode: + l = [] + n = head + while n.next: + l.append(n) + n = n.next + l.append(n) + return l[len(l)//2] + + #44 ms 13.7 MB +``` + + + +看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。 + + + +```python +class Solution: + def middleNode(self, head: ListNode) -> ListNode: + slow = fast = head + while fast and fast.next: + slow = slow.next + fast = fast.next.next + return slow + +作者:LeetCode-Solution +链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/ +来源:力扣(LeetCode) +著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + + + + diff --git a/source/_posts/2020-03-29-leetcode-1013.md b/source/_posts/2020-03-29-leetcode-1013.md new file mode 100644 index 0000000..9634b17 --- /dev/null +++ b/source/_posts/2020-03-29-leetcode-1013.md @@ -0,0 +1,45 @@ +--- +title: leetcode-1013 +date: 2020-03-29 21:09:22 +tags: +categories: leetcode +--- + +### 1013. 将数组分成和相等的三个部分 + +[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/) + + + + + + + +因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。 + + + +```python +class Solution: + def canThreePartsEqualSum(self, A) -> bool: + if not A: + return False + sa = sum(A) + if sa % 3: + return False + s = sa // 3 + s1 = 0 + s2 = 0 + + + for i in range(len(A)): + s1 += A[i] + if s1 == s and (i+1) < len(A): + for j in range(len(A[i+1:])): + s2 += A[i+1+j] + if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s: + return True + return False +#60 ms 18.7 MB +``` + diff --git a/source/_posts/2020-03-29-leetcode-914.md b/source/_posts/2020-03-29-leetcode-914.md new file mode 100644 index 0000000..16f2556 --- /dev/null +++ b/source/_posts/2020-03-29-leetcode-914.md @@ -0,0 +1,51 @@ +--- +title: leetcode-914 +date: 2020-03-29 22:41:09 +tags: +categories: leetcode +--- + +### 914. 卡牌分组 + +[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/) + + + + + + + +将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。 + + + +```python +class Solution: + def hasGroupsSizeX(self, deck) -> bool: + dc = {} + max_d = 0 + for d in deck: + if d not in dc: + dc[d] = 0 + dc[d] += 1 + if max_d < d: + max_d = d + if max_d < dc[d]: + max_d = dc[d] + has_x = True + if max_d == 1: + max_d = 2 + + for i in range(2, max_d + 1): + has_x = True + for k,v in dc.items(): + if v % i: + has_x = False + break + if has_x and i >= 2: + return True + return False + +#56 ms 13.8 MB +``` + diff --git a/source/_posts/2020-03-30-leetcode-1071.md b/source/_posts/2020-03-30-leetcode-1071.md new file mode 100644 index 0000000..8a7c6ed --- /dev/null +++ b/source/_posts/2020-03-30-leetcode-1071.md @@ -0,0 +1,59 @@ +--- +title: leetcode-1071 +date: 2020-03-30 22:03:01 +tags: +categories: leetcode +--- + +### 1071. 字符串的最大公因子 + +[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/) + + + + + + + +如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。 + + + +```python +class Solution: + def gcdOfStrings(self, str1: str, str2: str) -> str: + if str1[0] != str2[0]: + return '' + + a = len(str1) + b = len(str2) + print(a, b) + if a < b: + str1, str2 = str2, str1 + a = len(str1) + b = len(str2) + + if not a%b: + for x in range(0, a//b): + if str1[x*b:(x+1)*b] != str2: + return '' + return str2 + else: + for x in range(b, 0, -1): + print(x) + if x==b or b%x or a%x: + continue + for y in range(0, b//x): + if str2[y*x:(y+1)*x] != str2[b-x:b]: + return '' + for y in range(0, a//x): + if str1[y*x:(y+1)*x] != str2[0:x]: + return '' + return str2[0:x] +# 44 ms 13.9 MB +``` + + + +官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。 + diff --git a/source/_posts/2020-03-30-leetcode-999.md b/source/_posts/2020-03-30-leetcode-999.md new file mode 100644 index 0000000..57d9a73 --- /dev/null +++ b/source/_posts/2020-03-30-leetcode-999.md @@ -0,0 +1,71 @@ +--- +title: leetcode-999 +date: 2020-03-30 21:03:25 +tags: +categories: leetcode +--- + + +### 999. 可以被一步捕获的棋子数 + +[题目](https://leetcode-cn.com/problems/available-captures-for-rook/) + + + + + + + +遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。 + + + +```python +class Solution: + def numRookCaptures(self, board) -> int: + i = j = 0 + for row in board: + if 'R' in row: + break + i += 1 + j = row.index('R') + count = 0 + # right + for x in range(j + 1, 8): + if row[x] == 'p': + count += 1 + break + if row[x] == 'B': + break + # left + for x in range(j, 0, -1): + if row[x] == 'p': + count += 1 + break + if row[x] == 'B': + break + # up + for x in range(i, 0, -1): + if board[x][j] == 'p': + count += 1 + break + if board[x][j] == 'B': + break + # down + for x in range(i+1, 8): + if board[x][j] == 'p': + count += 1 + break + if board[x][j] == 'B': + break + + return count + +#36 ms 13.6 MB + +``` + + + +问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。 + diff --git a/source/_posts/2020-04-01-leetcode-1103.md b/source/_posts/2020-04-01-leetcode-1103.md new file mode 100644 index 0000000..a1bd225 --- /dev/null +++ b/source/_posts/2020-04-01-leetcode-1103.md @@ -0,0 +1,55 @@ +--- +title: leetcode-1103 +date: 2020-04-01 11:22:20 +tags: +categories: leetcode +mathjax: true +--- + +### 1103. 分糖果 II + +[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/) + + + + + + + +小学奥数题。主要思路就是等差数列求和 $\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。 + + + +```python +class Solution: + def distributeCandies(self, candies: int, num_people: int): + total = 0 + i = 0 + # import ipdb; ipdb.set_trace() + while total <= candies: + t = (num_people*i)*num_people + int((1+num_people)*num_people/2) + if total + t <= candies: + total += t + i += 1 + else: + break + remaining = candies - total + print(total, remaining, i) + l = [] + for n in range(1, num_people+1): + if not total: + current_candy = n + else: + current_candy = n+i*num_people + + n_count = int((0+(i-1))*(i)/2) + print(current_candy, n_count) + if remaining >= current_candy: + l.append(n_count*num_people + n*i + current_candy) + remaining -= current_candy + else: + l.append(n_count*num_people + n*i + remaining) + remaining = 0 + return l +# 28 ms 13.7 MB, +``` diff --git a/source/_posts/2020-04-01-leetcode-1160.md b/source/_posts/2020-04-01-leetcode-1160.md new file mode 100644 index 0000000..fae8842 --- /dev/null +++ b/source/_posts/2020-04-01-leetcode-1160.md @@ -0,0 +1,38 @@ +--- +title: leetcode-1160 +date: 2020-04-01 00:18:48 +tags: +categories: leetcode +--- + + +### 1160. 拼写单词 + +[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/) + + + + + + + +利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word + +```python +class Solution: + def countCharacters(self, words, chars: str) -> int: + + words_ = '' + for w in words: + lchars = list(chars) + try: + for l in w: + lchars.remove(l) + except: + continue + words_ += w + + return len(words_) +# 152 ms 14.1 MB +``` + diff --git a/source/_posts/2020-04-01-leetcode-compress-string-lcci.md b/source/_posts/2020-04-01-leetcode-compress-string-lcci.md new file mode 100644 index 0000000..3427631 --- /dev/null +++ b/source/_posts/2020-04-01-leetcode-compress-string-lcci.md @@ -0,0 +1,41 @@ +--- +title: leetcode-compress-string-lcci +date: 2020-04-01 15:51:22 +tags: +categories: leetcode +--- + +### 面试题 01.06. 字符串压缩 + +[题目](https://leetcode-cn.com/problems/compress-string-lcci/) + + + + + +遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。 + + + +```python +class Solution: + def compressString(self, S: str) -> str: + if not S: + return S + c = '' + prev = S[0] + p_len = 1 + for w in S[1:]: + if w != prev: + c += '%s%s' % (prev, p_len) + prev = w + p_len = 1 + else: + p_len += 1 + c += '%s%s' % (prev, p_len) + if len(S) > len(c): + return c + return S +# 52 ms 13.8 MB +``` + diff --git a/source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md b/source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md new file mode 100644 index 0000000..0223380 --- /dev/null +++ b/source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md @@ -0,0 +1,42 @@ +--- +title: leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof +date: 2020-04-09 22:14:56 +tags: +categories: leetcode +mathjax: true +--- + +### 面试题57 - II. 和为s的连续正数序列 + +[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/) + + + + + + + +又是小学奥数。由等差数列求和公式$\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\sqrt{2×target} + 1$。 + +由小到大遍历 $n$,可以求得首项。 + +```python +import math +class Solution: + def findContinuousSequence(self, target: int): + n = int(math.sqrt(2 * target) + 1) + if n < 2: + return [] + sum_list = [] + a = 0 + for i in range(2, n+1): + a = ((2 * target) / i + 1 - i) / 2 + if a and not a % 1: + a = int(a) + s_ = [] + for j in range(0, i): + s_.append(a + j) + sum_list.append(s_) + return sorted(sum_list) + # 60 ms 13.7 MB +``` diff --git a/source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md b/source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md new file mode 100644 index 0000000..55a0fcb --- /dev/null +++ b/source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md @@ -0,0 +1,47 @@ +--- +title: leetcode-the-masseuse-lcci +date: 2020-04-09 00:35:26 +tags: +categories: leetcode +mathjax: true +--- + +### 面试题 17.16. 按摩师 + +[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/) + + + + + + + +一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。 + + + +那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$ + +不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$ + +最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$ + + + +```python +class Solution: + def massage(self, nums) -> int: + if not nums: + return 0 + n = len(nums) + not_choose = 0 + choose = 0 + for n in nums: + not_choose, choose = max(not_choose, choose), not_choose+n + return max(not_choose, choose) + # 52 ms 13.6 MB +``` + + + +这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。 diff --git a/source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md b/source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md new file mode 100644 index 0000000..680eb9c --- /dev/null +++ b/source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md @@ -0,0 +1,115 @@ +--- +title: leetcode-add-two-numbers-ii +date: 2020-04-14 23:22:39 +tags: +categories: leetcode +--- + +### 445. 两数相加 II + +[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/) + + + + + + + +看到顺序的链表就想到用倒序链表的方法做,折腾了半天 + + + +```python +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + +class Solution: + def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: + def _reverse(l): + if l.next: + last = _reverse(l.next) + l.next.next = l + l.next = None + return last + return l + + l1e = _reverse(l1) + l2e = _reverse(l2) + new_l = ListNode(0) + head = new_l + c = 0 + import ipdb; ipdb.set_trace() + while l1e and l2e: + new_val = l1e.val + l2e.val + if c==1: + new_val += 1 + c = 0 + if new_val >= 10: + new_val -= 10 + c = 1 + + new_l.val = new_val + next_n = None + if l1e.next and l2e.next or c: + next_n = ListNode(c) + new_l.next = next_n + new_l = next_n + l1e = l1e.next + l2e = l2e.next + if l2e: + l1e = l2e + if not l1e and c: + l1e = ListNode(0) + while l1e: + new_l.val = l1e.val + new_l.val += c + c = 0 + if new_l.val >= 10: + c = 1 + new_l.val -= 10 + l1e = l1e.next + if l1e: + new_l.next = ListNode(0) + new_l = new_l.next + else: + new_l.next = ListNode(1) + + return _reverse(head) + + # 84 ms 13.9 MB +``` + +最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。 + +```python +class Solution: + def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: + s1, s2 = [], [] + while l1: + s1.append(l1.val) + l1 = l1.next + while l2: + s2.append(l2.val) + l2 = l2.next + ans = None + carry = 0 + while s1 or s2 or carry != 0: + a = 0 if not s1 else s1.pop() + b = 0 if not s2 else s2.pop() + cur = a + b + carry + carry = cur // 10 + cur %= 10 + curnode = ListNode(cur) + curnode.next = ans + ans = curnode + return ans + +作者:LeetCode-Solution +链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/ +来源:力扣(LeetCode) +著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + +不过就执行效率来看差不多。 diff --git a/source/_posts/2020-04-14-leetcode-design-twitter.md b/source/_posts/2020-04-14-leetcode-design-twitter.md new file mode 100644 index 0000000..110aa46 --- /dev/null +++ b/source/_posts/2020-04-14-leetcode-design-twitter.md @@ -0,0 +1,83 @@ +--- +title: leetcode-design-twitter +date: 2020-04-14 16:11:41 +tags: +categories: leetcode +--- + +### 355. 设计推特 + +[题目](https://leetcode-cn.com/problems/design-twitter/) + + + + + +做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 `twitterId` 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。 + +主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。 + + + +```python +class Twitter: + + def __init__(self): + """ + Initialize your data structure here. + """ + self.tweets = {} + self.followers = {} + self._tid = 0 + + + def postTweet(self, userId: int, tweetId: int) -> None: + """ + Compose a new tweet. + """ + if not self.tweets.get(userId): + self.tweets[userId] = [] + self.tweets[userId].append((self._tid, tweetId)) + self._tid += 1 + + + def getNewsFeed(self, userId: int) : + """ + Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent. + """ + foers = self.followers.get(userId, set()) + foers = foers.union((userId,)) + tweets = [] + for fo in foers: + tweets.extend(self.tweets.get(fo, [])[-10:]) + return [tw[1] for tw in sorted(tweets, reverse=True)[:10]] + + + def follow(self, followerId: int, followeeId: int) -> None: + """ + Follower follows a followee. If the operation is invalid, it should be a no-op. + """ + if not self.followers.get(followerId): + self.followers[followerId] = set() + self.followers[followerId].add(followeeId) + + + def unfollow(self, followerId: int, followeeId: int) -> None: + """ + Follower unfollows a followee. If the operation is invalid, it should be a no-op. + """ + if not self.followers.get(followerId): + self.followers[followerId] = set() + if followeeId in self.followers[followerId]: + self.followers[followerId].remove(followeeId) + +#100 ms 19.2 MB + +# Your Twitter object will be instantiated and called as such: +# obj = Twitter() +# obj.postTweet(userId,tweetId) +# param_2 = obj.getNewsFeed(userId) +# obj.follow(followerId,followeeId) +# obj.unfollow(followerId,followeeId) +``` + diff --git a/source/_posts/2020-04-16-leetcode-01-matrix.md b/source/_posts/2020-04-16-leetcode-01-matrix.md new file mode 100644 index 0000000..dca4cdb --- /dev/null +++ b/source/_posts/2020-04-16-leetcode-01-matrix.md @@ -0,0 +1,47 @@ +--- +title: leetcode-01-matrix +date: 2020-04-16 12:26:34 +tags: +categories: leetcode +--- + +### 542. 01 矩阵 + +[题目](https://leetcode-cn.com/problems/01-matrix/) + + + + + + + +想了两种思路 + +1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。 + + ```python + class Solution: + def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]: + m, n = len(matrix), len(matrix[0]) + dist = [[0] * n for _ in range(m)] + zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0] + # 将所有的 0 添加进初始队列中 + q = collections.deque(zeroes_pos) + seen = set(zeroes_pos) + + # 广度优先搜索 + while q: + i, j = q.popleft() + for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]: + if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen: + dist[ni][nj] = dist[i][j] + 1 + q.append((ni, nj)) + seen.add((ni, nj)) + + return dist + ``` + + + +2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。 + diff --git a/source/_posts/2020-04-16-leetcode-merge-intervals.md b/source/_posts/2020-04-16-leetcode-merge-intervals.md new file mode 100644 index 0000000..aaf5cad --- /dev/null +++ b/source/_posts/2020-04-16-leetcode-merge-intervals.md @@ -0,0 +1,50 @@ +--- +title: leetcode-merge-intervals +date: 2020-04-16 19:22:26 +tags: +categories: leetcode +--- + + +### 56. 合并区间 + + + +[题目](https://leetcode-cn.com/problems/merge-intervals/) + + + + + + + +首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。 + + + +```python +class Solution: + def merge(self, intervals): + if not intervals: + return [] + intervals.sort() + merged = [] + l = len(intervals) + m = intervals[0] + for x in range(l-1): + j = intervals[x+1] + if m[1] >= j[0]: + if m[1] <= j[1]: + m = [m[0], j[1]] + else: + continue + else: + merged.append(m) + m = j + if m: + merged.append(m) + return merged +``` + + + diff --git a/source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md b/source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md new file mode 100644 index 0000000..c0c95a2 --- /dev/null +++ b/source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md @@ -0,0 +1,55 @@ +--- +title: leetcode-string-to-integer-atoi +date: 2020-04-16 19:50:10 +tags: +categories: leetcode +--- + +### 8. 字符串转换整数 (atoi) + +[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/) + + + + + + + +没什么好说的,注意各种情况,识别到数字之后就一直要是数字。 + + + +```python +class Solution: + def myAtoi(self, str: str) -> int: + p = '' + str = str.lstrip() + n = '' + min_int = -2**31 + max_int = 2**31-1 + isnumeric = False + for x in str: + if not isnumeric and x == '-': + p = '-' + isnumeric = True + continue + if not isnumeric and x == '+': + isnumeric = True + continue + if x.isnumeric(): + n += x + isnumeric = True + else: + break + if not n: + return 0 + if int(n) > max_int: + if p: + return min_int + else: + return max_int + p += n + return int(p) +# 32 ms 13.6 MB +``` + diff --git a/source/_posts/2020-04-21-leetcode-number-of-islands.md b/source/_posts/2020-04-21-leetcode-number-of-islands.md new file mode 100644 index 0000000..36fdd8a --- /dev/null +++ b/source/_posts/2020-04-21-leetcode-number-of-islands.md @@ -0,0 +1,49 @@ +--- +title: leetcode-number-of-islands +date: 2020-04-21 12:55:17 +tags: +categories: leetcode +--- + +### 200. 岛屿数量 + + + +[题目](https://leetcode-cn.com/problems/number-of-islands/) + + + + + + + +这种矩阵题现在第一反应就是用[广度优先搜索][0]做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。 + + + +```python +import collections +class Solution: + def numIslands(self, grid) -> int: + rows = len(grid) + if not rows: + return 0 + cols = len(grid[0]) + islands = 0 + for r in range(rows): + for l in range(cols): + if grid[r][l] == '1': + islands += 1 + grid[r][l] = '0' + neighbors = collections.deque([(r, l)]) + while neighbors: + x, y = neighbors.popleft() + for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]: + if 0<=x_ + app\ + static\ + templates\ + __init__.py + views.py + tmp\ + run.py +``` + +Then start to write the template (file `app/templates/index.html`): + +``` html + + + + {{ title }} - microblog + + + +

Hello, {{ user.nickname }}!

+ + + +``` + +Now let's write the view function that uses this template (file `app/views.py`): + +``` python +from flask import render_template +from app import app + +@app.route('/') +@app.route('/index') +def index(): + user = {'nickname': 'ching'} # fake user + return render_template('index.html', + title='Home', + user=user) +``` + +`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine. + diff --git a/source/_posts/Flask-Day-2.md b/source/_posts/Flask-Day-2.md new file mode 100644 index 0000000..5edbbda --- /dev/null +++ b/source/_posts/Flask-Day-2.md @@ -0,0 +1,80 @@ +--- +title: Flask Day 2 +date: 2016-02-16 22:45:06 +--- + +To handle web forms we use [Flask-WTF ](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`): + +``` python +WTF_CSRF_ENABLED = True +SECRET_KEY = 'you-will-never-guess' +``` + +And then you need to use this config (file `app/__init__.py`): + +``` python +from flask import Flask + +app = Flask(__name__) +app.config.from_object('config') + +from app import views +``` + +Let's build a simple form (file `app/forms.app`): + +``` python +from flask.ext.wtf import Form +from wtforms import StringField, BooleanField +from wtforms.validators import DataRequired + +class LoginForm(Form): + openid = StringField('openid', validators=[DataRequired()]) + remember_me = BooleanField('remember_me', default=False) +``` + +The `DataRequired()` is a validator that checks the field is empty or not. + +After that, we need a HTML page to show the form (file `app/templates/login.html`): + +``` html + +{% extends "base.html" %} + +{% block content %} +

Sign In

+
+ {{ form.hidden_tag() }} +

+ Please enter your OpenID:
+ {{ form.openid(size=80) }}
+

+

{{ form.remember_me }} Remember Me

+

+
+{% endblock %} +``` + + + +The final step is to code a view function that renders the template and receiving data from form (file `app/views.py`): + +``` python +from flask import render_template, flash, redirect +from app import app +from .forms import LoginForm + +# index view function suppressed for brevity + +app.route('/login', methods=['GET', 'POST']) +def login(): + form = LoginForm() + if form.validate_on_submit(): + flash('Login requested for OpenID="%s", remember_me=%s' % + (form.openid.data, str(form.remember_me.data))) + return redirect('/index') + return render_template('login.html', + title='Sign In', + form=form) +``` + diff --git a/source/_posts/Postgresql Partitioning.md b/source/_posts/Postgresql Partitioning.md new file mode 100644 index 0000000..28b9cf3 --- /dev/null +++ b/source/_posts/Postgresql Partitioning.md @@ -0,0 +1,42 @@ +--- +title: Postgresql Partitioning +date: 2019-03-12 00:08:48 +tags: +--- + +`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces. + +Currently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set. + +There are two forms of partitioning can be implemented in PostgreSQL: + +* Range Partitioning + + ​ The table is partitioning into "range" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers. + +* List Partitioning + + ​ The table is partitioned by explicitly listing which key values appear in each partition. + +### Implementing Partitioning + +1. Create the "master" / "parent" table, from which all the partitions will inherit. + + ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either. + +2. Create "child" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. + +3. Add table constraints to the partition tables to define the allowed key values in each partitions. + + ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. + +4. Create indexes on column(s) for each partitions. + +5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition. + +6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired. + +### Trigger + +As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed. + diff --git a/source/_posts/TastyPie-Note-1.md b/source/_posts/TastyPie-Note-1.md new file mode 100644 index 0000000..afe04f2 --- /dev/null +++ b/source/_posts/TastyPie-Note-1.md @@ -0,0 +1,44 @@ +--- +title: TastyPie Note 1 +date: 2016-05-10 17:00:00 +--- + +### Flow Through The Request/Response Cycle + +Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself. + +Walking through what a GET request to a list endpoint looks like: + +- The `Resource.urls` are checked by Django's url resolvers. + +- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors. + +- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`. + +- `dispatch` does a bunch of havy lifting. It ensures: + + - the requested HTTP method is in `allowed_methos` (`method_check`). + - the class has a method that can handle the request(`get_list`) + - the user is authenticated(`is_authenticated`) + - the user has no exceeded their throttle(`throttle_check`). + + At this point, `dispatch` actually calls the requested method (`get_list`). + +- `get_list` does the actual work of API. It does: + + - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it. + - It then sorts the objects based on user input (`ModelResource.apply_sorting`). + - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized. + - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports. + - Finally, it calls `Resource.create_response`. + +- `create_response` is a shortcut method that: + + - Determines the desired response format (`Resource.determine_format`). + - Serializes the data given to it in the proper format. + - Returns a Django `HttpResponse` (200 OK) with the serialized data. + +- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out). + + + diff --git a/source/_posts/Tastypie.md b/source/_posts/Tastypie.md new file mode 100644 index 0000000..1df0f9b --- /dev/null +++ b/source/_posts/Tastypie.md @@ -0,0 +1,38 @@ +--- +title: Tastypie +date: 2016-05-04 12:02:00 +--- + +#### Resources in Tastypie + +Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response. + + + +Understanding the process of creating a resource. + +1. Import ModelResource from Tastypie. +2. Import models from services app +3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. + +Add API URL in the urls.py of app. + + + +#### Dehydrating the JSON data + +![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800) + + + +Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods. + +##### Dehydrate_field method + +This `dehydrate_field` is uesd to modify field on the response JSON. + +##### Dehydrate method + +Dehydrate method is useful for aadding additional fields to bundle (response data). + +Similarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods. \ No newline at end of file diff --git a/source/_posts/first-post.md b/source/_posts/first-post.md new file mode 100644 index 0000000..01aa9d0 --- /dev/null +++ b/source/_posts/first-post.md @@ -0,0 +1,9 @@ +--- +title: First Post +date: 2016-02-12 18:00:00 +--- + +This is the very first post I wrote, + +with [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/). + diff --git a/themes/apollo b/themes/apollo new file mode 160000 index 0000000..d09de66 --- /dev/null +++ b/themes/apollo @@ -0,0 +1 @@ +Subproject commit d09de66c52d7e3eccbc909f86e96919c54ce78ff diff --git a/themes/cactus b/themes/cactus new file mode 160000 index 0000000..e893629 --- /dev/null +++ b/themes/cactus @@ -0,0 +1 @@ +Subproject commit e8936294b7d09234ecb61bbdcd337b59e67fd3f0 diff --git a/themes/landscape/.npmignore b/themes/landscape/.npmignore new file mode 100644 index 0000000..6e3a08a --- /dev/null +++ b/themes/landscape/.npmignore @@ -0,0 +1,3 @@ +.DS_Store +node_modules +tmp \ No newline at end of file diff --git a/themes/landscape/Gruntfile.js b/themes/landscape/Gruntfile.js new file mode 100644 index 0000000..59fd5df --- /dev/null +++ b/themes/landscape/Gruntfile.js @@ -0,0 +1,46 @@ +module.exports = function(grunt){ + grunt.initConfig({ + gitclone: { + fontawesome: { + options: { + repository: 'https://github.com/FortAwesome/Font-Awesome.git', + directory: 'tmp/fontawesome' + }, + }, + fancybox: { + options: { + repository: 'https://github.com/fancyapps/fancyBox.git', + directory: 'tmp/fancybox' + } + } + }, + copy: { + fontawesome: { + expand: true, + cwd: 'tmp/fontawesome/fonts/', + src: ['**'], + dest: 'source/css/fonts/' + }, + fancybox: { + expand: true, + cwd: 'tmp/fancybox/source/', + src: ['**'], + dest: 'source/fancybox/' + } + }, + _clean: { + tmp: ['tmp'], + fontawesome: ['source/css/fonts'], + fancybox: ['source/fancybox'] + } + }); + + require('load-grunt-tasks')(grunt); + + grunt.renameTask('clean', '_clean'); + + grunt.registerTask('fontawesome', ['gitclone:fontawesome', 'copy:fontawesome', '_clean:tmp']); + grunt.registerTask('fancybox', ['gitclone:fancybox', 'copy:fancybox', '_clean:tmp']); + grunt.registerTask('default', ['gitclone', 'copy', '_clean:tmp']); + grunt.registerTask('clean', ['_clean']); +}; \ No newline at end of file diff --git a/themes/landscape/LICENSE b/themes/landscape/LICENSE new file mode 100644 index 0000000..9ce4d32 --- /dev/null +++ b/themes/landscape/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2013 Tommy Chen + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/themes/landscape/README.md b/themes/landscape/README.md new file mode 100644 index 0000000..8295fbe --- /dev/null +++ b/themes/landscape/README.md @@ -0,0 +1,111 @@ +# Landscape + +A brand new default theme for [Hexo]. + +- [Preview](http://hexo.io/hexo-theme-landscape/) + +## Installation + +### Install + +``` bash +$ git clone https://github.com/hexojs/hexo-theme-landscape.git themes/landscape +``` + +**Landscape requires Hexo 2.4 and above.** + +### Enable + +Modify `theme` setting in `_config.yml` to `landscape`. + +### Update + +``` bash +cd themes/landscape +git pull +``` + +## Configuration + +``` yml +# Header +menu: + Home: / + Archives: /archives +rss: /atom.xml + +# Content +excerpt_link: Read More +fancybox: true + +# Sidebar +sidebar: right +widgets: +- category +- tag +- tagcloud +- archives +- recent_posts + +# Miscellaneous +google_analytics: +favicon: /favicon.png +twitter: +google_plus: +``` + +- **menu** - Navigation menu +- **rss** - RSS link +- **excerpt_link** - "Read More" link at the bottom of excerpted articles. `false` to hide the link. +- **fancybox** - Enable [Fancybox] +- **sidebar** - Sidebar style. You can choose `left`, `right`, `bottom` or `false`. +- **widgets** - Widgets displaying in sidebar +- **google_analytics** - Google Analytics ID +- **favicon** - Favicon path +- **twitter** - Twiiter ID +- **google_plus** - Google+ ID + +## Features + +### Fancybox + +Landscape uses [Fancybox] to showcase your photos. You can use Markdown syntax or fancybox tag plugin to add your photos. + +``` +![img caption](img url) + +{% fancybox img_url [img_thumbnail] [img_caption] %} +``` + +### Sidebar + +You can put your sidebar in left side, right side or bottom of your site by editing `sidebar` setting. + +Landscape provides 5 built-in widgets: + +- category +- tag +- tagcloud +- archives +- recent_posts + +All of them are enabled by default. You can edit them in `widget` setting. + +## Development + +### Requirements + +- [Grunt] 0.4+ +- Hexo 2.4+ + +### Grunt tasks + +- **default** - Download [Fancybox] and [Font Awesome]. +- **fontawesome** - Only download [Font Awesome]. +- **fancybox** - Only download [Fancybox]. +- **clean** - Clean temporarily files and downloaded files. + +[Hexo]: http://zespia.tw/hexo/ +[Fancybox]: http://fancyapps.com/fancybox/ +[Font Awesome]: http://fontawesome.io/ +[Grunt]: http://gruntjs.com/ diff --git a/themes/landscape/_config.yml b/themes/landscape/_config.yml new file mode 100644 index 0000000..4c1bb96 --- /dev/null +++ b/themes/landscape/_config.yml @@ -0,0 +1,36 @@ +# Header +menu: + Home: / + Archives: /archives +rss: /atom.xml + +# Content +excerpt_link: Read More +fancybox: true + +# Sidebar +sidebar: right +widgets: +- category +- tag +- tagcloud +- archive +- recent_posts + +# display widgets at the bottom of index pages (pagination == 2) +index_widgets: +# - category +# - tagcloud +# - archive + +# widget behavior +archive_type: 'monthly' +show_count: false + +# Miscellaneous +google_analytics: +favicon: /favicon.png +twitter: +google_plus: +fb_admins: +fb_app_id: diff --git a/themes/landscape/languages/default.yml b/themes/landscape/languages/default.yml new file mode 100644 index 0000000..3ef7e92 --- /dev/null +++ b/themes/landscape/languages/default.yml @@ -0,0 +1,19 @@ +categories: Categories +search: Search +tags: Tags +tagcloud: Tag Cloud +tweets: Tweets +prev: Prev +next: Next +comment: Comments +archive_a: Archives +archive_b: "Archives: %s" +page: Page %d +recent_posts: Recent Posts +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/nl.yml b/themes/landscape/languages/nl.yml new file mode 100644 index 0000000..568d33e --- /dev/null +++ b/themes/landscape/languages/nl.yml @@ -0,0 +1,20 @@ + +categories: Categorieën +search: Zoeken +tags: Labels +tagcloud: Tag Cloud +tweets: Tweets +prev: Vorige +next: Volgende +comment: Commentaren +archive_a: Archieven +archive_b: "Archieven: %s" +page: Pagina %d +recent_posts: Recente berichten +newer: Nieuwer +older: Ouder +share: Delen +powered_by: Powered by +rss_feed: RSS Feed +category: Categorie +tag: Label diff --git a/themes/landscape/languages/no.yml b/themes/landscape/languages/no.yml new file mode 100644 index 0000000..b997691 --- /dev/null +++ b/themes/landscape/languages/no.yml @@ -0,0 +1,19 @@ +categories: Kategorier +search: Søk +tags: Tags +tagcloud: Tag Cloud +tweets: Tweets +prev: Forrige +next: Neste +comment: Kommentarer +archive_a: Arkiv +archive_b: "Arkiv: %s" +page: Side %d +recent_posts: Siste innlegg +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/ru.yml b/themes/landscape/languages/ru.yml new file mode 100644 index 0000000..625a83c --- /dev/null +++ b/themes/landscape/languages/ru.yml @@ -0,0 +1,19 @@ +categories: Категории +search: Поиск +tags: Метки +tagcloud: Облако меток +tweets: Твиты +prev: Назад +next: Вперед +comment: Комментарии +archive_a: Архив +archive_b: "Архив: %s" +page: Страница %d +recent_posts: Недавние записи +newer: Следующий +older: Предыдущий +share: Поделиться +powered_by: Создано с помощью +rss_feed: RSS-каналы +category: Категория +tag: Метка \ No newline at end of file diff --git a/themes/landscape/languages/zh-CN.yml b/themes/landscape/languages/zh-CN.yml new file mode 100644 index 0000000..51e1321 --- /dev/null +++ b/themes/landscape/languages/zh-CN.yml @@ -0,0 +1,19 @@ +categories: 分类 +search: 搜索 +tags: 标签 +tagcloud: 标签云 +tweets: 推文 +prev: 上一页 +next: 下一页 +comment: 留言 +archive_a: 归档 +archive_b: 归档:%s +page: 第 %d 页 +recent_posts: 最新文章 +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/zh-TW.yml b/themes/landscape/languages/zh-TW.yml new file mode 100644 index 0000000..76d2916 --- /dev/null +++ b/themes/landscape/languages/zh-TW.yml @@ -0,0 +1,19 @@ +categories: 分類 +search: 搜尋 +tags: 標籤 +tagcloud: 標籤雲 +tweets: 推文 +prev: 上一頁 +next: 下一頁 +comment: 留言 +archive_a: 彙整 +archive_b: 彙整:%s +page: 第 %d 頁 +recent_posts: 最新文章 +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/layout/_partial/after-footer.ejs b/themes/landscape/layout/_partial/after-footer.ejs new file mode 100644 index 0000000..3ddfbee --- /dev/null +++ b/themes/landscape/layout/_partial/after-footer.ejs @@ -0,0 +1,24 @@ +<% if (config.disqus_shortname){ %> + +<% } %> + + + +<% if (theme.fancybox){ %> + <%- css('fancybox/jquery.fancybox') %> + <%- js('fancybox/jquery.fancybox.pack') %> +<% } %> + +<%- js('js/script') %> diff --git a/themes/landscape/layout/_partial/archive-post.ejs b/themes/landscape/layout/_partial/archive-post.ejs new file mode 100644 index 0000000..36f2cc3 --- /dev/null +++ b/themes/landscape/layout/_partial/archive-post.ejs @@ -0,0 +1,8 @@ +
+
+
+ <%- partial('post/date', {class_name: 'archive-article-date', date_format: 'MMM D'}) %> + <%- partial('post/title', {class_name: 'archive-article-title'}) %> +
+
+
\ No newline at end of file diff --git a/themes/landscape/layout/_partial/archive.ejs b/themes/landscape/layout/_partial/archive.ejs new file mode 100644 index 0000000..7d7c8ba --- /dev/null +++ b/themes/landscape/layout/_partial/archive.ejs @@ -0,0 +1,33 @@ +<% if (pagination == 2){ %> + <% page.posts.each(function(post){ %> + <%- partial('article', {post: post, index: true}) %> + <% }) %> +<% } else { %> + <% var last; %> + <% page.posts.each(function(post, i){ %> + <% var year = post.date.year(); %> + <% if (last != year){ %> + <% if (last != null){ %> + + <% } %> + <% last = year; %> +
+ +
+ <% } %> + <%- partial('archive-post', {post: post, even: i % 2 == 0}) %> + <% }) %> + <% if (page.posts.length){ %> +
+ <% } %> +<% } %> +<% if (page.total > 1){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/article.ejs b/themes/landscape/layout/_partial/article.ejs new file mode 100644 index 0000000..0f951a9 --- /dev/null +++ b/themes/landscape/layout/_partial/article.ejs @@ -0,0 +1,44 @@ +
+ +
+ <%- partial('post/gallery') %> + <% if (post.link || post.title){ %> +
+ <%- partial('post/title', {class_name: 'article-title'}) %> +
+ <% } %> +
+ <% if (post.excerpt && index){ %> + <%- post.excerpt %> + <% if (theme.excerpt_link){ %> +

+ <%= theme.excerpt_link %> +

+ <% } %> + <% } else { %> + <%- post.content %> + <% } %> +
+ +
+ <% if (!index){ %> + <%- partial('post/nav') %> + <% } %> +
+ +<% if (!index && post.comments && config.disqus_shortname){ %> +
+
+ +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/footer.ejs b/themes/landscape/layout/_partial/footer.ejs new file mode 100644 index 0000000..3aca618 --- /dev/null +++ b/themes/landscape/layout/_partial/footer.ejs @@ -0,0 +1,11 @@ +
+ <% if (theme.sidebar === 'bottom'){ %> + <%- partial('_partial/sidebar') %> + <% } %> +
+ +
+
\ No newline at end of file diff --git a/themes/landscape/layout/_partial/google-analytics.ejs b/themes/landscape/layout/_partial/google-analytics.ejs new file mode 100644 index 0000000..84e75f0 --- /dev/null +++ b/themes/landscape/layout/_partial/google-analytics.ejs @@ -0,0 +1,14 @@ +<% if (theme.google_analytics){ %> + + + +<% } %> diff --git a/themes/landscape/layout/_partial/head.ejs b/themes/landscape/layout/_partial/head.ejs new file mode 100644 index 0000000..5288d16 --- /dev/null +++ b/themes/landscape/layout/_partial/head.ejs @@ -0,0 +1,36 @@ + + + + + <% + var title = page.title; + + if (is_archive()){ + title = __('archive_a'); + + if (is_month()){ + title += ': ' + page.year + '/' + page.month; + } else if (is_year()){ + title += ': ' + page.year; + } + } else if (is_category()){ + title = __('category') + ': ' + page.category; + } else if (is_tag()){ + title = __('tag') + ': ' + page.tag; + } + %> + <% if (title){ %><%= title %> | <% } %><%= config.title %> + + <%- open_graph({twitter_id: theme.twitter, google_plus: theme.google_plus, fb_admins: theme.fb_admins, fb_app_id: theme.fb_app_id}) %> + <% if (theme.rss){ %> + + <% } %> + <% if (theme.favicon){ %> + + <% } %> + <% if (config.highlight.enable){ %> + + <% } %> + <%- css('css/style') %> + <%- partial('google-analytics') %> + diff --git a/themes/landscape/layout/_partial/header.ejs b/themes/landscape/layout/_partial/header.ejs new file mode 100644 index 0000000..aa4aad6 --- /dev/null +++ b/themes/landscape/layout/_partial/header.ejs @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/mobile-nav.ejs b/themes/landscape/layout/_partial/mobile-nav.ejs new file mode 100644 index 0000000..7c1d2af --- /dev/null +++ b/themes/landscape/layout/_partial/mobile-nav.ejs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/category.ejs b/themes/landscape/layout/_partial/post/category.ejs new file mode 100644 index 0000000..db2ed48 --- /dev/null +++ b/themes/landscape/layout/_partial/post/category.ejs @@ -0,0 +1,10 @@ +<% if (post.categories && post.categories.length){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/date.ejs b/themes/landscape/layout/_partial/post/date.ejs new file mode 100644 index 0000000..3f49613 --- /dev/null +++ b/themes/landscape/layout/_partial/post/date.ejs @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/gallery.ejs b/themes/landscape/layout/_partial/post/gallery.ejs new file mode 100644 index 0000000..886c8ec --- /dev/null +++ b/themes/landscape/layout/_partial/post/gallery.ejs @@ -0,0 +1,11 @@ +<% if (post.photos && post.photos.length){ %> +
+
+ <% post.photos.forEach(function(photo, i){ %> + + + + <% }) %> +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/nav.ejs b/themes/landscape/layout/_partial/post/nav.ejs new file mode 100644 index 0000000..720798a --- /dev/null +++ b/themes/landscape/layout/_partial/post/nav.ejs @@ -0,0 +1,22 @@ +<% if (post.prev || post.next){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/tag.ejs b/themes/landscape/layout/_partial/post/tag.ejs new file mode 100644 index 0000000..e0f327f --- /dev/null +++ b/themes/landscape/layout/_partial/post/tag.ejs @@ -0,0 +1,6 @@ +<% if (post.tags && post.tags.length){ %> + <%- list_tags(post.tags, { + show_count: false, + class: 'article-tag' + }) %> +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/title.ejs b/themes/landscape/layout/_partial/post/title.ejs new file mode 100644 index 0000000..69d646f --- /dev/null +++ b/themes/landscape/layout/_partial/post/title.ejs @@ -0,0 +1,15 @@ +<% if (post.link){ %> +

+ +

+<% } else if (post.title){ %> + <% if (index){ %> +

+ <%= post.title %> +

+ <% } else { %> +

+ <%= post.title %> +

+ <% } %> +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/sidebar.ejs b/themes/landscape/layout/_partial/sidebar.ejs new file mode 100644 index 0000000..c1e48e5 --- /dev/null +++ b/themes/landscape/layout/_partial/sidebar.ejs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_widget/archive.ejs b/themes/landscape/layout/_widget/archive.ejs new file mode 100644 index 0000000..a20c58c --- /dev/null +++ b/themes/landscape/layout/_widget/archive.ejs @@ -0,0 +1,8 @@ +<% if (site.posts.length){ %> +
+

<%= __('archive_a') %>

+
+ <%- list_archives({show_count: theme.show_count, type: theme.archive_type}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/category.ejs b/themes/landscape/layout/_widget/category.ejs new file mode 100644 index 0000000..8d9e5e9 --- /dev/null +++ b/themes/landscape/layout/_widget/category.ejs @@ -0,0 +1,8 @@ +<% if (site.categories.length){ %> +
+

<%= __('categories') %>

+
+ <%- list_categories({show_count: theme.show_count}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/recent_posts.ejs b/themes/landscape/layout/_widget/recent_posts.ejs new file mode 100644 index 0000000..7a38547 --- /dev/null +++ b/themes/landscape/layout/_widget/recent_posts.ejs @@ -0,0 +1,14 @@ +<% if (site.posts.length){ %> +
+

<%= __('recent_posts') %>

+
+ +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_widget/tag.ejs b/themes/landscape/layout/_widget/tag.ejs new file mode 100644 index 0000000..ea5fb2c --- /dev/null +++ b/themes/landscape/layout/_widget/tag.ejs @@ -0,0 +1,8 @@ +<% if (site.tags.length){ %> +
+

<%= __('tags') %>

+
+ <%- list_tags({show_count: theme.show_count}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/tagcloud.ejs b/themes/landscape/layout/_widget/tagcloud.ejs new file mode 100644 index 0000000..5feb435 --- /dev/null +++ b/themes/landscape/layout/_widget/tagcloud.ejs @@ -0,0 +1,8 @@ +<% if (site.tags.length){ %> +
+

<%= __('tagcloud') %>

+
+ <%- tagcloud() %> +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/archive.ejs b/themes/landscape/layout/archive.ejs new file mode 100644 index 0000000..52f9b21 --- /dev/null +++ b/themes/landscape/layout/archive.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.archive, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/category.ejs b/themes/landscape/layout/category.ejs new file mode 100644 index 0000000..3ffe252 --- /dev/null +++ b/themes/landscape/layout/category.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.category, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/index.ejs b/themes/landscape/layout/index.ejs new file mode 100644 index 0000000..60a2c68 --- /dev/null +++ b/themes/landscape/layout/index.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: 2, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/layout.ejs b/themes/landscape/layout/layout.ejs new file mode 100644 index 0000000..cf88daf --- /dev/null +++ b/themes/landscape/layout/layout.ejs @@ -0,0 +1,18 @@ +<%- partial('_partial/head') %> + +
+
+ <%- partial('_partial/header', null, {cache: !config.relative_link}) %> +
+
<%- body %>
+ <% if (theme.sidebar && theme.sidebar !== 'bottom'){ %> + <%- partial('_partial/sidebar', null, {cache: !config.relative_link}) %> + <% } %> +
+ <%- partial('_partial/footer', null, {cache: !config.relative_link}) %> +
+ <%- partial('_partial/mobile-nav', null, {cache: !config.relative_link}) %> + <%- partial('_partial/after-footer') %> +
+ + \ No newline at end of file diff --git a/themes/landscape/layout/page.ejs b/themes/landscape/layout/page.ejs new file mode 100644 index 0000000..bea6318 --- /dev/null +++ b/themes/landscape/layout/page.ejs @@ -0,0 +1 @@ +<%- partial('_partial/article', {post: page, index: false}) %> \ No newline at end of file diff --git a/themes/landscape/layout/post.ejs b/themes/landscape/layout/post.ejs new file mode 100644 index 0000000..bea6318 --- /dev/null +++ b/themes/landscape/layout/post.ejs @@ -0,0 +1 @@ +<%- partial('_partial/article', {post: page, index: false}) %> \ No newline at end of file diff --git a/themes/landscape/layout/tag.ejs b/themes/landscape/layout/tag.ejs new file mode 100644 index 0000000..048cdb0 --- /dev/null +++ b/themes/landscape/layout/tag.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.tag, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/package.json b/themes/landscape/package.json new file mode 100644 index 0000000..a11e9f6 --- /dev/null +++ b/themes/landscape/package.json @@ -0,0 +1,12 @@ +{ + "name": "hexo-theme-landscape", + "version": "0.0.1", + "private": true, + "devDependencies": { + "grunt": "~0.4.2", + "load-grunt-tasks": "~0.2.0", + "grunt-git": "~0.2.2", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-copy": "~0.4.1" + } +} diff --git a/themes/landscape/scripts/fancybox.js b/themes/landscape/scripts/fancybox.js new file mode 100644 index 0000000..83f1fdc --- /dev/null +++ b/themes/landscape/scripts/fancybox.js @@ -0,0 +1,24 @@ +var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/; + +/** +* Fancybox tag +* +* Syntax: +* {% fancybox /path/to/image [/path/to/thumbnail] [title] %} +*/ + +hexo.extend.tag.register('fancybox', function(args){ + var original = args.shift(), + thumbnail = ''; + + if (args.length && rUrl.test(args[0])){ + thumbnail = args.shift(); + } + + var title = args.join(' '); + + return '' + + '' + title + '' + '' + + (title ? '' + title + '' : ''); +}); \ No newline at end of file diff --git a/themes/landscape/source/css/_extend.styl b/themes/landscape/source/css/_extend.styl new file mode 100644 index 0000000..96a1817 --- /dev/null +++ b/themes/landscape/source/css/_extend.styl @@ -0,0 +1,63 @@ +$block-caption + text-decoration: none + text-transform: uppercase + letter-spacing: 2px + color: color-grey + margin-bottom: 1em + margin-left: 5px + line-height: 1em + text-shadow: 0 1px #fff + font-weight: bold + +$block + background: #fff + box-shadow: 1px 2px 3px #ddd + border: 1px solid color-border + border-radius: 3px + +$base-style + h1 + font-size: 2em + h2 + font-size: 1.5em + h3 + font-size: 1.3em + h4 + font-size: 1.2em + h5 + font-size: 1em + h6 + font-size: 1em + color: color-grey + hr + border: 1px dashed color-border + strong + font-weight: bold + em, cite + font-style: italic + sup, sub + font-size: 0.75em + line-height: 0 + position: relative + vertical-align: baseline + sup + top: -0.5em + sub + bottom: -0.2em + small + font-size: 0.85em + acronym, abbr + border-bottom: 1px dotted + ul, ol, dl + margin: 0 20px + line-height: line-height + ul, ol + ul, ol + margin-top: 0 + margin-bottom: 0 + ul + list-style: disc + ol + list-style: decimal + dt + font-weight: bold \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/archive.styl b/themes/landscape/source/css/_partial/archive.styl new file mode 100644 index 0000000..90ef053 --- /dev/null +++ b/themes/landscape/source/css/_partial/archive.styl @@ -0,0 +1,80 @@ +.archives-wrap + margin: block-margin 0 + +.archives + clearfix() + +.archive-year-wrap + margin-bottom: 1em + +.archive-year + @extend $block-caption + +.archives + column-gap: 10px + @media mq-tablet + column-count: 2 + @media mq-normal + column-count: 3 + +.archive-article + avoid-column-break() + +.archive-article-inner + @extend $block + padding: 10px + margin-bottom: 15px + +.archive-article-title + text-decoration: none + font-weight: bold + color: color-default + transition: color 0.2s + line-height: line-height + &:hover + color: color-link + +.archive-article-footer + margin-top: 1em + +.archive-article-date + color: color-grey + text-decoration: none + font-size: 0.85em + line-height: 1em + margin-bottom: 0.5em + display: block + +#page-nav + clearfix() + margin: block-margin auto + background: #fff + box-shadow: 1px 2px 3px #ddd + border: 1px solid color-border + border-radius: 3px + text-align: center + color: color-grey + overflow: hidden + a, span + padding: 10px 20px + line-height: 1 + height: 2ex + a + color: color-grey + text-decoration: none + &:hover + background: color-grey + color: #fff + .prev + float: left + .next + float: right + .page-number + display: inline-block + @media mq-mobile + display: none + .current + color: color-default + font-weight: bold + .space + color: color-border \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/article.styl b/themes/landscape/source/css/_partial/article.styl new file mode 100644 index 0000000..46094f9 --- /dev/null +++ b/themes/landscape/source/css/_partial/article.styl @@ -0,0 +1,357 @@ +.article + margin: block-margin 0 + +.article-inner + @extend $block + overflow: hidden + +.article-meta + clearfix() + +.article-date + @extend $block-caption + float: left + +.article-category + float: left + line-height: 1em + color: #ccc + text-shadow: 0 1px #fff + margin-left: 8px + &:before + content: "\2022" + +.article-category-link + @extend $block-caption + margin: 0 12px 1em + +.article-header + padding: article-padding article-padding 0 + +.article-title + text-decoration: none + font-size: 2em + font-weight: bold + color: color-default + line-height: line-height-title + transition: color 0.2s + a&:hover + color: color-link + +.article-entry + @extend $base-style + clearfix() + color: color-default + padding: 0 article-padding + p, table + line-height: line-height + margin: line-height 0 + h1, h2, h3, h4, h5, h6 + font-weight: bold + h1, h2, h3, h4, h5, h6 + line-height: line-height-title + margin: line-height-title 0 + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + ul, ol, dl + margin-top: line-height + margin-bottom: line-height + img, video + max-width: 100% + height: auto + display: block + margin: auto + iframe + border: none + table + width: 100% + border-collapse: collapse + border-spacing: 0 + th + font-weight: bold + border-bottom: 3px solid color-border + padding-bottom: 0.5em + td + border-bottom: 1px solid color-border + padding: 10px 0 + blockquote + font-family: font-serif + font-size: 1.4em + margin: line-height 20px + text-align: center + footer + font-size: font-size + margin: line-height 0 + font-family: font-sans + cite + &:before + content: "—" + padding: 0 0.5em + .pullquote + text-align: left + width: 45% + margin: 0 + &.left + margin-left: 0.5em + margin-right: 1em + &.right + margin-right: 0.5em + margin-left: 1em + .caption + color: color-grey + display: block + font-size: 0.9em + margin-top: 0.5em + position: relative + text-align: center + // http://webdesignerwall.com/tutorials/css-elastic-videos + .video-container + position: relative + padding-top: (9 / 16 * 100)% // 16:9 ratio + height: 0 + overflow: hidden + iframe, object, embed + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + margin-top: 0 + +.article-more-link a + display: inline-block + line-height: 1em + padding: 6px 15px + border-radius: 15px + background: color-background + color: color-grey + text-shadow: 0 1px #fff + text-decoration: none + &:hover + background: color-link + color: #fff + text-decoration: none + text-shadow: 0 1px darken(color-link, 20%) + +.article-footer + clearfix() + font-size: 0.85em + line-height: line-height + border-top: 1px solid color-border + padding-top: line-height + margin: 0 article-padding article-padding + a + color: color-grey + text-decoration: none + &:hover + color: color-default + +.article-tag-list-item + float: left + margin-right: 10px + +.article-tag-list-link + &:before + content: "#" + +.article-comment-link + float: right + &:before + content: "\f075" + font-family: font-icon + padding-right: 8px + +.article-share-link + cursor: pointer + float: right + margin-left: 20px + &:before + content: "\f064" + font-family: font-icon + padding-right: 6px + +#article-nav + clearfix() + position: relative + @media mq-normal + margin: block-margin 0 + &:before + absolute-center(8px) + content: "" + border-radius: 50% + background: color-border + box-shadow: 0 1px 2px #fff + +.article-nav-link-wrap + text-decoration: none + text-shadow: 0 1px #fff + color: color-grey + box-sizing: border-box + margin-top: block-margin + text-align: center + display: block + &:hover + color: color-default + @media mq-normal + width: 50% + margin-top: 0 + +#article-nav-newer + @media mq-normal + float: left + text-align: right + padding-right: 20px + +#article-nav-older + @media mq-normal + float: right + text-align: left + padding-left: 20px + +.article-nav-caption + text-transform: uppercase + letter-spacing: 2px + color: color-border + line-height: 1em + font-weight: bold + #article-nav-newer & + margin-right: -2px + +.article-nav-title + font-size: 0.85em + line-height: line-height + margin-top: 0.5em + +.article-share-box + position: absolute + display: none + background: #fff + box-shadow: 1px 2px 10px rgba(0, 0, 0, 0.2) + border-radius: 3px + margin-left: -145px + overflow: hidden + z-index: 1 + &.on + display: block + +.article-share-input + width: 100% + background: none + box-sizing: border-box + font: 14px font-sans + padding: 0 15px + color: color-default + outline: none + border: 1px solid color-border + border-radius: 3px 3px 0 0 + height: 36px + line-height: 36px + +.article-share-links + clearfix() + background: color-background + +$article-share-link + width: 50px + height: 36px + display: block + float: left + position: relative + color: #999 + text-shadow: 0 1px #fff + &:before + font-size: 20px + font-family: font-icon + absolute-center(@font-size) + text-align: center + &:hover + color: #fff + +.article-share-twitter + @extend $article-share-link + &:before + content: "\f099" + &:hover + background: color-twitter + text-shadow: 0 1px darken(color-twitter, 20%) + +.article-share-facebook + @extend $article-share-link + &:before + content: "\f09a" + &:hover + background: color-facebook + text-shadow: 0 1px darken(color-facebook, 20%) + +.article-share-pinterest + @extend $article-share-link + &:before + content: "\f0d2" + &:hover + background: color-pinterest + text-shadow: 0 1px darken(color-pinterest, 20%) + +.article-share-google + @extend $article-share-link + &:before + content: "\f0d5" + &:hover + background: color-google + text-shadow: 0 1px darken(color-google, 20%) + +.article-gallery + background: #000 + position: relative + +.article-gallery-photos + position: relative + overflow: hidden + +.article-gallery-img + display: none + max-width: 100% + &:first-child + display: block + &.loaded + position: absolute + display: block + img + display: block + max-width: 100% + margin: 0 auto +/* +$article-gallery-ctrl + position: absolute + top: 0 + height: 100% + width: 60px + color: #fff + text-shadow: 0 0 3px rgba(0, 0, 0, 0.3) + opacity: 0.3 + transition: opacity 0.2s + cursor: pointer + &:hover + opacity: 0.8 + &:before + font-size: 30px + font-family: font-icon + position: absolute + top: 50% + margin-top: @font-size * -0.5 + +.article-gallery-prev + @extend $article-gallery-ctrl + left: 0 + &:before + content: "\f053" + left: 15px + +.article-gallery-next + @extend $article-gallery-ctrl + right: 0 + &:before + content: "\f054" + right: 15px*/ \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/comment.styl b/themes/landscape/source/css/_partial/comment.styl new file mode 100644 index 0000000..296b7dd --- /dev/null +++ b/themes/landscape/source/css/_partial/comment.styl @@ -0,0 +1,9 @@ +#comments + background: #fff + box-shadow: 1px 2px 3px #ddd + padding: article-padding + border: 1px solid color-border + border-radius: 3px + margin: block-margin 0 + a + color: color-link \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/footer.styl b/themes/landscape/source/css/_partial/footer.styl new file mode 100644 index 0000000..fe2fd24 --- /dev/null +++ b/themes/landscape/source/css/_partial/footer.styl @@ -0,0 +1,14 @@ +#footer + background: color-footer-background + padding: 50px 0 + border-top: 1px solid color-border + color: color-grey + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + +#footer-info + line-height: line-height + font-size: 0.85em \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/header.styl b/themes/landscape/source/css/_partial/header.styl new file mode 100644 index 0000000..d18ebc8 --- /dev/null +++ b/themes/landscape/source/css/_partial/header.styl @@ -0,0 +1,165 @@ +#header + height: banner-height + position: relative + border-bottom: 1px solid color-border + &:before, &:after + content: "" + position: absolute + left: 0 + right: 0 + height: 40px + &:before + top: 0 + background: linear-gradient(rgba(0, 0, 0, 0.2), transparent) + &:after + bottom: 0 + background: linear-gradient(transparent, rgba(0, 0, 0, 0.2)) + +#header-outer + height: 100% + position: relative + +#header-inner + position: relative + overflow: hidden + +#banner + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + background: url(banner-url) center #000 + background-size: cover + z-index: -1 + +#header-title + text-align: center + height: logo-size + position: absolute + top: 50% + left: 0 + margin-top: logo-size * -0.5 + +$logo-text + text-decoration: none + color: #fff + font-weight: 300 + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) + +#logo + @extend $logo-text + font-size: logo-size + line-height: logo-size + letter-spacing: 2px + +#subtitle + @extend $logo-text + font-size: subtitle-size + line-height: subtitle-size + letter-spacing: 1px + +#subtitle-wrap + margin-top: subtitle-size + +#main-nav + float: left + margin-left: -15px + +$nav-link + float: left + color: #fff + opacity: 0.6 + text-decoration: none + text-shadow: 0 1px rgba(0, 0, 0, 0.2) + transition: opacity 0.2s + display: block + padding: 20px 15px + &:hover + opacity: 1 + +.nav-icon + @extend $nav-link + font-family: font-icon + text-align: center + font-size: font-size + width: font-size + height: font-size + padding: 20px 15px + position: relative + cursor: pointer + +.main-nav-link + @extend $nav-link + font-weight: 300 + letter-spacing: 1px + @media mq-mobile + display: none + +#main-nav-toggle + display: none + &:before + content: "\f0c9" + @media mq-mobile + display: block + +#sub-nav + float: right + margin-right: -15px + +#nav-rss-link + &:before + content: "\f09e" + +#nav-search-btn + &:before + content: "\f002" + +#search-form-wrap + position: absolute + top: 15px + width: 150px + height: 30px + right: -150px + opacity: 0 + transition: 0.2s ease-out + &.on + opacity: 1 + right: 0 + @media mq-mobile + width: 100% + right: -100% + +.search-form + position: absolute + top: 0 + left: 0 + right: 0 + background: #fff + padding: 5px 15px + border-radius: 15px + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3) + +.search-form-input + border: none + background: none + color: color-default + width: 100% + font: 13px font-sans + outline: none + &::-webkit-search-results-decoration + &::-webkit-search-cancel-button + -webkit-appearance: none + +.search-form-submit + position: absolute + top: 50% + right: 10px + margin-top: -7px + font: 13px font-icon + border: none + background: none + color: #bbb + cursor: pointer + &:hover, &:focus + color: #777 \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/highlight.styl b/themes/landscape/source/css/_partial/highlight.styl new file mode 100644 index 0000000..ccc352c --- /dev/null +++ b/themes/landscape/source/css/_partial/highlight.styl @@ -0,0 +1,156 @@ +// https://github.com/chriskempson/tomorrow-theme +highlight-background = #2d2d2d +highlight-current-line = #393939 +highlight-selection = #515151 +highlight-foreground = #cccccc +highlight-comment = #999999 +highlight-red = #f2777a +highlight-orange = #f99157 +highlight-yellow = #ffcc66 +highlight-green = #99cc99 +highlight-aqua = #66cccc +highlight-blue = #6699cc +highlight-purple = #cc99cc + +$code-block + background: highlight-background + margin: 0 article-padding * -1 + padding: 15px article-padding + border-style: solid + border-color: color-border + border-width: 1px 0 + overflow: auto + color: highlight-foreground + line-height: font-size * line-height + +$line-numbers + color: #666 + font-size: 0.85em + +.article-entry + pre, code + font-family: font-mono + code + background: color-background + text-shadow: 0 1px #fff + padding: 0 0.3em + pre + @extend $code-block + code + background: none + text-shadow: none + padding: 0 + .highlight + @extend $code-block + pre + border: none + margin: 0 + padding: 0 + table + margin: 0 + width: auto + td + border: none + padding: 0 + figcaption + clearfix() + font-size: 0.85em + color: highlight-comment + line-height: 1em + margin-bottom: 1em + a + float: right + .gutter pre + @extend $line-numbers + text-align: right + padding-right: 20px + .line + height: font-size * line-height + .gist + margin: 0 article-padding * -1 + border-style: solid + border-color: color-border + border-width: 1px 0 + background: highlight-background + padding: 15px article-padding 15px 0 + .gist-file + border: none + font-family: font-mono + margin: 0 + .gist-data + background: none + border: none + .line-numbers + @extend $line-numbers + background: none + border: none + padding: 0 20px 0 0 + .line-data + padding: 0 !important + .highlight + margin: 0 + padding: 0 + border: none + .gist-meta + background: highlight-background + color: highlight-comment + font: 0.85em font-sans + text-shadow: 0 0 + padding: 0 + margin-top: 1em + margin-left: article-padding + a + color: color-link + font-weight: normal + &:hover + text-decoration: underline + +pre + .comment + .title + color: highlight-comment + .variable + .attribute + .tag + .regexp + .ruby .constant + .xml .tag .title + .xml .pi + .xml .doctype + .html .doctype + .css .id + .css .class + .css .pseudo + color: highlight-red + .number + .preprocessor + .built_in + .literal + .params + .constant + color: highlight-orange + .class + .ruby .class .title + .css .rules .attribute + color: highlight-green + .string + .value + .inheritance + .header + .ruby .symbol + .xml .cdata + color: highlight-green + .css .hexcolor + color: highlight-aqua + .function + .python .decorator + .python .title + .ruby .function .title + .ruby .title .keyword + .perl .sub + .javascript .title + .coffeescript .title + color: highlight-blue + .keyword + .javascript .function + color: highlight-purple \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/mobile.styl b/themes/landscape/source/css/_partial/mobile.styl new file mode 100644 index 0000000..eb68b3a --- /dev/null +++ b/themes/landscape/source/css/_partial/mobile.styl @@ -0,0 +1,19 @@ +@media mq-mobile + #mobile-nav + position: absolute + top: 0 + left: 0 + width: mobile-nav-width + height: 100% + background: color-mobile-nav-background + border-right: 1px solid #fff + +@media mq-mobile + .mobile-nav-link + display: block + color: color-grey + text-decoration: none + padding: 15px 20px + font-weight: bold + &:hover + color: #fff diff --git a/themes/landscape/source/css/_partial/sidebar-aside.styl b/themes/landscape/source/css/_partial/sidebar-aside.styl new file mode 100644 index 0000000..838b167 --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar-aside.styl @@ -0,0 +1,27 @@ +#sidebar + @media mq-normal + column(sidebar-column) + +.widget-wrap + margin: block-margin 0 + +.widget-title + @extend $block-caption + +.widget + color: color-sidebar-text + text-shadow: 0 1px #fff + background: color-widget-background + box-shadow: 0 -1px 4px color-widget-border inset + border: 1px solid color-widget-border + padding: 15px + border-radius: 3px + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + ul, ol, dl + ul, ol, dl + margin-left: 15px + list-style: disc \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/sidebar-bottom.styl b/themes/landscape/source/css/_partial/sidebar-bottom.styl new file mode 100644 index 0000000..e2403fd --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar-bottom.styl @@ -0,0 +1,27 @@ +.widget-wrap + margin-bottom: block-margin !important + @media mq-normal + column(main-column) + +.widget-title + color: #ccc + text-transform: uppercase + letter-spacing: 2px + margin-bottom: .5em + line-height: 1em + font-weight: bold + +.widget + color: color-grey + ul, ol + li + display: inline-block + zoom:1 + *display:inline + padding-right: .75em +/* Having problems getting balanced white space between items + li:before + content: " | " + li:first-child:before + content: none + */ diff --git a/themes/landscape/source/css/_partial/sidebar.styl b/themes/landscape/source/css/_partial/sidebar.styl new file mode 100644 index 0000000..e43d66a --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar.styl @@ -0,0 +1,35 @@ +if sidebar is bottom + @import "sidebar-bottom" +else + @import "sidebar-aside" + +.widget + @extend $base-style + line-height: line-height + word-wrap: break-word + font-size: 0.9em + ul, ol + list-style: none + margin: 0 + ul, ol + margin: 0 20px + ul + list-style: disc + ol + list-style: decimal + +.category-list-count +.tag-list-count +.archive-list-count + padding-left: 5px + color: color-grey + font-size: 0.85em + &:before + content: "(" + &:after + content: ")" + +.tagcloud + a + margin-right: 5px + display: inline-block diff --git a/themes/landscape/source/css/_util/grid.styl b/themes/landscape/source/css/_util/grid.styl new file mode 100644 index 0000000..2a14dd2 --- /dev/null +++ b/themes/landscape/source/css/_util/grid.styl @@ -0,0 +1,38 @@ +///////////////// +// Semantic.gs // for Stylus: http://learnboost.github.com/stylus/ +///////////////// + +// Utility function — you should never need to modify this +// _gridsystem-width = (column-width + gutter-width) * columns +gridsystem-width(_columns = columns) + (column-width + gutter-width) * _columns + +// Set @total-width to 100% for a fluid layout +// total-width = gridsystem-width(columns) +total-width = 100% + +////////// +// GRID // +////////// + +body + clearfix() + width: 100% + +row(_columns = columns) + clearfix() + display: block + width: total-width * ((gutter-width + gridsystem-width(_columns)) / gridsystem-width(_columns)) + margin: 0 total-width * (((gutter-width * .5) / gridsystem-width(_columns)) * -1) + +column(x, _columns = columns) + display: inline + float: left + width: total-width * ((((gutter-width + column-width) * x) - gutter-width) / gridsystem-width(_columns)) + margin: 0 total-width * ((gutter-width * .5) / gridsystem-width(_columns)) + +push(offset = 1) + margin-left: total-width * (((gutter-width + column-width) * offset) / gridsystem-width(columns)) + +pull(offset = 1) + margin-right: total-width * (((gutter-width + column-width) * offset) / gridsystem-width(columns)) \ No newline at end of file diff --git a/themes/landscape/source/css/_util/mixin.styl b/themes/landscape/source/css/_util/mixin.styl new file mode 100644 index 0000000..b56f037 --- /dev/null +++ b/themes/landscape/source/css/_util/mixin.styl @@ -0,0 +1,31 @@ +// http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/ +hide-text() + text-indent: 100% + white-space: nowrap + overflow: hidden + +// http://codepen.io/shshaw/full/gEiDt +absolute-center(width, height = width) + // margin: auto + // position: absolute + // top: 50% + // top: 0 + // left: 0 + // bottom: 0 + // right: 0 + // width: width + // height: height + // overflow: auto + width: width + height: height + position: absolute + top: 50% + left: 50% + margin-top: width * -0.5 + margin-left: height * -0.5 + +avoid-column-break() + vendor("column-break-inside", avoid, only: webkit) + page-break-inside: avoid // for firefox + overflow: hidden // fix for firefox + break-inside: avoid-column diff --git a/themes/landscape/source/css/_variables.styl b/themes/landscape/source/css/_variables.styl new file mode 100644 index 0000000..1215bb1 --- /dev/null +++ b/themes/landscape/source/css/_variables.styl @@ -0,0 +1,60 @@ +// Config +support-for-ie = false +vendor-prefixes = webkit moz ms official + +// Colors +color-default = #555 +color-grey = #999 +color-border = #ddd +color-link = #258fb8 +color-background = #eee +color-sidebar-text = #777 +color-widget-background = #ddd +color-widget-border = #ccc +color-footer-background = #262a30 +color-mobile-nav-background = #191919 +color-twitter = #00aced +color-facebook = #3b5998 +color-pinterest = #cb2027 +color-google = #dd4b39 + +// Fonts +font-sans = "Helvetica Neue", Helvetica, Arial, sans-serif +font-serif = Georgia, "Times New Roman", serif +font-mono = "Source Code Pro", Consolas, Monaco, Menlo, Consolas, monospace +font-icon = FontAwesome +font-icon-path = "fonts/fontawesome-webfont" +font-icon-version = "4.0.3" +font-size = 14px +line-height = 1.6em +line-height-title = 1.1em + +// Header +logo-size = 40px +subtitle-size = 16px +banner-height = 300px +banner-url = "images/banner.jpg" + +sidebar = hexo-config("sidebar") + +// Layout +block-margin = 50px +article-padding = 20px +mobile-nav-width = 280px +main-column = 9 +sidebar-column = 3 + +if sidebar and sidebar isnt bottom + _sidebar-column = sidebar-column +else + _sidebar-column = 0 + +// Grids +column-width = 80px +gutter-width = 20px +columns = main-column + _sidebar-column + +// Media queries +mq-mobile = "screen and (max-width: 479px)" +mq-tablet = "screen and (min-width: 480px) and (max-width: 767px)" +mq-normal = "screen and (min-width: 768px)" \ No newline at end of file diff --git a/themes/landscape/source/css/fonts/FontAwesome.otf b/themes/landscape/source/css/fonts/FontAwesome.otf new file mode 100644 index 0000000..8b0f54e Binary files /dev/null and b/themes/landscape/source/css/fonts/FontAwesome.otf differ diff --git a/themes/landscape/source/css/fonts/fontawesome-webfont.eot b/themes/landscape/source/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..7c79c6a Binary files /dev/null and b/themes/landscape/source/css/fonts/fontawesome-webfont.eot differ diff --git a/themes/landscape/source/css/fonts/fontawesome-webfont.svg b/themes/landscape/source/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..45fdf33 --- /dev/null +++ b/themes/landscape/source/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/landscape/source/css/fonts/fontawesome-webfont.ttf b/themes/landscape/source/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..e89738d Binary files /dev/null and b/themes/landscape/source/css/fonts/fontawesome-webfont.ttf differ diff --git a/themes/landscape/source/css/fonts/fontawesome-webfont.woff b/themes/landscape/source/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..8c1748a Binary files /dev/null and b/themes/landscape/source/css/fonts/fontawesome-webfont.woff differ diff --git a/themes/landscape/source/css/images/banner.jpg b/themes/landscape/source/css/images/banner.jpg new file mode 100644 index 0000000..b963e06 Binary files /dev/null and b/themes/landscape/source/css/images/banner.jpg differ diff --git a/themes/landscape/source/css/style.styl b/themes/landscape/source/css/style.styl new file mode 100644 index 0000000..c51f8e4 --- /dev/null +++ b/themes/landscape/source/css/style.styl @@ -0,0 +1,89 @@ +@import "nib" +@import "_variables" +@import "_util/mixin" +@import "_util/grid" + +global-reset() + +input, button + margin: 0 + padding: 0 + &::-moz-focus-inner + border: 0 + padding: 0 + +@font-face + font-family: FontAwesome + font-style: normal + font-weight: normal + src: url(font-icon-path + ".eot?v=#" + font-icon-version) + src: url(font-icon-path + ".eot?#iefix&v=#" + font-icon-version) format("embedded-opentype"), + url(font-icon-path + ".woff?v=#" + font-icon-version) format("woff"), + url(font-icon-path + ".ttf?v=#" + font-icon-version) format("truetype"), + url(font-icon-path + ".svg#fontawesomeregular?v=#" + font-icon-version) format("svg") + +html, body, #container + height: 100% + +body + background: color-background + font: font-size font-sans + -webkit-text-size-adjust: 100% + +.outer + clearfix() + max-width: (column-width + gutter-width) * columns + gutter-width + margin: 0 auto + padding: 0 gutter-width + +.inner + column(columns) + +.left, .alignleft + float: left + +.right, .alignright + float: right + +.clear + clear: both + +#container + position: relative + +.mobile-nav-on + overflow: hidden + +#wrap + height: 100% + width: 100% + position: absolute + top: 0 + left: 0 + transition: 0.2s ease-out + z-index: 1 + background: color-background + .mobile-nav-on & + left: mobile-nav-width + +if sidebar and sidebar isnt bottom + #main + @media mq-normal + column(main-column) + +if sidebar is left + @media mq-normal + #main + float: right + +@import "_extend" +@import "_partial/header" +@import "_partial/article" +@import "_partial/comment" +@import "_partial/archive" +@import "_partial/footer" +@import "_partial/highlight" +@import "_partial/mobile" + +if sidebar + @import "_partial/sidebar" \ No newline at end of file diff --git a/themes/landscape/source/fancybox/blank.gif b/themes/landscape/source/fancybox/blank.gif new file mode 100644 index 0000000..35d42e8 Binary files /dev/null and b/themes/landscape/source/fancybox/blank.gif differ diff --git a/themes/landscape/source/fancybox/fancybox_loading.gif b/themes/landscape/source/fancybox/fancybox_loading.gif new file mode 100644 index 0000000..a03a40c Binary files /dev/null and b/themes/landscape/source/fancybox/fancybox_loading.gif differ diff --git a/themes/landscape/source/fancybox/fancybox_loading@2x.gif b/themes/landscape/source/fancybox/fancybox_loading@2x.gif new file mode 100644 index 0000000..9205aeb Binary files /dev/null and b/themes/landscape/source/fancybox/fancybox_loading@2x.gif differ diff --git a/themes/landscape/source/fancybox/fancybox_overlay.png b/themes/landscape/source/fancybox/fancybox_overlay.png new file mode 100644 index 0000000..a439139 Binary files /dev/null and b/themes/landscape/source/fancybox/fancybox_overlay.png differ diff --git a/themes/landscape/source/fancybox/fancybox_sprite.png b/themes/landscape/source/fancybox/fancybox_sprite.png new file mode 100644 index 0000000..fd8d5ca Binary files /dev/null and b/themes/landscape/source/fancybox/fancybox_sprite.png differ diff --git a/themes/landscape/source/fancybox/fancybox_sprite@2x.png b/themes/landscape/source/fancybox/fancybox_sprite@2x.png new file mode 100644 index 0000000..d0e4779 Binary files /dev/null and b/themes/landscape/source/fancybox/fancybox_sprite@2x.png differ diff --git a/themes/landscape/source/fancybox/helpers/fancybox_buttons.png b/themes/landscape/source/fancybox/helpers/fancybox_buttons.png new file mode 100644 index 0000000..0787207 Binary files /dev/null and b/themes/landscape/source/fancybox/helpers/fancybox_buttons.png differ diff --git a/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css b/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css new file mode 100644 index 0000000..a26273a --- /dev/null +++ b/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css @@ -0,0 +1,97 @@ +#fancybox-buttons { + position: fixed; + left: 0; + width: 100%; + z-index: 8050; +} + +#fancybox-buttons.top { + top: 10px; +} + +#fancybox-buttons.bottom { + bottom: 10px; +} + +#fancybox-buttons ul { + display: block; + width: 166px; + height: 30px; + margin: 0 auto; + padding: 0; + list-style: none; + border: 1px solid #111; + border-radius: 3px; + -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + background: rgb(50,50,50); + background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51))); + background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 ); +} + +#fancybox-buttons ul li { + float: left; + margin: 0; + padding: 0; +} + +#fancybox-buttons a { + display: block; + width: 30px; + height: 30px; + text-indent: -9999px; + background-color: transparent; + background-image: url('fancybox_buttons.png'); + background-repeat: no-repeat; + outline: none; + opacity: 0.8; +} + +#fancybox-buttons a:hover { + opacity: 1; +} + +#fancybox-buttons a.btnPrev { + background-position: 5px 0; +} + +#fancybox-buttons a.btnNext { + background-position: -33px 0; + border-right: 1px solid #3e3e3e; +} + +#fancybox-buttons a.btnPlay { + background-position: 0 -30px; +} + +#fancybox-buttons a.btnPlayOn { + background-position: -30px -30px; +} + +#fancybox-buttons a.btnToggle { + background-position: 3px -60px; + border-left: 1px solid #111; + border-right: 1px solid #3e3e3e; + width: 35px +} + +#fancybox-buttons a.btnToggleOn { + background-position: -27px -60px; +} + +#fancybox-buttons a.btnClose { + border-left: 1px solid #111; + width: 35px; + background-position: -56px 0px; +} + +#fancybox-buttons a.btnDisabled { + opacity : 0.4; + cursor: default; +} \ No newline at end of file diff --git a/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js b/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js new file mode 100644 index 0000000..352bb5f --- /dev/null +++ b/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js @@ -0,0 +1,122 @@ + /*! + * Buttons helper for fancyBox + * version: 1.0.5 (Mon, 15 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * buttons: { + * position : 'top' + * } + * } + * }); + * + */ +;(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.buttons = { + defaults : { + skipSingle : false, // disables if gallery contains single image + position : 'top', // 'top' or 'bottom' + tpl : '
' + }, + + list : null, + buttons: null, + + beforeLoad: function (opts, obj) { + //Remove self if gallery do not have at least two items + + if (opts.skipSingle && obj.group.length < 2) { + obj.helpers.buttons = false; + obj.closeBtn = true; + + return; + } + + //Increase top margin to give space for buttons + obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30; + }, + + onPlayStart: function () { + if (this.buttons) { + this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn'); + } + }, + + onPlayEnd: function () { + if (this.buttons) { + this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn'); + } + }, + + afterShow: function (opts, obj) { + var buttons = this.buttons; + + if (!buttons) { + this.list = $(opts.tpl).addClass(opts.position).appendTo('body'); + + buttons = { + prev : this.list.find('.btnPrev').click( F.prev ), + next : this.list.find('.btnNext').click( F.next ), + play : this.list.find('.btnPlay').click( F.play ), + toggle : this.list.find('.btnToggle').click( F.toggle ), + close : this.list.find('.btnClose').click( F.close ) + } + } + + //Prev + if (obj.index > 0 || obj.loop) { + buttons.prev.removeClass('btnDisabled'); + } else { + buttons.prev.addClass('btnDisabled'); + } + + //Next / Play + if (obj.loop || obj.index < obj.group.length - 1) { + buttons.next.removeClass('btnDisabled'); + buttons.play.removeClass('btnDisabled'); + + } else { + buttons.next.addClass('btnDisabled'); + buttons.play.addClass('btnDisabled'); + } + + this.buttons = buttons; + + this.onUpdate(opts, obj); + }, + + onUpdate: function (opts, obj) { + var toggle; + + if (!this.buttons) { + return; + } + + toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn'); + + //Size toggle button + if (obj.canShrink) { + toggle.addClass('btnToggleOn'); + + } else if (!obj.canExpand) { + toggle.addClass('btnDisabled'); + } + }, + + beforeClose: function () { + if (this.list) { + this.list.remove(); + } + + this.list = null; + this.buttons = null; + } + }; + +}(jQuery)); diff --git a/themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js b/themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js new file mode 100644 index 0000000..62737a5 --- /dev/null +++ b/themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js @@ -0,0 +1,199 @@ +/*! + * Media helper for fancyBox + * version: 1.0.6 (Fri, 14 Jun 2013) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * media: true + * } + * }); + * + * Set custom URL parameters: + * $(".fancybox").fancybox({ + * helpers : { + * media: { + * youtube : { + * params : { + * autoplay : 0 + * } + * } + * } + * } + * }); + * + * Or: + * $(".fancybox").fancybox({, + * helpers : { + * media: true + * }, + * youtube : { + * autoplay: 0 + * } + * }); + * + * Supports: + * + * Youtube + * http://www.youtube.com/watch?v=opj24KnzrWo + * http://www.youtube.com/embed/opj24KnzrWo + * http://youtu.be/opj24KnzrWo + * http://www.youtube-nocookie.com/embed/opj24KnzrWo + * Vimeo + * http://vimeo.com/40648169 + * http://vimeo.com/channels/staffpicks/38843628 + * http://vimeo.com/groups/surrealism/videos/36516384 + * http://player.vimeo.com/video/45074303 + * Metacafe + * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/ + * http://www.metacafe.com/watch/7635964/ + * Dailymotion + * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people + * Twitvid + * http://twitvid.com/QY7MD + * Twitpic + * http://twitpic.com/7p93st + * Instagram + * http://instagr.am/p/IejkuUGxQn/ + * http://instagram.com/p/IejkuUGxQn/ + * Google maps + * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17 + * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 + * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56 + */ +;(function ($) { + "use strict"; + + //Shortcut for fancyBox object + var F = $.fancybox, + format = function( url, rez, params ) { + params = params || ''; + + if ( $.type( params ) === "object" ) { + params = $.param(params, true); + } + + $.each(rez, function(key, value) { + url = url.replace( '$' + key, value || '' ); + }); + + if (params.length) { + url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params; + } + + return url; + }; + + //Add helper object + F.helpers.media = { + defaults : { + youtube : { + matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i, + params : { + autoplay : 1, + autohide : 1, + fs : 1, + rel : 0, + hd : 1, + wmode : 'opaque', + enablejsapi : 1 + }, + type : 'iframe', + url : '//www.youtube.com/embed/$3' + }, + vimeo : { + matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/, + params : { + autoplay : 1, + hd : 1, + show_title : 1, + show_byline : 1, + show_portrait : 0, + fullscreen : 1 + }, + type : 'iframe', + url : '//player.vimeo.com/video/$1' + }, + metacafe : { + matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/, + params : { + autoPlay : 'yes' + }, + type : 'swf', + url : function( rez, params, obj ) { + obj.swf.flashVars = 'playerVars=' + $.param( params, true ); + + return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf'; + } + }, + dailymotion : { + matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, + params : { + additionalInfos : 0, + autoStart : 1 + }, + type : 'swf', + url : '//www.dailymotion.com/swf/video/$1' + }, + twitvid : { + matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i, + params : { + autoplay : 0 + }, + type : 'iframe', + url : '//www.twitvid.com/embed.php?guid=$1' + }, + twitpic : { + matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i, + type : 'image', + url : '//twitpic.com/show/full/$1/' + }, + instagram : { + matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, + type : 'image', + url : '//$1/p/$2/media/?size=l' + }, + google_maps : { + matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i, + type : 'iframe', + url : function( rez ) { + return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed'); + } + } + }, + + beforeLoad : function(opts, obj) { + var url = obj.href || '', + type = false, + what, + item, + rez, + params; + + for (what in opts) { + if (opts.hasOwnProperty(what)) { + item = opts[ what ]; + rez = url.match( item.matcher ); + + if (rez) { + type = item.type; + params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null)); + + url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params ); + + break; + } + } + } + + if (type) { + obj.href = url; + obj.type = type; + + obj.autoHeight = false; + } + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css b/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css new file mode 100644 index 0000000..63d2943 --- /dev/null +++ b/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css @@ -0,0 +1,55 @@ +#fancybox-thumbs { + position: fixed; + left: 0; + width: 100%; + overflow: hidden; + z-index: 8050; +} + +#fancybox-thumbs.bottom { + bottom: 2px; +} + +#fancybox-thumbs.top { + top: 2px; +} + +#fancybox-thumbs ul { + position: relative; + list-style: none; + margin: 0; + padding: 0; +} + +#fancybox-thumbs ul li { + float: left; + padding: 1px; + opacity: 0.5; +} + +#fancybox-thumbs ul li.active { + opacity: 0.75; + padding: 0; + border: 1px solid #fff; +} + +#fancybox-thumbs ul li:hover { + opacity: 1; +} + +#fancybox-thumbs ul li a { + display: block; + position: relative; + overflow: hidden; + border: 1px solid #222; + background: #111; + outline: none; +} + +#fancybox-thumbs ul li img { + display: block; + position: relative; + border: 0; + padding: 0; + max-width: none; +} \ No newline at end of file diff --git a/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js b/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js new file mode 100644 index 0000000..58c9719 --- /dev/null +++ b/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js @@ -0,0 +1,165 @@ + /*! + * Thumbnail helper for fancyBox + * version: 1.0.7 (Mon, 01 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * thumbs: { + * width : 50, + * height : 50 + * } + * } + * }); + * + */ +;(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.thumbs = { + defaults : { + width : 50, // thumbnail width + height : 50, // thumbnail height + position : 'bottom', // 'top' or 'bottom' + source : function ( item ) { // function to obtain the URL of the thumbnail image + var href; + + if (item.element) { + href = $(item.element).find('img').attr('src'); + } + + if (!href && item.type === 'image' && item.href) { + href = item.href; + } + + return href; + } + }, + + wrap : null, + list : null, + width : 0, + + init: function (opts, obj) { + var that = this, + list, + thumbWidth = opts.width, + thumbHeight = opts.height, + thumbSource = opts.source; + + //Build list structure + list = ''; + + for (var n = 0; n < obj.group.length; n++) { + list += '
  • '; + } + + this.wrap = $('
    ').addClass(opts.position).appendTo('body'); + this.list = $('
      ' + list + '
    ').appendTo(this.wrap); + + //Load each thumbnail + $.each(obj.group, function (i) { + var el = obj.group[ i ], + href = thumbSource( el ); + + if (!href) { + return; + } + + $("").load(function () { + var width = this.width, + height = this.height, + widthRatio, heightRatio, parent; + + if (!that.list || !width || !height) { + return; + } + + //Calculate thumbnail width/height and center it + widthRatio = width / thumbWidth; + heightRatio = height / thumbHeight; + + parent = that.list.children().eq(i).find('a'); + + if (widthRatio >= 1 && heightRatio >= 1) { + if (widthRatio > heightRatio) { + width = Math.floor(width / heightRatio); + height = thumbHeight; + + } else { + width = thumbWidth; + height = Math.floor(height / widthRatio); + } + } + + $(this).css({ + width : width, + height : height, + top : Math.floor(thumbHeight / 2 - height / 2), + left : Math.floor(thumbWidth / 2 - width / 2) + }); + + parent.width(thumbWidth).height(thumbHeight); + + $(this).hide().appendTo(parent).fadeIn(300); + + }) + .attr('src', href) + .attr('title', el.title); + }); + + //Set initial width + this.width = this.list.children().eq(0).outerWidth(true); + + this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))); + }, + + beforeLoad: function (opts, obj) { + //Remove self if gallery do not have at least two items + if (obj.group.length < 2) { + obj.helpers.thumbs = false; + + return; + } + + //Increase bottom margin to give space for thumbs + obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15); + }, + + afterShow: function (opts, obj) { + //Check if exists and create or update list + if (this.list) { + this.onUpdate(opts, obj); + + } else { + this.init(opts, obj); + } + + //Set active element + this.list.children().removeClass('active').eq(obj.index).addClass('active'); + }, + + //Center list + onUpdate: function (opts, obj) { + if (this.list) { + this.list.stop(true).animate({ + 'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)) + }, 150); + } + }, + + beforeClose: function () { + if (this.wrap) { + this.wrap.remove(); + } + + this.wrap = null; + this.list = null; + this.width = 0; + } + } + +}(jQuery)); \ No newline at end of file diff --git a/themes/landscape/source/fancybox/jquery.fancybox.css b/themes/landscape/source/fancybox/jquery.fancybox.css new file mode 100644 index 0000000..c75d051 --- /dev/null +++ b/themes/landscape/source/fancybox/jquery.fancybox.css @@ -0,0 +1,273 @@ +/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */ +.fancybox-wrap, +.fancybox-skin, +.fancybox-outer, +.fancybox-inner, +.fancybox-image, +.fancybox-wrap iframe, +.fancybox-wrap object, +.fancybox-nav, +.fancybox-nav span, +.fancybox-tmp +{ + padding: 0; + margin: 0; + border: 0; + outline: none; + vertical-align: top; +} + +.fancybox-wrap { + position: absolute; + top: 0; + left: 0; + z-index: 8020; +} + +.fancybox-skin { + position: relative; + background: #f9f9f9; + color: #444; + text-shadow: none; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.fancybox-opened { + z-index: 8030; +} + +.fancybox-opened .fancybox-skin { + -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); +} + +.fancybox-outer, .fancybox-inner { + position: relative; +} + +.fancybox-inner { + overflow: hidden; +} + +.fancybox-type-iframe .fancybox-inner { + -webkit-overflow-scrolling: touch; +} + +.fancybox-error { + color: #444; + font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; + margin: 0; + padding: 15px; + white-space: nowrap; +} + +.fancybox-image, .fancybox-iframe { + display: block; + width: 100%; + height: 100%; +} + +.fancybox-image { + max-width: 100%; + max-height: 100%; +} + +#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { + background-image: url(fancybox_sprite.png); +} + +#fancybox-loading { + position: fixed; + top: 50%; + left: 50%; + margin-top: -22px; + margin-left: -22px; + background-position: 0 -108px; + opacity: 0.8; + cursor: pointer; + z-index: 8060; +} + +#fancybox-loading div { + width: 44px; + height: 44px; + background: url(fancybox_loading.gif) center center no-repeat; +} + +.fancybox-close { + position: absolute; + top: -18px; + right: -18px; + width: 36px; + height: 36px; + cursor: pointer; + z-index: 8040; +} + +.fancybox-nav { + position: absolute; + top: 0; + width: 40%; + height: 100%; + cursor: pointer; + text-decoration: none; + background: transparent url(blank.gif); /* helps IE */ + -webkit-tap-highlight-color: rgba(0,0,0,0); + z-index: 8040; +} + +.fancybox-prev { + left: 0; +} + +.fancybox-next { + right: 0; +} + +.fancybox-nav span { + position: absolute; + top: 50%; + width: 36px; + height: 34px; + margin-top: -18px; + cursor: pointer; + z-index: 8040; + visibility: hidden; +} + +.fancybox-prev span { + left: 10px; + background-position: 0 -36px; +} + +.fancybox-next span { + right: 10px; + background-position: 0 -72px; +} + +.fancybox-nav:hover span { + visibility: visible; +} + +.fancybox-tmp { + position: absolute; + top: -99999px; + left: -99999px; + max-width: 99999px; + max-height: 99999px; + overflow: visible !important; +} + +/* Overlay helper */ + +.fancybox-lock { + overflow: visible !important; + width: auto; +} + +.fancybox-lock body { + overflow: hidden !important; +} + +.fancybox-lock-test { + overflow-y: hidden !important; +} + +.fancybox-overlay { + position: absolute; + top: 0; + left: 0; + overflow: hidden; + display: none; + z-index: 8010; + background: url(fancybox_overlay.png); +} + +.fancybox-overlay-fixed { + position: fixed; + bottom: 0; + right: 0; +} + +.fancybox-lock .fancybox-overlay { + overflow: auto; + overflow-y: scroll; +} + +/* Title helper */ + +.fancybox-title { + visibility: hidden; + font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; + position: relative; + text-shadow: none; + z-index: 8050; +} + +.fancybox-opened .fancybox-title { + visibility: visible; +} + +.fancybox-title-float-wrap { + position: absolute; + bottom: 0; + right: 50%; + margin-bottom: -35px; + z-index: 8050; + text-align: center; +} + +.fancybox-title-float-wrap .child { + display: inline-block; + margin-right: -100%; + padding: 2px 20px; + background: transparent; /* Fallback for web browsers that doesn't support RGBa */ + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + text-shadow: 0 1px 2px #222; + color: #FFF; + font-weight: bold; + line-height: 24px; + white-space: nowrap; +} + +.fancybox-title-outside-wrap { + position: relative; + margin-top: 10px; + color: #fff; +} + +.fancybox-title-inside-wrap { + padding-top: 10px; +} + +.fancybox-title-over-wrap { + position: absolute; + bottom: 0; + left: 0; + color: #fff; + padding: 10px; + background: #000; + background: rgba(0, 0, 0, .8); +} + +/*Retina graphics!*/ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (min--moz-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5){ + + #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { + background-image: url(fancybox_sprite@2x.png); + background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/ + } + + #fancybox-loading div { + background-image: url(fancybox_loading@2x.gif); + background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/ + } +} \ No newline at end of file diff --git a/themes/landscape/source/fancybox/jquery.fancybox.js b/themes/landscape/source/fancybox/jquery.fancybox.js new file mode 100644 index 0000000..7a0f8ac --- /dev/null +++ b/themes/landscape/source/fancybox/jquery.fancybox.js @@ -0,0 +1,2017 @@ +/*! + * fancyBox - jQuery Plugin + * version: 2.1.5 (Fri, 14 Jun 2013) + * requires jQuery v1.6 or later + * + * Examples at http://fancyapps.com/fancybox/ + * License: www.fancyapps.com/fancybox/#license + * + * Copyright 2012 Janis Skarnelis - janis@fancyapps.com + * + */ + +;(function (window, document, $, undefined) { + "use strict"; + + var H = $("html"), + W = $(window), + D = $(document), + F = $.fancybox = function () { + F.open.apply( this, arguments ); + }, + IE = navigator.userAgent.match(/msie/i), + didUpdate = null, + isTouch = document.createTouch !== undefined, + + isQuery = function(obj) { + return obj && obj.hasOwnProperty && obj instanceof $; + }, + isString = function(str) { + return str && $.type(str) === "string"; + }, + isPercentage = function(str) { + return isString(str) && str.indexOf('%') > 0; + }, + isScrollable = function(el) { + return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight))); + }, + getScalar = function(orig, dim) { + var value = parseInt(orig, 10) || 0; + + if (dim && isPercentage(orig)) { + value = F.getViewport()[ dim ] / 100 * value; + } + + return Math.ceil(value); + }, + getValue = function(value, dim) { + return getScalar(value, dim) + 'px'; + }; + + $.extend(F, { + // The current version of fancyBox + version: '2.1.5', + + defaults: { + padding : 15, + margin : 20, + + width : 800, + height : 600, + minWidth : 100, + minHeight : 100, + maxWidth : 9999, + maxHeight : 9999, + pixelRatio: 1, // Set to 2 for retina display support + + autoSize : true, + autoHeight : false, + autoWidth : false, + + autoResize : true, + autoCenter : !isTouch, + fitToView : true, + aspectRatio : false, + topRatio : 0.5, + leftRatio : 0.5, + + scrolling : 'auto', // 'auto', 'yes' or 'no' + wrapCSS : '', + + arrows : true, + closeBtn : true, + closeClick : false, + nextClick : false, + mouseWheel : true, + autoPlay : false, + playSpeed : 3000, + preload : 3, + modal : false, + loop : true, + + ajax : { + dataType : 'html', + headers : { 'X-fancyBox': true } + }, + iframe : { + scrolling : 'auto', + preload : true + }, + swf : { + wmode: 'transparent', + allowfullscreen : 'true', + allowscriptaccess : 'always' + }, + + keys : { + next : { + 13 : 'left', // enter + 34 : 'up', // page down + 39 : 'left', // right arrow + 40 : 'up' // down arrow + }, + prev : { + 8 : 'right', // backspace + 33 : 'down', // page up + 37 : 'right', // left arrow + 38 : 'down' // up arrow + }, + close : [27], // escape key + play : [32], // space - start/stop slideshow + toggle : [70] // letter "f" - toggle fullscreen + }, + + direction : { + next : 'left', + prev : 'right' + }, + + scrollOutside : true, + + // Override some properties + index : 0, + type : null, + href : null, + content : null, + title : null, + + // HTML templates + tpl: { + wrap : '
    ', + image : '', + iframe : '', + error : '

    The requested content cannot be loaded.
    Please try again later.

    ', + closeBtn : '', + next : '', + prev : '' + }, + + // Properties for each animation type + // Opening fancyBox + openEffect : 'fade', // 'elastic', 'fade' or 'none' + openSpeed : 250, + openEasing : 'swing', + openOpacity : true, + openMethod : 'zoomIn', + + // Closing fancyBox + closeEffect : 'fade', // 'elastic', 'fade' or 'none' + closeSpeed : 250, + closeEasing : 'swing', + closeOpacity : true, + closeMethod : 'zoomOut', + + // Changing next gallery item + nextEffect : 'elastic', // 'elastic', 'fade' or 'none' + nextSpeed : 250, + nextEasing : 'swing', + nextMethod : 'changeIn', + + // Changing previous gallery item + prevEffect : 'elastic', // 'elastic', 'fade' or 'none' + prevSpeed : 250, + prevEasing : 'swing', + prevMethod : 'changeOut', + + // Enable default helpers + helpers : { + overlay : true, + title : true + }, + + // Callbacks + onCancel : $.noop, // If canceling + beforeLoad : $.noop, // Before loading + afterLoad : $.noop, // After loading + beforeShow : $.noop, // Before changing in current item + afterShow : $.noop, // After opening + beforeChange : $.noop, // Before changing gallery item + beforeClose : $.noop, // Before closing + afterClose : $.noop // After closing + }, + + //Current state + group : {}, // Selected group + opts : {}, // Group options + previous : null, // Previous element + coming : null, // Element being loaded + current : null, // Currently loaded element + isActive : false, // Is activated + isOpen : false, // Is currently open + isOpened : false, // Have been fully opened at least once + + wrap : null, + skin : null, + outer : null, + inner : null, + + player : { + timer : null, + isActive : false + }, + + // Loaders + ajaxLoad : null, + imgPreload : null, + + // Some collections + transitions : {}, + helpers : {}, + + /* + * Static methods + */ + + open: function (group, opts) { + if (!group) { + return; + } + + if (!$.isPlainObject(opts)) { + opts = {}; + } + + // Close if already active + if (false === F.close(true)) { + return; + } + + // Normalize group + if (!$.isArray(group)) { + group = isQuery(group) ? $(group).get() : [group]; + } + + // Recheck if the type of each element is `object` and set content type (image, ajax, etc) + $.each(group, function(i, element) { + var obj = {}, + href, + title, + content, + type, + rez, + hrefParts, + selector; + + if ($.type(element) === "object") { + // Check if is DOM element + if (element.nodeType) { + element = $(element); + } + + if (isQuery(element)) { + obj = { + href : element.data('fancybox-href') || element.attr('href'), + title : $('
    ').text( element.data('fancybox-title') || element.attr('title') ).html(), + isDom : true, + element : element + }; + + if ($.metadata) { + $.extend(true, obj, element.metadata()); + } + + } else { + obj = element; + } + } + + href = opts.href || obj.href || (isString(element) ? element : null); + title = opts.title !== undefined ? opts.title : obj.title || ''; + + content = opts.content || obj.content; + type = content ? 'html' : (opts.type || obj.type); + + if (!type && obj.isDom) { + type = element.data('fancybox-type'); + + if (!type) { + rez = element.prop('class').match(/fancybox\.(\w+)/); + type = rez ? rez[1] : null; + } + } + + if (isString(href)) { + // Try to guess the content type + if (!type) { + if (F.isImage(href)) { + type = 'image'; + + } else if (F.isSWF(href)) { + type = 'swf'; + + } else if (href.charAt(0) === '#') { + type = 'inline'; + + } else if (isString(element)) { + type = 'html'; + content = element; + } + } + + // Split url into two pieces with source url and content selector, e.g, + // "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id" + if (type === 'ajax') { + hrefParts = href.split(/\s+/, 2); + href = hrefParts.shift(); + selector = hrefParts.shift(); + } + } + + if (!content) { + if (type === 'inline') { + if (href) { + content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7 + + } else if (obj.isDom) { + content = element; + } + + } else if (type === 'html') { + content = href; + + } else if (!type && !href && obj.isDom) { + type = 'inline'; + content = element; + } + } + + $.extend(obj, { + href : href, + type : type, + content : content, + title : title, + selector : selector + }); + + group[ i ] = obj; + }); + + // Extend the defaults + F.opts = $.extend(true, {}, F.defaults, opts); + + // All options are merged recursive except keys + if (opts.keys !== undefined) { + F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false; + } + + F.group = group; + + return F._start(F.opts.index); + }, + + // Cancel image loading or abort ajax request + cancel: function () { + var coming = F.coming; + + if (coming && false === F.trigger('onCancel')) { + return; + } + + F.hideLoading(); + + if (!coming) { + return; + } + + if (F.ajaxLoad) { + F.ajaxLoad.abort(); + } + + F.ajaxLoad = null; + + if (F.imgPreload) { + F.imgPreload.onload = F.imgPreload.onerror = null; + } + + if (coming.wrap) { + coming.wrap.stop(true, true).trigger('onReset').remove(); + } + + F.coming = null; + + // If the first item has been canceled, then clear everything + if (!F.current) { + F._afterZoomOut( coming ); + } + }, + + // Start closing animation if is open; remove immediately if opening/closing + close: function (event) { + F.cancel(); + + if (false === F.trigger('beforeClose')) { + return; + } + + F.unbindEvents(); + + if (!F.isActive) { + return; + } + + if (!F.isOpen || event === true) { + $('.fancybox-wrap').stop(true).trigger('onReset').remove(); + + F._afterZoomOut(); + + } else { + F.isOpen = F.isOpened = false; + F.isClosing = true; + + $('.fancybox-item, .fancybox-nav').remove(); + + F.wrap.stop(true, true).removeClass('fancybox-opened'); + + F.transitions[ F.current.closeMethod ](); + } + }, + + // Manage slideshow: + // $.fancybox.play(); - toggle slideshow + // $.fancybox.play( true ); - start + // $.fancybox.play( false ); - stop + play: function ( action ) { + var clear = function () { + clearTimeout(F.player.timer); + }, + set = function () { + clear(); + + if (F.current && F.player.isActive) { + F.player.timer = setTimeout(F.next, F.current.playSpeed); + } + }, + stop = function () { + clear(); + + D.unbind('.player'); + + F.player.isActive = false; + + F.trigger('onPlayEnd'); + }, + start = function () { + if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) { + F.player.isActive = true; + + D.bind({ + 'onCancel.player beforeClose.player' : stop, + 'onUpdate.player' : set, + 'beforeLoad.player' : clear + }); + + set(); + + F.trigger('onPlayStart'); + } + }; + + if (action === true || (!F.player.isActive && action !== false)) { + start(); + } else { + stop(); + } + }, + + // Navigate to next gallery item + next: function ( direction ) { + var current = F.current; + + if (current) { + if (!isString(direction)) { + direction = current.direction.next; + } + + F.jumpto(current.index + 1, direction, 'next'); + } + }, + + // Navigate to previous gallery item + prev: function ( direction ) { + var current = F.current; + + if (current) { + if (!isString(direction)) { + direction = current.direction.prev; + } + + F.jumpto(current.index - 1, direction, 'prev'); + } + }, + + // Navigate to gallery item by index + jumpto: function ( index, direction, router ) { + var current = F.current; + + if (!current) { + return; + } + + index = getScalar(index); + + F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ]; + F.router = router || 'jumpto'; + + if (current.loop) { + if (index < 0) { + index = current.group.length + (index % current.group.length); + } + + index = index % current.group.length; + } + + if (current.group[ index ] !== undefined) { + F.cancel(); + + F._start(index); + } + }, + + // Center inside viewport and toggle position type to fixed or absolute if needed + reposition: function (e, onlyAbsolute) { + var current = F.current, + wrap = current ? current.wrap : null, + pos; + + if (wrap) { + pos = F._getPosition(onlyAbsolute); + + if (e && e.type === 'scroll') { + delete pos.position; + + wrap.stop(true, true).animate(pos, 200); + + } else { + wrap.css(pos); + + current.pos = $.extend({}, current.dim, pos); + } + } + }, + + update: function (e) { + var type = (e && e.originalEvent && e.originalEvent.type), + anyway = !type || type === 'orientationchange'; + + if (anyway) { + clearTimeout(didUpdate); + + didUpdate = null; + } + + if (!F.isOpen || didUpdate) { + return; + } + + didUpdate = setTimeout(function() { + var current = F.current; + + if (!current || F.isClosing) { + return; + } + + F.wrap.removeClass('fancybox-tmp'); + + if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) { + F._setDimension(); + } + + if (!(type === 'scroll' && current.canShrink)) { + F.reposition(e); + } + + F.trigger('onUpdate'); + + didUpdate = null; + + }, (anyway && !isTouch ? 0 : 300)); + }, + + // Shrink content to fit inside viewport or restore if resized + toggle: function ( action ) { + if (F.isOpen) { + F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView; + + // Help browser to restore document dimensions + if (isTouch) { + F.wrap.removeAttr('style').addClass('fancybox-tmp'); + + F.trigger('onUpdate'); + } + + F.update(); + } + }, + + hideLoading: function () { + D.unbind('.loading'); + + $('#fancybox-loading').remove(); + }, + + showLoading: function () { + var el, viewport; + + F.hideLoading(); + + el = $('
    ').click(F.cancel).appendTo('body'); + + // If user will press the escape-button, the request will be canceled + D.bind('keydown.loading', function(e) { + if ((e.which || e.keyCode) === 27) { + e.preventDefault(); + + F.cancel(); + } + }); + + if (!F.defaults.fixed) { + viewport = F.getViewport(); + + el.css({ + position : 'absolute', + top : (viewport.h * 0.5) + viewport.y, + left : (viewport.w * 0.5) + viewport.x + }); + } + + F.trigger('onLoading'); + }, + + getViewport: function () { + var locked = (F.current && F.current.locked) || false, + rez = { + x: W.scrollLeft(), + y: W.scrollTop() + }; + + if (locked && locked.length) { + rez.w = locked[0].clientWidth; + rez.h = locked[0].clientHeight; + + } else { + // See http://bugs.jquery.com/ticket/6724 + rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width(); + rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height(); + } + + return rez; + }, + + // Unbind the keyboard / clicking actions + unbindEvents: function () { + if (F.wrap && isQuery(F.wrap)) { + F.wrap.unbind('.fb'); + } + + D.unbind('.fb'); + W.unbind('.fb'); + }, + + bindEvents: function () { + var current = F.current, + keys; + + if (!current) { + return; + } + + // Changing document height on iOS devices triggers a 'resize' event, + // that can change document height... repeating infinitely + W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update); + + keys = current.keys; + + if (keys) { + D.bind('keydown.fb', function (e) { + var code = e.which || e.keyCode, + target = e.target || e.srcElement; + + // Skip esc key if loading, because showLoading will cancel preloading + if (code === 27 && F.coming) { + return false; + } + + // Ignore key combinations and key events within form elements + if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) { + $.each(keys, function(i, val) { + if (current.group.length > 1 && val[ code ] !== undefined) { + F[ i ]( val[ code ] ); + + e.preventDefault(); + return false; + } + + if ($.inArray(code, val) > -1) { + F[ i ] (); + + e.preventDefault(); + return false; + } + }); + } + }); + } + + if ($.fn.mousewheel && current.mouseWheel) { + F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) { + var target = e.target || null, + parent = $(target), + canScroll = false; + + while (parent.length) { + if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) { + break; + } + + canScroll = isScrollable( parent[0] ); + parent = $(parent).parent(); + } + + if (delta !== 0 && !canScroll) { + if (F.group.length > 1 && !current.canShrink) { + if (deltaY > 0 || deltaX > 0) { + F.prev( deltaY > 0 ? 'down' : 'left' ); + + } else if (deltaY < 0 || deltaX < 0) { + F.next( deltaY < 0 ? 'up' : 'right' ); + } + + e.preventDefault(); + } + } + }); + } + }, + + trigger: function (event, o) { + var ret, obj = o || F.coming || F.current; + + if (obj) { + if ($.isFunction( obj[event] )) { + ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1)); + } + + if (ret === false) { + return false; + } + + if (obj.helpers) { + $.each(obj.helpers, function (helper, opts) { + if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) { + F.helpers[helper][event]($.extend(true, {}, F.helpers[helper].defaults, opts), obj); + } + }); + } + } + + D.trigger(event); + }, + + isImage: function (str) { + return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i); + }, + + isSWF: function (str) { + return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i); + }, + + _start: function (index) { + var coming = {}, + obj, + href, + type, + margin, + padding; + + index = getScalar( index ); + obj = F.group[ index ] || null; + + if (!obj) { + return false; + } + + coming = $.extend(true, {}, F.opts, obj); + + // Convert margin and padding properties to array - top, right, bottom, left + margin = coming.margin; + padding = coming.padding; + + if ($.type(margin) === 'number') { + coming.margin = [margin, margin, margin, margin]; + } + + if ($.type(padding) === 'number') { + coming.padding = [padding, padding, padding, padding]; + } + + // 'modal' propery is just a shortcut + if (coming.modal) { + $.extend(true, coming, { + closeBtn : false, + closeClick : false, + nextClick : false, + arrows : false, + mouseWheel : false, + keys : null, + helpers: { + overlay : { + closeClick : false + } + } + }); + } + + // 'autoSize' property is a shortcut, too + if (coming.autoSize) { + coming.autoWidth = coming.autoHeight = true; + } + + if (coming.width === 'auto') { + coming.autoWidth = true; + } + + if (coming.height === 'auto') { + coming.autoHeight = true; + } + + /* + * Add reference to the group, so it`s possible to access from callbacks, example: + * afterLoad : function() { + * this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : ''); + * } + */ + + coming.group = F.group; + coming.index = index; + + // Give a chance for callback or helpers to update coming item (type, title, etc) + F.coming = coming; + + if (false === F.trigger('beforeLoad')) { + F.coming = null; + + return; + } + + type = coming.type; + href = coming.href; + + if (!type) { + F.coming = null; + + //If we can not determine content type then drop silently or display next/prev item if looping through gallery + if (F.current && F.router && F.router !== 'jumpto') { + F.current.index = index; + + return F[ F.router ]( F.direction ); + } + + return false; + } + + F.isActive = true; + + if (type === 'image' || type === 'swf') { + coming.autoHeight = coming.autoWidth = false; + coming.scrolling = 'visible'; + } + + if (type === 'image') { + coming.aspectRatio = true; + } + + if (type === 'iframe' && isTouch) { + coming.scrolling = 'scroll'; + } + + // Build the neccessary markup + coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' ); + + $.extend(coming, { + skin : $('.fancybox-skin', coming.wrap), + outer : $('.fancybox-outer', coming.wrap), + inner : $('.fancybox-inner', coming.wrap) + }); + + $.each(["Top", "Right", "Bottom", "Left"], function(i, v) { + coming.skin.css('padding' + v, getValue(coming.padding[ i ])); + }); + + F.trigger('onReady'); + + // Check before try to load; 'inline' and 'html' types need content, others - href + if (type === 'inline' || type === 'html') { + if (!coming.content || !coming.content.length) { + return F._error( 'content' ); + } + + } else if (!href) { + return F._error( 'href' ); + } + + if (type === 'image') { + F._loadImage(); + + } else if (type === 'ajax') { + F._loadAjax(); + + } else if (type === 'iframe') { + F._loadIframe(); + + } else { + F._afterLoad(); + } + }, + + _error: function ( type ) { + $.extend(F.coming, { + type : 'html', + autoWidth : true, + autoHeight : true, + minWidth : 0, + minHeight : 0, + scrolling : 'no', + hasError : type, + content : F.coming.tpl.error + }); + + F._afterLoad(); + }, + + _loadImage: function () { + // Reset preload image so it is later possible to check "complete" property + var img = F.imgPreload = new Image(); + + img.onload = function () { + this.onload = this.onerror = null; + + F.coming.width = this.width / F.opts.pixelRatio; + F.coming.height = this.height / F.opts.pixelRatio; + + F._afterLoad(); + }; + + img.onerror = function () { + this.onload = this.onerror = null; + + F._error( 'image' ); + }; + + img.src = F.coming.href; + + if (img.complete !== true) { + F.showLoading(); + } + }, + + _loadAjax: function () { + var coming = F.coming; + + F.showLoading(); + + F.ajaxLoad = $.ajax($.extend({}, coming.ajax, { + url: coming.href, + error: function (jqXHR, textStatus) { + if (F.coming && textStatus !== 'abort') { + F._error( 'ajax', jqXHR ); + + } else { + F.hideLoading(); + } + }, + success: function (data, textStatus) { + if (textStatus === 'success') { + coming.content = data; + + F._afterLoad(); + } + } + })); + }, + + _loadIframe: function() { + var coming = F.coming, + iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime())) + .attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling) + .attr('src', coming.href); + + // This helps IE + $(coming.wrap).bind('onReset', function () { + try { + $(this).find('iframe').hide().attr('src', '//about:blank').end().empty(); + } catch (e) {} + }); + + if (coming.iframe.preload) { + F.showLoading(); + + iframe.one('load', function() { + $(this).data('ready', 1); + + // iOS will lose scrolling if we resize + if (!isTouch) { + $(this).bind('load.fb', F.update); + } + + // Without this trick: + // - iframe won't scroll on iOS devices + // - IE7 sometimes displays empty iframe + $(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show(); + + F._afterLoad(); + }); + } + + coming.content = iframe.appendTo( coming.inner ); + + if (!coming.iframe.preload) { + F._afterLoad(); + } + }, + + _preloadImages: function() { + var group = F.group, + current = F.current, + len = group.length, + cnt = current.preload ? Math.min(current.preload, len - 1) : 0, + item, + i; + + for (i = 1; i <= cnt; i += 1) { + item = group[ (current.index + i ) % len ]; + + if (item.type === 'image' && item.href) { + new Image().src = item.href; + } + } + }, + + _afterLoad: function () { + var coming = F.coming, + previous = F.current, + placeholder = 'fancybox-placeholder', + current, + content, + type, + scrolling, + href, + embed; + + F.hideLoading(); + + if (!coming || F.isActive === false) { + return; + } + + if (false === F.trigger('afterLoad', coming, previous)) { + coming.wrap.stop(true).trigger('onReset').remove(); + + F.coming = null; + + return; + } + + if (previous) { + F.trigger('beforeChange', previous); + + previous.wrap.stop(true).removeClass('fancybox-opened') + .find('.fancybox-item, .fancybox-nav') + .remove(); + } + + F.unbindEvents(); + + current = coming; + content = coming.content; + type = coming.type; + scrolling = coming.scrolling; + + $.extend(F, { + wrap : current.wrap, + skin : current.skin, + outer : current.outer, + inner : current.inner, + current : current, + previous : previous + }); + + href = current.href; + + switch (type) { + case 'inline': + case 'ajax': + case 'html': + if (current.selector) { + content = $('
    ').html(content).find(current.selector); + + } else if (isQuery(content)) { + if (!content.data(placeholder)) { + content.data(placeholder, $('
    ').insertAfter( content ).hide() ); + } + + content = content.show().detach(); + + current.wrap.bind('onReset', function () { + if ($(this).find(content).length) { + content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false); + } + }); + } + break; + + case 'image': + content = current.tpl.image.replace(/\{href\}/g, href); + break; + + case 'swf': + content = ''; + embed = ''; + + $.each(current.swf, function(name, val) { + content += ''; + embed += ' ' + name + '="' + val + '"'; + }); + + content += ''; + break; + } + + if (!(isQuery(content) && content.parent().is(current.inner))) { + current.inner.append( content ); + } + + // Give a chance for helpers or callbacks to update elements + F.trigger('beforeShow'); + + // Set scrolling before calculating dimensions + current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling)); + + // Set initial dimensions and start position + F._setDimension(); + + F.reposition(); + + F.isOpen = false; + F.coming = null; + + F.bindEvents(); + + if (!F.isOpened) { + $('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove(); + + } else if (previous.prevMethod) { + F.transitions[ previous.prevMethod ](); + } + + F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ](); + + F._preloadImages(); + }, + + _setDimension: function () { + var viewport = F.getViewport(), + steps = 0, + canShrink = false, + canExpand = false, + wrap = F.wrap, + skin = F.skin, + inner = F.inner, + current = F.current, + width = current.width, + height = current.height, + minWidth = current.minWidth, + minHeight = current.minHeight, + maxWidth = current.maxWidth, + maxHeight = current.maxHeight, + scrolling = current.scrolling, + scrollOut = current.scrollOutside ? current.scrollbarWidth : 0, + margin = current.margin, + wMargin = getScalar(margin[1] + margin[3]), + hMargin = getScalar(margin[0] + margin[2]), + wPadding, + hPadding, + wSpace, + hSpace, + origWidth, + origHeight, + origMaxWidth, + origMaxHeight, + ratio, + width_, + height_, + maxWidth_, + maxHeight_, + iframe, + body; + + // Reset dimensions so we could re-check actual size + wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp'); + + wPadding = getScalar(skin.outerWidth(true) - skin.width()); + hPadding = getScalar(skin.outerHeight(true) - skin.height()); + + // Any space between content and viewport (margin, padding, border, title) + wSpace = wMargin + wPadding; + hSpace = hMargin + hPadding; + + origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width; + origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height; + + if (current.type === 'iframe') { + iframe = current.content; + + if (current.autoHeight && iframe.data('ready') === 1) { + try { + if (iframe[0].contentWindow.document.location) { + inner.width( origWidth ).height(9999); + + body = iframe.contents().find('body'); + + if (scrollOut) { + body.css('overflow-x', 'hidden'); + } + + origHeight = body.outerHeight(true); + } + + } catch (e) {} + } + + } else if (current.autoWidth || current.autoHeight) { + inner.addClass( 'fancybox-tmp' ); + + // Set width or height in case we need to calculate only one dimension + if (!current.autoWidth) { + inner.width( origWidth ); + } + + if (!current.autoHeight) { + inner.height( origHeight ); + } + + if (current.autoWidth) { + origWidth = inner.width(); + } + + if (current.autoHeight) { + origHeight = inner.height(); + } + + inner.removeClass( 'fancybox-tmp' ); + } + + width = getScalar( origWidth ); + height = getScalar( origHeight ); + + ratio = origWidth / origHeight; + + // Calculations for the content + minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth); + maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth); + + minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight); + maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight); + + // These will be used to determine if wrap can fit in the viewport + origMaxWidth = maxWidth; + origMaxHeight = maxHeight; + + if (current.fitToView) { + maxWidth = Math.min(viewport.w - wSpace, maxWidth); + maxHeight = Math.min(viewport.h - hSpace, maxHeight); + } + + maxWidth_ = viewport.w - wMargin; + maxHeight_ = viewport.h - hMargin; + + if (current.aspectRatio) { + if (width > maxWidth) { + width = maxWidth; + height = getScalar(width / ratio); + } + + if (height > maxHeight) { + height = maxHeight; + width = getScalar(height * ratio); + } + + if (width < minWidth) { + width = minWidth; + height = getScalar(width / ratio); + } + + if (height < minHeight) { + height = minHeight; + width = getScalar(height * ratio); + } + + } else { + width = Math.max(minWidth, Math.min(width, maxWidth)); + + if (current.autoHeight && current.type !== 'iframe') { + inner.width( width ); + + height = inner.height(); + } + + height = Math.max(minHeight, Math.min(height, maxHeight)); + } + + // Try to fit inside viewport (including the title) + if (current.fitToView) { + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + // Real wrap dimensions + width_ = wrap.width(); + height_ = wrap.height(); + + if (current.aspectRatio) { + while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) { + if (steps++ > 19) { + break; + } + + height = Math.max(minHeight, Math.min(maxHeight, height - 10)); + width = getScalar(height * ratio); + + if (width < minWidth) { + width = minWidth; + height = getScalar(width / ratio); + } + + if (width > maxWidth) { + width = maxWidth; + height = getScalar(width / ratio); + } + + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + width_ = wrap.width(); + height_ = wrap.height(); + } + + } else { + width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_))); + height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_))); + } + } + + if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) { + width += scrollOut; + } + + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + width_ = wrap.width(); + height_ = wrap.height(); + + canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight; + canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight)); + + $.extend(current, { + dim : { + width : getValue( width_ ), + height : getValue( height_ ) + }, + origWidth : origWidth, + origHeight : origHeight, + canShrink : canShrink, + canExpand : canExpand, + wPadding : wPadding, + hPadding : hPadding, + wrapSpace : height_ - skin.outerHeight(true), + skinSpace : skin.height() - height + }); + + if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) { + inner.height('auto'); + } + }, + + _getPosition: function (onlyAbsolute) { + var current = F.current, + viewport = F.getViewport(), + margin = current.margin, + width = F.wrap.width() + margin[1] + margin[3], + height = F.wrap.height() + margin[0] + margin[2], + rez = { + position: 'absolute', + top : margin[0], + left : margin[3] + }; + + if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) { + rez.position = 'fixed'; + + } else if (!current.locked) { + rez.top += viewport.y; + rez.left += viewport.x; + } + + rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio))); + rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio))); + + return rez; + }, + + _afterZoomIn: function () { + var current = F.current; + + if (!current) { + return; + } + + F.isOpen = F.isOpened = true; + + F.wrap.css('overflow', 'visible').addClass('fancybox-opened').hide().show(0); + + F.update(); + + // Assign a click event + if ( current.closeClick || (current.nextClick && F.group.length > 1) ) { + F.inner.css('cursor', 'pointer').bind('click.fb', function(e) { + if (!$(e.target).is('a') && !$(e.target).parent().is('a')) { + e.preventDefault(); + + F[ current.closeClick ? 'close' : 'next' ](); + } + }); + } + + // Create a close button + if (current.closeBtn) { + $(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) { + e.preventDefault(); + + F.close(); + }); + } + + // Create navigation arrows + if (current.arrows && F.group.length > 1) { + if (current.loop || current.index > 0) { + $(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev); + } + + if (current.loop || current.index < F.group.length - 1) { + $(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next); + } + } + + F.trigger('afterShow'); + + // Stop the slideshow if this is the last item + if (!current.loop && current.index === current.group.length - 1) { + + F.play( false ); + + } else if (F.opts.autoPlay && !F.player.isActive) { + F.opts.autoPlay = false; + + F.play(true); + } + }, + + _afterZoomOut: function ( obj ) { + obj = obj || F.current; + + $('.fancybox-wrap').trigger('onReset').remove(); + + $.extend(F, { + group : {}, + opts : {}, + router : false, + current : null, + isActive : false, + isOpened : false, + isOpen : false, + isClosing : false, + wrap : null, + skin : null, + outer : null, + inner : null + }); + + F.trigger('afterClose', obj); + } + }); + + /* + * Default transitions + */ + + F.transitions = { + getOrigPosition: function () { + var current = F.current, + element = current.element, + orig = current.orig, + pos = {}, + width = 50, + height = 50, + hPadding = current.hPadding, + wPadding = current.wPadding, + viewport = F.getViewport(); + + if (!orig && current.isDom && element.is(':visible')) { + orig = element.find('img:first'); + + if (!orig.length) { + orig = element; + } + } + + if (isQuery(orig)) { + pos = orig.offset(); + + if (orig.is('img')) { + width = orig.outerWidth(); + height = orig.outerHeight(); + } + + } else { + pos.top = viewport.y + (viewport.h - height) * current.topRatio; + pos.left = viewport.x + (viewport.w - width) * current.leftRatio; + } + + if (F.wrap.css('position') === 'fixed' || current.locked) { + pos.top -= viewport.y; + pos.left -= viewport.x; + } + + pos = { + top : getValue(pos.top - hPadding * current.topRatio), + left : getValue(pos.left - wPadding * current.leftRatio), + width : getValue(width + wPadding), + height : getValue(height + hPadding) + }; + + return pos; + }, + + step: function (now, fx) { + var ratio, + padding, + value, + prop = fx.prop, + current = F.current, + wrapSpace = current.wrapSpace, + skinSpace = current.skinSpace; + + if (prop === 'width' || prop === 'height') { + ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start); + + if (F.isClosing) { + ratio = 1 - ratio; + } + + padding = prop === 'width' ? current.wPadding : current.hPadding; + value = now - padding; + + F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) ); + F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) ); + } + }, + + zoomIn: function () { + var current = F.current, + startPos = current.pos, + effect = current.openEffect, + elastic = effect === 'elastic', + endPos = $.extend({opacity : 1}, startPos); + + // Remove "position" property that breaks older IE + delete endPos.position; + + if (elastic) { + startPos = this.getOrigPosition(); + + if (current.openOpacity) { + startPos.opacity = 0.1; + } + + } else if (effect === 'fade') { + startPos.opacity = 0.1; + } + + F.wrap.css(startPos).animate(endPos, { + duration : effect === 'none' ? 0 : current.openSpeed, + easing : current.openEasing, + step : elastic ? this.step : null, + complete : F._afterZoomIn + }); + }, + + zoomOut: function () { + var current = F.current, + effect = current.closeEffect, + elastic = effect === 'elastic', + endPos = {opacity : 0.1}; + + if (elastic) { + endPos = this.getOrigPosition(); + + if (current.closeOpacity) { + endPos.opacity = 0.1; + } + } + + F.wrap.animate(endPos, { + duration : effect === 'none' ? 0 : current.closeSpeed, + easing : current.closeEasing, + step : elastic ? this.step : null, + complete : F._afterZoomOut + }); + }, + + changeIn: function () { + var current = F.current, + effect = current.nextEffect, + startPos = current.pos, + endPos = { opacity : 1 }, + direction = F.direction, + distance = 200, + field; + + startPos.opacity = 0.1; + + if (effect === 'elastic') { + field = direction === 'down' || direction === 'up' ? 'top' : 'left'; + + if (direction === 'down' || direction === 'right') { + startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance); + endPos[ field ] = '+=' + distance + 'px'; + + } else { + startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance); + endPos[ field ] = '-=' + distance + 'px'; + } + } + + // Workaround for http://bugs.jquery.com/ticket/12273 + if (effect === 'none') { + F._afterZoomIn(); + + } else { + F.wrap.css(startPos).animate(endPos, { + duration : current.nextSpeed, + easing : current.nextEasing, + complete : F._afterZoomIn + }); + } + }, + + changeOut: function () { + var previous = F.previous, + effect = previous.prevEffect, + endPos = { opacity : 0.1 }, + direction = F.direction, + distance = 200; + + if (effect === 'elastic') { + endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px'; + } + + previous.wrap.animate(endPos, { + duration : effect === 'none' ? 0 : previous.prevSpeed, + easing : previous.prevEasing, + complete : function () { + $(this).trigger('onReset').remove(); + } + }); + } + }; + + /* + * Overlay helper + */ + + F.helpers.overlay = { + defaults : { + closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay + speedOut : 200, // duration of fadeOut animation + showEarly : true, // indicates if should be opened immediately or wait until the content is ready + css : {}, // custom CSS properties + locked : !isTouch, // if true, the content will be locked into overlay + fixed : true // if false, the overlay CSS position property will not be set to "fixed" + }, + + overlay : null, // current handle + fixed : false, // indicates if the overlay has position "fixed" + el : $('html'), // element that contains "the lock" + + // Public methods + create : function(opts) { + var parent; + + opts = $.extend({}, this.defaults, opts); + + if (this.overlay) { + this.close(); + } + + parent = F.coming ? F.coming.parent : opts.parent; + + this.overlay = $('
    ').appendTo( parent && parent.lenth ? parent : 'body' ); + this.fixed = false; + + if (opts.fixed && F.defaults.fixed) { + this.overlay.addClass('fancybox-overlay-fixed'); + + this.fixed = true; + } + }, + + open : function(opts) { + var that = this; + + opts = $.extend({}, this.defaults, opts); + + if (this.overlay) { + this.overlay.unbind('.overlay').width('auto').height('auto'); + + } else { + this.create(opts); + } + + if (!this.fixed) { + W.bind('resize.overlay', $.proxy( this.update, this) ); + + this.update(); + } + + if (opts.closeClick) { + this.overlay.bind('click.overlay', function(e) { + if ($(e.target).hasClass('fancybox-overlay')) { + if (F.isActive) { + F.close(); + } else { + that.close(); + } + + return false; + } + }); + } + + this.overlay.css( opts.css ).show(); + }, + + close : function() { + W.unbind('resize.overlay'); + + if (this.el.hasClass('fancybox-lock')) { + $('.fancybox-margin').removeClass('fancybox-margin'); + + this.el.removeClass('fancybox-lock'); + + W.scrollTop( this.scrollV ).scrollLeft( this.scrollH ); + } + + $('.fancybox-overlay').remove().hide(); + + $.extend(this, { + overlay : null, + fixed : false + }); + }, + + // Private, callbacks + + update : function () { + var width = '100%', offsetWidth; + + // Reset width/height so it will not mess + this.overlay.width(width).height('100%'); + + // jQuery does not return reliable result for IE + if (IE) { + offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth); + + if (D.width() > offsetWidth) { + width = D.width(); + } + + } else if (D.width() > W.width()) { + width = D.width(); + } + + this.overlay.width(width).height(D.height()); + }, + + // This is where we can manipulate DOM, because later it would cause iframes to reload + onReady : function (opts, obj) { + var overlay = this.overlay; + + $('.fancybox-overlay').stop(true, true); + + if (!overlay) { + this.create(opts); + } + + if (opts.locked && this.fixed && obj.fixed) { + obj.locked = this.overlay.append( obj.wrap ); + obj.fixed = false; + } + + if (opts.showEarly === true) { + this.beforeShow.apply(this, arguments); + } + }, + + beforeShow : function(opts, obj) { + if (obj.locked && !this.el.hasClass('fancybox-lock')) { + if (this.fixPosition !== false) { + $('*').filter(function(){ + return ($(this).css('position') === 'fixed' && !$(this).hasClass("fancybox-overlay") && !$(this).hasClass("fancybox-wrap") ); + }).addClass('fancybox-margin'); + } + + this.el.addClass('fancybox-margin'); + + this.scrollV = W.scrollTop(); + this.scrollH = W.scrollLeft(); + + this.el.addClass('fancybox-lock'); + + W.scrollTop( this.scrollV ).scrollLeft( this.scrollH ); + } + + this.open(opts); + }, + + onUpdate : function() { + if (!this.fixed) { + this.update(); + } + }, + + afterClose: function (opts) { + // Remove overlay if exists and fancyBox is not opening + // (e.g., it is not being open using afterClose callback) + if (this.overlay && !F.coming) { + this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this )); + } + } + }; + + /* + * Title helper + */ + + F.helpers.title = { + defaults : { + type : 'float', // 'float', 'inside', 'outside' or 'over', + position : 'bottom' // 'top' or 'bottom' + }, + + beforeShow: function (opts) { + var current = F.current, + text = current.title, + type = opts.type, + title, + target; + + if ($.isFunction(text)) { + text = text.call(current.element, current); + } + + if (!isString(text) || $.trim(text) === '') { + return; + } + + title = $('
    ' + text + '
    '); + + switch (type) { + case 'inside': + target = F.skin; + break; + + case 'outside': + target = F.wrap; + break; + + case 'over': + target = F.inner; + break; + + default: // 'float' + target = F.skin; + + title.appendTo('body'); + + if (IE) { + title.width( title.width() ); + } + + title.wrapInner(''); + + //Increase bottom margin so this title will also fit into viewport + F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) ); + break; + } + + title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target); + } + }; + + // jQuery plugin initialization + $.fn.fancybox = function (options) { + var index, + that = $(this), + selector = this.selector || '', + run = function(e) { + var what = $(this).blur(), idx = index, relType, relVal; + + if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) { + relType = options.groupAttr || 'data-fancybox-group'; + relVal = what.attr(relType); + + if (!relVal) { + relType = 'rel'; + relVal = what.get(0)[ relType ]; + } + + if (relVal && relVal !== '' && relVal !== 'nofollow') { + what = selector.length ? $(selector) : that; + what = what.filter('[' + relType + '="' + relVal + '"]'); + idx = what.index(this); + } + + options.index = idx; + + // Stop an event from bubbling if everything is fine + if (F.open(what, options) !== false) { + e.preventDefault(); + } + } + }; + + options = options || {}; + index = options.index || 0; + + if (!selector || options.live === false) { + that.unbind('click.fb-start').bind('click.fb-start', run); + + } else { + D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run); + } + + this.filter('[data-fancybox-start=1]').trigger('click'); + + return this; + }; + + // Tests that need a body at doc ready + D.ready(function() { + var w1, w2; + + if ( $.scrollbarWidth === undefined ) { + // http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth + $.scrollbarWidth = function() { + var parent = $('
    ').appendTo('body'), + child = parent.children(), + width = child.innerWidth() - child.height( 99 ).innerWidth(); + + parent.remove(); + + return width; + }; + } + + if ( $.support.fixedPosition === undefined ) { + $.support.fixedPosition = (function() { + var elem = $('
    ').appendTo('body'), + fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 ); + + elem.remove(); + + return fixed; + }()); + } + + $.extend(F.defaults, { + scrollbarWidth : $.scrollbarWidth(), + fixed : $.support.fixedPosition, + parent : $('body') + }); + + //Get real width of page scroll-bar + w1 = $(window).width(); + + H.addClass('fancybox-lock-test'); + + w2 = $(window).width(); + + H.removeClass('fancybox-lock-test'); + + $("").appendTo("head"); + }); + +}(window, document, jQuery)); \ No newline at end of file diff --git a/themes/landscape/source/fancybox/jquery.fancybox.pack.js b/themes/landscape/source/fancybox/jquery.fancybox.pack.js new file mode 100644 index 0000000..2db1280 --- /dev/null +++ b/themes/landscape/source/fancybox/jquery.fancybox.pack.js @@ -0,0 +1,46 @@ +/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */ +(function(s,H,f,w){var K=f("html"),q=f(s),p=f(H),b=f.fancybox=function(){b.open.apply(this,arguments)},J=navigator.userAgent.match(/msie/i),C=null,t=H.createTouch!==w,u=function(a){return a&&a.hasOwnProperty&&a instanceof f},r=function(a){return a&&"string"===f.type(a)},F=function(a){return r(a)&&0
    ',image:'',iframe:'",error:'

    The requested content cannot be loaded.
    Please try again later.

    ',closeBtn:'',next:'',prev:''},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0, +openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1, +isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=u(a)?f(a).get():[a]),f.each(a,function(e,c){var l={},g,h,k,n,m;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),u(c)?(l={href:c.data("fancybox-href")||c.attr("href"),title:f("
    ").text(c.data("fancybox-title")||c.attr("title")).html(),isDom:!0,element:c}, +f.metadata&&f.extend(!0,l,c.metadata())):l=c);g=d.href||l.href||(r(c)?c:null);h=d.title!==w?d.title:l.title||"";n=(k=d.content||l.content)?"html":d.type||l.type;!n&&l.isDom&&(n=c.data("fancybox-type"),n||(n=(n=c.prop("class").match(/fancybox\.(\w+)/))?n[1]:null));r(g)&&(n||(b.isImage(g)?n="image":b.isSWF(g)?n="swf":"#"===g.charAt(0)?n="inline":r(c)&&(n="html",k=c)),"ajax"===n&&(m=g.split(/\s+/,2),g=m.shift(),m=m.shift()));k||("inline"===n?g?k=f(r(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):l.isDom&&(k=c): +"html"===n?k=g:n||g||!l.isDom||(n="inline",k=c));f.extend(l,{href:g,type:n,content:k,title:h,selector:m});a[e]=l}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==w&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1===b.trigger("onCancel")||(b.hideLoading(),a&&(b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(), +b.coming=null,b.current||b._afterZoomOut(a)))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(b.isOpen&&!0!==a?(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]()):(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&& +(b.player.timer=setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};!0===a||!b.player.isActive&&!1!==a?b.current&&(b.current.loop||b.current.index=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==w&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,l;c&&(l=b._getPosition(d),a&&"scroll"===a.type?(delete l.position,c.stop(!0,!0).animate(l,200)):(c.css(l),e.pos=f.extend({},e.dim,l)))}, +update:function(a){var d=a&&a.originalEvent&&a.originalEvent.type,e=!d||"orientationchange"===d;e&&(clearTimeout(C),C=null);b.isOpen&&!C&&(C=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),C=null)},e&&!t?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,t&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"), +b.trigger("onUpdate")),b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('
    ').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){27===(a.which||a.keyCode)&&(a.preventDefault(),b.cancel())});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}));b.trigger("onLoading")},getViewport:function(){var a=b.current&& +b.current.locked||!1,d={x:q.scrollLeft(),y:q.scrollTop()};a&&a.length?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=t&&s.innerWidth?s.innerWidth:q.width(),d.h=t&&s.innerHeight?s.innerHeight:q.height());return d},unbindEvents:function(){b.wrap&&u(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");q.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(q.bind("orientationchange.fb"+(t?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c= +e.which||e.keyCode,l=e.target||e.srcElement;if(27===c&&b.coming)return!1;e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||l&&(l.type||f(l).is("[contenteditable]"))||f.each(d,function(d,l){if(1h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();0!==c&&!k&&1g||0>l)&&b.next(0>g?"up":"right"),d.preventDefault())}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&& +b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,{},b.helpers[d].defaults,e),c)})}p.trigger(a)},isImage:function(a){return r(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return r(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=m(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c, +c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"=== +c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=!0);"iframe"===c&&t&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(t?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,x(d.padding[a]))});b.trigger("onReady"); +if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width= +this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming, +d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",t?"auto":a.iframe.scrolling).attr("src",a.href);f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);t||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload|| +b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,l,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove()); +b.unbindEvents();e=a.content;c=a.type;l=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("
    ").html(e).find(a.selector):u(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('
    ').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder", +!1)}));break;case "image":e=a.tpl.image.replace(/\{href\}/g,g);break;case "swf":e='',h="",f.each(a.swf,function(a,b){e+='';h+=" "+a+'="'+b+'"'}),e+='"}u(e)&&e.parent().is(a.inner)||a.inner.append(e);b.trigger("beforeShow"); +a.inner.css("overflow","yes"===l?"scroll":"no"===l?"hidden":l);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(!b.isOpened)f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();else if(d.prevMethod)b.transitions[d.prevMethod]();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,l=b.skin,g=b.inner,h=b.current,c=h.width,k=h.height,n=h.minWidth,v=h.minHeight,p=h.maxWidth, +q=h.maxHeight,t=h.scrolling,r=h.scrollOutside?h.scrollbarWidth:0,y=h.margin,z=m(y[1]+y[3]),s=m(y[0]+y[2]),w,A,u,D,B,G,C,E,I;e.add(l).add(g).width("auto").height("auto").removeClass("fancybox-tmp");y=m(l.outerWidth(!0)-l.width());w=m(l.outerHeight(!0)-l.height());A=z+y;u=s+w;D=F(c)?(a.w-A)*m(c)/100:c;B=F(k)?(a.h-u)*m(k)/100:k;if("iframe"===h.type){if(I=h.content,h.autoHeight&&1===I.data("ready"))try{I[0].contentWindow.document.location&&(g.width(D).height(9999),G=I.contents().find("body"),r&&G.css("overflow-x", +"hidden"),B=G.outerHeight(!0))}catch(H){}}else if(h.autoWidth||h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(D),h.autoHeight||g.height(B),h.autoWidth&&(D=g.width()),h.autoHeight&&(B=g.height()),g.removeClass("fancybox-tmp");c=m(D);k=m(B);E=D/B;n=m(F(n)?m(n,"w")-A:n);p=m(F(p)?m(p,"w")-A:p);v=m(F(v)?m(v,"h")-u:v);q=m(F(q)?m(q,"h")-u:q);G=p;C=q;h.fitToView&&(p=Math.min(a.w-A,p),q=Math.min(a.h-u,q));A=a.w-z;s=a.h-s;h.aspectRatio?(c>p&&(c=p,k=m(c/E)),k>q&&(k=q,c=m(k*E)),cA||z>s)&&c>n&&k>v&&!(19p&&(c=p,k=m(c/E)),g.width(c).height(k),e.width(c+y),a=e.width(),z=e.height();else c=Math.max(n,Math.min(c,c-(a-A))),k=Math.max(v,Math.min(k,k-(z-s)));r&&"auto"===t&&kA||z>s)&&c>n&&k>v;c=h.aspectRatio?cv&&k
    ').appendTo(d&&d.lenth?d:"body");this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(q.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay", +function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){q.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),this.el.removeClass("fancybox-lock"),q.scrollTop(this.scrollV).scrollLeft(this.scrollH));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%"); +J?(b=Math.max(H.documentElement.offsetWidth,H.body.offsetWidth),p.width()>b&&(a=p.width())):p.width()>q.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&this.fixed&&b.fixed&&(b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){b.locked&&!this.el.hasClass("fancybox-lock")&&(!1!==this.fixPosition&&f("*").filter(function(){return"fixed"=== +f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin"),this.scrollV=q.scrollTop(),this.scrollH=q.scrollLeft(),this.el.addClass("fancybox-lock"),q.scrollTop(this.scrollV).scrollLeft(this.scrollH));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float", +position:"bottom"},beforeShow:function(a){var d=b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(r(e)&&""!==f.trim(e)){d=f('
    '+e+"
    ");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),J&&d.width(d.width()),d.wrapInner(''),b.current.margin[2]+=Math.abs(m(d.css("margin-bottom")))}d["top"===a.position?"prependTo": +"appendTo"](c)}}};f.fn.fancybox=function(a){var d,e=f(this),c=this.selector||"",l=function(g){var h=f(this).blur(),k=d,l,m;g.ctrlKey||g.altKey||g.shiftKey||g.metaKey||h.is(".fancybox-wrap")||(l=a.groupAttr||"data-fancybox-group",m=h.attr(l),m||(l="rel",m=h.get(0)[l]),m&&""!==m&&"nofollow"!==m&&(h=c.length?f(c):e,h=h.filter("["+l+'="'+m+'"]'),k=h.index(this)),a.index=k,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;c&&!1!==a.live?p.undelegate(c,"click.fb-start").delegate(c+":not('.fancybox-item, .fancybox-nav')", +"click.fb-start",l):e.unbind("click.fb-start").bind("click.fb-start",l);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===w&&(f.scrollbarWidth=function(){var a=f('
    ').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});f.support.fixedPosition===w&&(f.support.fixedPosition=function(){var a=f('
    ').appendTo("body"), +b=20===a[0].offsetTop||15===a[0].offsetTop;a.remove();return b}());f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(s).width();K.addClass("fancybox-lock-test");d=f(s).width();K.removeClass("fancybox-lock-test");f("").appendTo("head")})})(window,document,jQuery); \ No newline at end of file diff --git a/themes/landscape/source/js/script.js b/themes/landscape/source/js/script.js new file mode 100644 index 0000000..1e58767 --- /dev/null +++ b/themes/landscape/source/js/script.js @@ -0,0 +1,137 @@ +(function($){ + // Search + var $searchWrap = $('#search-form-wrap'), + isSearchAnim = false, + searchAnimDuration = 200; + + var startSearchAnim = function(){ + isSearchAnim = true; + }; + + var stopSearchAnim = function(callback){ + setTimeout(function(){ + isSearchAnim = false; + callback && callback(); + }, searchAnimDuration); + }; + + $('#nav-search-btn').on('click', function(){ + if (isSearchAnim) return; + + startSearchAnim(); + $searchWrap.addClass('on'); + stopSearchAnim(function(){ + $('.search-form-input').focus(); + }); + }); + + $('.search-form-input').on('blur', function(){ + startSearchAnim(); + $searchWrap.removeClass('on'); + stopSearchAnim(); + }); + + // Share + $('body').on('click', function(){ + $('.article-share-box.on').removeClass('on'); + }).on('click', '.article-share-link', function(e){ + e.stopPropagation(); + + var $this = $(this), + url = $this.attr('data-url'), + encodedUrl = encodeURIComponent(url), + id = 'article-share-box-' + $this.attr('data-id'), + offset = $this.offset(); + + if ($('#' + id).length){ + var box = $('#' + id); + + if (box.hasClass('on')){ + box.removeClass('on'); + return; + } + } else { + var html = [ + '
    ', + '', + '
    ', + '', + '', + '', + '', + '
    ', + '
    ' + ].join(''); + + var box = $(html); + + $('body').append(box); + } + + $('.article-share-box.on').hide(); + + box.css({ + top: offset.top + 25, + left: offset.left + }).addClass('on'); + }).on('click', '.article-share-box', function(e){ + e.stopPropagation(); + }).on('click', '.article-share-box-input', function(){ + $(this).select(); + }).on('click', '.article-share-box-link', function(e){ + e.preventDefault(); + e.stopPropagation(); + + window.open(this.href, 'article-share-box-window-' + Date.now(), 'width=500,height=450'); + }); + + // Caption + $('.article-entry').each(function(i){ + $(this).find('img').each(function(){ + if ($(this).parent().hasClass('fancybox')) return; + + var alt = this.alt; + + if (alt) $(this).after('' + alt + ''); + + $(this).wrap(''); + }); + + $(this).find('.fancybox').each(function(){ + $(this).attr('rel', 'article' + i); + }); + }); + + if ($.fancybox){ + $('.fancybox').fancybox(); + } + + // Mobile nav + var $container = $('#container'), + isMobileNavAnim = false, + mobileNavAnimDuration = 200; + + var startMobileNavAnim = function(){ + isMobileNavAnim = true; + }; + + var stopMobileNavAnim = function(){ + setTimeout(function(){ + isMobileNavAnim = false; + }, mobileNavAnimDuration); + } + + $('#main-nav-toggle').on('click', function(){ + if (isMobileNavAnim) return; + + startMobileNavAnim(); + $container.toggleClass('mobile-nav-on'); + stopMobileNavAnim(); + }); + + $('#wrap').on('click', function(){ + if (isMobileNavAnim || !$container.hasClass('mobile-nav-on')) return; + + $container.removeClass('mobile-nav-on'); + }); +})(jQuery); \ No newline at end of file