Repository: mholt/PapaParse Branch: master Commit: cc8c801f83fa Files: 43 Total size: 48.5 MB Directory structure: gitextract_8bywzl85/ ├── .eslintrc.js ├── .github/ │ └── workflows/ │ └── node.js.yml ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── Gruntfile.js ├── LICENSE ├── README.md ├── bower.json ├── docs/ │ ├── CNAME │ ├── Caddyfile │ ├── demo.html │ ├── docs.html │ ├── faq.html │ ├── index.html │ └── resources/ │ ├── css/ │ │ ├── common.css │ │ ├── demo.css │ │ ├── home.css │ │ ├── tomorrow.highlight.css │ │ └── unsemantic.css │ ├── files/ │ │ ├── big.csv │ │ ├── malformed.tsv │ │ └── normal.csv │ └── js/ │ ├── common.js │ ├── demo.js │ ├── home.js │ ├── lovers.js │ └── papaparse.js ├── package.json ├── papaparse.js ├── player/ │ ├── player.css │ ├── player.html │ └── player.js └── tests/ ├── .eslintrc.js ├── long-sample.csv ├── node-tests.js ├── sample-header.csv ├── sample.csv ├── test-cases.js ├── test.js ├── tests.html ├── utf-8-bom-sample.csv └── verylong-sample.csv ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintrc.js ================================================ module.exports = { "parserOptions": { "ecmaVersion": 6 }, "env": { "es6": true, "browser": true, "worker": true, "node": true }, "extends": "eslint:recommended", "rules": { "accessor-pairs": "error", "array-bracket-newline": ["error", "consistent"], "array-bracket-spacing": [ "error", "never" ], "array-callback-return": "error", "array-element-newline": "off", "arrow-body-style": "error", "arrow-parens": "error", "arrow-spacing": "error", "block-scoped-var": "error", "block-spacing": "error", "brace-style": "off", "callback-return": "error", "camelcase": ["error", {"properties": "never"}], "capitalized-comments": "off", "class-methods-use-this": "error", "comma-dangle": "off", "comma-spacing": "off", "comma-style": [ "error", "last" ], "complexity": "off", "computed-property-spacing": [ "error", "never" ], "consistent-return": "off", "consistent-this": "off", "curly": "off", "default-case": "error", "dot-location": "error", "dot-notation": "error", "eol-last": "error", "eqeqeq": "error", "for-direction": "error", "func-call-spacing": "error", "func-name-matching": "error", "func-names": [ "error", "never" ], "func-style": "off", "function-paren-newline": "off", "generator-star-spacing": "error", "getter-return": "error", "global-require": "off", "guard-for-in": "off", "handle-callback-err": "error", "id-blacklist": "error", "id-length": "off", "id-match": "error", "implicit-arrow-linebreak": "error", "indent": [ "error", "tab" ], "indent-legacy": "off", "init-declarations": "off", "jsx-quotes": "error", "key-spacing": "error", "keyword-spacing": "off", "line-comment-position": "off", "linebreak-style": [ "error", "unix" ], "lines-around-comment": "off", "lines-around-directive": "off", "lines-between-class-members": "error", "max-depth": "off", "max-len": "off", "max-lines": "off", "max-nested-callbacks": "error", "max-params": "off", "max-statements": "off", "max-statements-per-line": "off", "multiline-comment-style": "off", "multiline-ternary": [ "error", "always-multiline" ], "new-parens": "error", "newline-after-var": "off", "newline-before-return": "off", "newline-per-chained-call": "off", "no-alert": "error", "no-array-constructor": "error", "no-await-in-loop": "error", "no-bitwise": "error", "no-buffer-constructor": "error", "no-caller": "error", "no-catch-shadow": "off", "no-cond-assign": [ "error", "except-parens" ], "no-confusing-arrow": "error", "no-console": "off", "no-continue": "off", "no-div-regex": "error", "no-duplicate-imports": "error", "no-else-return": "off", "no-empty": ["error", {"allowEmptyCatch": true}], "no-empty-function": "off", "no-eq-null": "error", "no-eval": "error", "no-extend-native": "error", "no-extra-bind": "error", "no-extra-label": "error", "no-extra-parens": "off", "no-floating-decimal": "error", "no-implicit-globals": "error", "no-implied-eval": "error", "no-inline-comments": "off", "no-inner-declarations": [ "error", "functions" ], "no-invalid-this": "off", "no-iterator": "error", "no-label-var": "error", "no-labels": "error", "no-lone-blocks": "error", "no-lonely-if": "error", "no-loop-func": "error", "no-magic-numbers": "off", "no-mixed-operators": "off", "no-mixed-requires": "error", "no-multi-assign": "error", "no-multi-spaces": "off", "no-multi-str": "error", "no-multiple-empty-lines": "off", "no-native-reassign": "error", "no-negated-condition": "off", "no-negated-in-lhs": "error", "no-nested-ternary": "off", "no-new": "error", "no-new-func": "error", "no-new-object": "error", "no-new-require": "error", "no-new-wrappers": "error", "no-octal-escape": "error", "no-param-reassign": "off", "no-path-concat": "off", "no-plusplus": "off", "no-process-env": "error", "no-process-exit": "error", "no-proto": "error", "no-prototype-builtins": "error", "no-restricted-globals": "error", "no-restricted-imports": "error", "no-restricted-modules": "error", "no-restricted-properties": "error", "no-restricted-syntax": "error", "no-return-assign": "error", "no-return-await": "error", "no-script-url": "error", "no-self-compare": "error", "no-sequences": "error", "no-shadow": "off", "no-shadow-restricted-names": "error", "no-spaced-func": "error", "no-sync": ["error", {"allowAtRootLevel": true}], "no-tabs": "off", "no-template-curly-in-string": "error", "no-ternary": "off", "no-throw-literal": "error", "no-trailing-spaces": "error", "no-undef-init": "error", "no-undefined": "off", "no-underscore-dangle": "off", "no-unmodified-loop-condition": "off", "no-unneeded-ternary": "error", "no-unused-expressions": "off", "no-unused-vars": ["error", {"args": "none"}], "no-use-before-define": "off", "no-useless-call": "error", "no-useless-computed-key": "error", "no-useless-concat": "error", "no-useless-constructor": "error", "no-useless-rename": "error", "no-useless-return": "off", "no-var": "off", "no-void": "error", "no-warning-comments": "error", "no-whitespace-before-property": "error", "no-with": "error", "nonblock-statement-body-position": [ "error", "any" ], "object-curly-newline": ["error", {"consistent": true}], "object-curly-spacing": "off", "object-shorthand": "off", "one-var": "off", "one-var-declaration-per-line": "off", "operator-assignment": [ "error", "always" ], "operator-linebreak": "off", "padded-blocks": "off", "padding-line-between-statements": "error", "prefer-arrow-callback": "off", "prefer-const": "error", "prefer-destructuring": "off", "prefer-numeric-literals": "error", "prefer-promise-reject-errors": "error", "prefer-reflect": "off", "prefer-rest-params": "off", "prefer-spread": "error", "prefer-template": "off", "quote-props": "off", "quotes": "off", "radix": [ "error", "as-needed" ], "require-await": "error", "require-jsdoc": "off", "rest-spread-spacing": "error", "semi": "error", "semi-spacing": "error", "semi-style": [ "error", "last" ], "sort-imports": "error", "sort-keys": "off", "sort-vars": "off", "space-before-blocks": "error", "space-before-function-paren": [ "error", "never" ], "space-in-parens": [ "error", "never" ], "space-infix-ops": "error", "space-unary-ops": [ "error", { "nonwords": false, "words": false } ], "spaced-comment": "off", "strict": "off", "switch-colon-spacing": "error", "symbol-description": "error", "template-curly-spacing": "error", "template-tag-spacing": "error", "unicode-bom": [ "error", "never" ], "valid-jsdoc": "off", "vars-on-top": "off", "wrap-iife": "off", "wrap-regex": "off", "yield-star-spacing": "error", "yoda": "off" } }; ================================================ FILE: .github/workflows/node.js.yml ================================================ # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: Node.js CI on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [20.x, 22.x, 24.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: npm install - run: npm run lint && npm run test-node && npm run build ================================================ FILE: .gitignore ================================================ _gitignore/ bower_components/ node_modules/ package-lock.json yarn.lock ================================================ FILE: .npmignore ================================================ _gitignore/ bower_components/ node_modules/ docs/ ================================================ FILE: CHANGELOG.md ================================================ # Changelog ## 5.5.3 ### Bug Fixes - Avoid infinite loop with duplicate header counting (#1095) ## 5.5.2 ### Bug Fixes - Only attempt to parse headers once, fixing performance issue (#1086) ### Maintenance - Do not run headless tests on CI (#1087) - Fix package URL in package.json ## 5.5.1 ### Maintenance - Revert "Remove ES6 features to allow minifying papaparse file" — updated `grunt-contrib-uglify` instead to support ES6+ - Update grunt-contrib-uglify version - Run build script in CI ## 5.5.0 ### Features - Add `skipFirstNLines` option to skip first N lines before parsing (#1021, #738) - Add `renamedHeaders` to parse result meta, reporting original-to-renamed header mappings (#990) ### Bug Fixes - Fix `escapeFormulae` option to handle boolean values correctly (#1025) - Fix cursor position when encountering duplicated headers (#997) - Only skip first N lines in the first chunk and don't incorrectly consume the header line (#1045, #1046) - Refactor header renaming logic to correctly handle duplicates (#1058, #1052, #1007) ### Performance - Faster duplicate header detection using a header map (#991) - Use `for` loop instead of `for...in` for header parsing to only iterate over array elements (#987) ### Maintenance - Update minimum ES version to 6 - Documentation and README improvements (#1002, #1034, #1041, #1044, #1060) ## 5.4.1 ### Bug Fixes - Remove jsperf.com links from README.md. (#986) - Only test duplicate headers on first row - Rename duplicated headers ================================================ FILE: Gruntfile.js ================================================ module.exports = function(grunt) { grunt.initConfig({ uglify: { options: { compress: { global_defs: { 'PAPA_BROWSER_CONTEXT': true }, dead_code: true }, output: { comments: 'some', }, }, min: { files: { 'papaparse.min.js': ['papaparse.js'] }, }, }, }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.registerTask('build', ['uglify']); grunt.registerTask('default', ['uglify']); }; ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2015 Matthew Holt 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. ================================================ FILE: README.md ================================================ Parse CSV with JavaScript ======================================== Papa Parse is the fastest in-browser CSV (or delimited text) parser for JavaScript. It is reliable and correct according to [RFC 4180](https://tools.ietf.org/html/rfc4180), and it comes with these features: - Easy to use - Parse CSV files directly (local or over the network) - Fast mode - Stream large files (even via HTTP) - Reverse parsing (converts JSON to CSV) - Auto-detect delimiter - Worker threads to keep your web page reactive - Header row support - Pause, resume, abort - Can convert numbers and booleans to their types - Optional jQuery integration to get files from `` elements - One of the only parsers that correctly handles line-breaks and quotations Papa Parse has **no dependencies** - not even jQuery. Install ------- papaparse is available on [npm](https://www.npmjs.com/package/papaparse). It can be installed with the following command: ```shell npm install papaparse ``` If you don't want to use npm, [papaparse.min.js](https://unpkg.com/papaparse@latest/papaparse.min.js) can be downloaded to your project source. Usage ----- ```js import Papa from 'papaparse'; Papa.parse(file, config); const csv = Papa.unparse(data[, config]); ``` Homepage & Demo ---------------- - [Homepage](https://www.papaparse.com) - [Demo](https://www.papaparse.com/demo) To learn how to use Papa Parse: - [Documentation](https://www.papaparse.com/docs) The website is hosted on [Github Pages](https://pages.github.com/). Its content is also included in the docs folder of this repository. If you want to contribute on it just clone the master of this repository and open a pull request. Papa Parse for Node -------------------- Papa Parse can parse a [Readable Stream](https://nodejs.org/api/stream.html#stream_readable_streams) instead of a [File](https://www.w3.org/TR/FileAPI/) when used in Node.js environments (in addition to plain strings). In this mode, `encoding` must, if specified, be a Node-supported character encoding. The `Papa.LocalChunkSize`, `Papa.RemoteChunkSize` , `download`, `withCredentials` and `worker` config options are unavailable. Papa Parse can also parse in a node streaming style which makes `.pipe` available. Simply pipe the [Readable Stream](https://nodejs.org/api/stream.html#stream_readable_streams) to the stream returned from `Papa.parse(Papa.NODE_STREAM_INPUT, options)`. The `Papa.LocalChunkSize`, `Papa.RemoteChunkSize` , `download`, `withCredentials`, `worker`, `step`, and `complete` config options are unavailable. To register a callback with the stream to process data, use the `data` event like so: `stream.on('data', callback)` and to signal the end of stream, use the 'end' event like so: `stream.on('end', callback)`. Get Started ----------- For usage instructions, see the [homepage](https://www.papaparse.com) and, for more detail, the [documentation](https://www.papaparse.com/docs). Tests ----- Papa Parse is under test. Download this repository, run `npm install`, then `npm test` to run the tests. Contributing ------------ To discuss a new feature or ask a question, open an issue. To fix a bug, submit a pull request to be credited with the [contributors](https://github.com/mholt/PapaParse/graphs/contributors)! Remember, a pull request, *with test*, is best. You may also discuss on Twitter with [#PapaParse](https://twitter.com/search?q=%23PapaParse&src=typd&f=realtime) or directly to me, [@mholt6](https://twitter.com/mholt6). If you contribute a patch, ensure the tests suite is running correctly. We run continuous integration on each pull request and will not accept a patch that breaks the tests. ================================================ FILE: bower.json ================================================ { "name": "papaparse", "main": "papaparse.js", "homepage": "http://papaparse.com", "authors": [ "Matthew Holt" ], "description": "Fast and powerful CSV parser for the browser. Converts CSV->JSON and JSON->CSV. Supports web workers and streaming large files.", "keywords": [ "csv", "parse", "parsing", "parser", "delimited", "text", "data", "auto-detect", "comma", "tab", "pipe", "file", "filereader", "stream", "worker", "workers", "ajax", "thread", "threading", "multi-threaded" ], "license": "MIT", "ignore": [ "**/.*", "node_modules", "bower_components", "test", "tests", "player" ] } ================================================ FILE: docs/CNAME ================================================ www.papaparse.com ================================================ FILE: docs/Caddyfile ================================================ localhost ext .html ================================================ FILE: docs/demo.html ================================================ Demo - Papa Parse

Choose a Demo

String
Local File(s)
Remote File
JSON to CSV
Choose one or more delimited text files for Papa to parse.
Sample files:
Type the URL of the file to be downloaded and parsed.
(cross-origin requests require Access-Control-Allow-Origin header)
Sample files:
Results will appear in the console of your browser's inspector tools
================================================ FILE: docs/docs.html ================================================ Documentation - Papa Parse

Documentation

Convert CSV to JSON

Delimited data can be parsed out of strings or files. Files that are parsed can be local or remote. Local files are opened with FileReader, and remote files are downloaded with XMLHttpRequest.

Parse string
Papa.parse(csvString[, config])
  • csvString is a string of delimited text to be parsed.
  • config is an optional config object.
  • Returns a parse results object (if not streaming or using worker).
Parse local files
Papa.parse(file, config)
  • file is a File object obtained from the DOM.
  • config is a config object which contains a callback.
  • Doesn't return anything. Results are provided asynchronously to a callback function.
Parse remote file
Papa.parse(url, {
	download: true,
	// rest of config ...
})
  • url is the path or URL to the file to download.
  • The second argument is a config object where download: true is set.
  • Doesn't return anything. Results are provided asynchronously to a callback function.
Using jQuery to select files
$('input[type=file]').parse({
	config: {
		// base config to use for each file
	},
	before: function(file, inputElem)
	{
		// executed before parsing each file begins;
		// what you return here controls the flow
	},
	error: function(err, file, inputElem, reason)
	{
		// executed if an error occurs while loading the file,
		// or if before callback aborted for some reason
	},
	complete: function()
	{
		// executed after all files are complete
	}
});
  • Select the file input elements with files you want to parse.
  • before is an optional callback that lets you inspect each file before parsing begins. Return an object like:
    {
    	action: "abort",
    	reason: "Some reason",
    	config: // altered config...
    }
    to alter the flow of parsing. Actions can be "abort" to skip this and all other files in the queue, "skip" to skip just this file, or "continue" to carry on (equivalent to returning nothing). reason can be a reason for aborting. config can be a modified configuration for parsing just this file.
  • The complete callback shown here is executed after all files are finished and does not receive any data. Use the complete callback in config for per-file results.

Convert JSON to CSV

Papa's unparse utility writes out correct delimited text strings given an array of arrays or an array of objects.

Unparse
Papa.unparse(data[, config])
  • Returns the resulting delimited text as a string.
  • data can be one of:
    • An array of arrays
    • An array of objects
    • An object explicitly defining fields and data
  • config is an optional config object
Default Unparse Config with all options

{
	quotes: false, //or array of booleans
	quoteChar: '"',
	escapeChar: '"',
	delimiter: ",",
	header: true,
	newline: "\r\n",
	skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.
	columns: null //or array of strings
}
					
Unparse Config Options
Option Explanation
quotes If true, forces all fields to be enclosed in quotes. If an array of true/false values, specifies which fields should be force-quoted (first boolean is for the first column, second boolean for the second column, ...). A function that returns a boolean values can be used to determine the quotes value of a cell. This function accepts the cell value and column index as parameters.
Note that this option is ignored for undefined, null and date-object values. The option escapeFormulae also takes precedence over this.
quoteChar The character used to quote fields.
escapeChar The character used to escape quoteChar inside field values.
delimiter The delimiting character. Multi-character delimiters are supported. It must not be found in Papa.BAD_DELIMITERS.
header If false, will omit the header row. If data is an array of arrays this option is ignored. If data is an array of objects the keys of the first object are the header row. If data is an object with the keys fields and data the fields are the header row.
newline The character used to determine newline sequence. It defaults to "\r\n".
skipEmptyLines If true, lines that are completely empty (those which evaluate to an empty string) will be skipped. If set to 'greedy', lines that don't have any content (those which have only whitespace after parsing) will also be skipped.
columns If data is an array of objects this option can be used to manually specify the keys (columns) you expect in the objects. If not set the keys of the first objects are used as column.
escapeFormulae If true, field values that begin with =, +, -, @, \t, or \r, will be prepended with a ' to defend against injection attacks, because Excel and LibreOffice will automatically parse such cells as formulae. You can override those values by setting this option to a regular expression
Examples
// Two-line, comma-delimited file
var csv = Papa.unparse([
	["1-1", "1-2", "1-3"],
	["2-1", "2-2", "2-3"]
]);
// With implicit header row
// (keys of first object populate header row)
var csv = Papa.unparse([
	{
		"Column 1": "foo",
		"Column 2": "bar"
	},
	{
		"Column 1": "abc",
		"Column 2": "def"
	}
]);
// Specifying fields and data explicitly
var csv = Papa.unparse({
	"fields": ["Column 1", "Column 2"],
	"data": [
		["foo", "bar"],
		["abc", "def"]
	]
});

The Parse Config Object

The parse function may be passed a configuration object. It defines settings, behavior, and callbacks used during parsing. Any properties left unspecified will resort to their default values.

Default Config With All Options
{
	delimiter: "",	// auto-detect
	newline: "",	// auto-detect
	quoteChar: '"',
	escapeChar: '"',
	header: false,
	transformHeader: undefined,
	dynamicTyping: false,
	preview: 0,
	encoding: "",
	worker: false,
	comments: false,
	step: undefined,
	complete: undefined,
	error: undefined,
	download: false,
	downloadRequestHeaders: undefined,
	downloadRequestBody: undefined,
	skipEmptyLines: false,
	chunk: undefined,
	chunkSize: undefined,
	fastMode: undefined,
	beforeFirstChunk: undefined,
	withCredentials: undefined,
	transform: undefined,
	delimitersToGuess: [',', '\t', '|', ';', Papa.RECORD_SEP, Papa.UNIT_SEP],
	skipFirstNLines: 0
}
Config Options
Option Explanation
delimiter The delimiting character. Leave blank to auto-detect from a list of most common delimiters, or any values passed in through delimitersToGuess. It can be a string or a function. If a string, it can be of any length (so multi-character delimiters are supported). If a function, it must accept the input as first parameter and it must return a string which will be used as delimiter. In both cases it cannot be found in Papa.BAD_DELIMITERS.
newline The newline sequence. Leave blank to auto-detect. Must be one of \r, \n, or \r\n.
quoteChar The character used to quote fields. The quoting of all fields is not mandatory. Any field which is not quoted will correctly read.
escapeChar The character used to escape the quote character within a field. If not set, this option will default to the value of quoteChar, meaning that the default escaping of quote character within a quoted field is using the quote character two times. (e.g. "column with ""quotes"" in text")
header If true, the first row of parsed data will be interpreted as field names. An array of field names will be returned in meta, and each row of data will be an object of values keyed by field name instead of a simple array. Rows with a different number of fields from the header row will produce an error. Warning: Duplicated field names will be automatically renamed to avoid values in previous fields having the same name to be overwritten. Renamed fields with original (or transformed by transformHeader) are stored in ParseResult.meta.renamedHeaders
transformHeader A function to apply on each header. Requires header to be true. The function receives the header as its first argument and the index as second.
Only available starting with version 5.0.
dynamicTyping If true, numeric and boolean data will be converted to their type instead of remaining strings. Numeric data must conform to the definition of a decimal literal. Numerical values greater than 2^53 or less than -2^53 will not be converted to numbers to preserve precision. European-formatted numbers must have commas and dots swapped. It also accepts an object or a function. If it's an object, its values should be a boolean to indicate if dynamic typing should be applied for each column number (or header name if using headers). If it's a function, it should return a boolean value for each field number (or name if using headers) which will be passed as first argument.
preview If > 0, only that many rows will be parsed.
encoding The encoding to use when opening local files. If specified, it must be a value supported by the FileReader API.
worker Whether or not to use a worker thread. Using a worker will keep your page reactive, but may be slightly slower.
comments A string that indicates a comment (for example, "#" or "//"). When Papa encounters a line starting with this string, it will skip the line.
step To stream the input, define a callback function:
step: function(results, parser) {
	console.log("Row data:", results.data);
	console.log("Row errors:", results.errors);
}
Streaming is necessary for large files which would otherwise crash the browser. You can call parser.abort() to abort parsing. And, except when using a Web Worker, you can call parser.pause() to pause it, and parser.resume() to resume.
complete The callback to execute when parsing is complete. It receives the parse results. If parsing a local file, the File is passed in, too:
complete: function(results, file) {
	console.log("Parsing complete:", results, file);
}
When streaming, parse results are not available in this callback.
error A callback to execute if FileReader encounters an error. The function is passed two arguments: the error and the File.
download If true, this indicates that the string you passed as the first argument to parse() is actually a URL from which to download a file and parse its contents.
downloadRequestHeaders If defined, should be an object that describes the headers, example:
										downloadRequestHeaders: {
'Authorization': 'token 123345678901234567890',
}
									
downloadRequestBody Use POST request on the URL of the download option. The value passed will be set as the body of the request.
skipEmptyLines If true, lines that are completely empty (those which evaluate to an empty string) will be skipped. If set to 'greedy', lines that don't have any content (those which have only whitespace after parsing) will also be skipped.
chunk A callback function, identical to step, which activates streaming. However, this function is executed after every chunk of the file is loaded and parsed rather than every row. Works only with local and remote files. Do not use both chunk and step callbacks together. For the function signature, see the documentation for the step function.
chunkSize Overrides Papa.LocalChunkSize and Papa.RemoteChunkSize. See configurable section to know the usage of both parameters.
fastMode Fast mode speeds up parsing significantly for large inputs. However, it only works when the input has no quoted fields. Fast mode will automatically be enabled if no " characters appear in the input. You can force fast mode either way by setting it to true or false.
beforeFirstChunk A function to execute before parsing the first chunk. Can be used with chunk or step streaming modes. The function receives as an argument the chunk about to be parsed, and it may return a modified chunk to parse. This is useful for stripping header lines (as long as the header fits in a single chunk).
withCredentials A boolean value passed directly into XMLHttpRequest's "withCredentials" property.
transform A function to apply on each value. The function receives the value as its first argument and the column number or header name when enabled as its second argument. The return value of the function will replace the value it received. The transform function is applied before dynamicTyping.
delimitersToGuess An array of delimiters to guess from if the delimiter option is not set.
skipFirstNLines To skip first N number of lines when converting a CSV file to JSON

The Parse Result Object

A parse result always contains three objects: data, errors, and meta. Data and errors are arrays, and meta is an object. In the step callback, the data array will only contain one element.

Result Structure
{
	data:   // array of parsed data
	errors: // array of errors
	meta:   // object with extra info
}
  • data is an array of rows. If header is false, rows are arrays; otherwise they are objects of data keyed by the field name.
  • errors is an array of errors.
  • meta contains extra information about the parse, such as delimiter used, the newline sequence, whether the process was aborted, etc. Properties in this object are not guaranteed to exist in all situations.
Data
// Example (header: false)
[
	["Column 1", "Column 2"],
	["foo", "bar"],
	["abc", "def"]
]

// Example (header: true)
[
	{
		"Column 1": "foo",
		"Column 2": "bar",
		"Column 1": "foo1",
	},
	{
		"Column 1": "abc",
		"Column 2": "def",
		"Column 1": "abc1",
	}
]
  • If header row is enabled and more fields are found on a row of data than in the header row, an extra field will appear in that row called __parsed_extra. It contains an array of all data parsed from that row that extended beyond the header row.
Errors
// Error structure
{
	type: "",     // A generalization of the error
	code: "",     // Standardized error code
	message: "",  // Human-readable details
	row: 0,       // Row index of parsed data where error is
	
}
  • The error type will be one of "Quotes", "Delimiter", or "FieldMismatch".
  • The code may be "MissingQuotes", "UndetectableDelimiter", "TooFewFields", or "TooManyFields" (depending on the error type).
  • Just because errors are generated does not necessarily mean that parsing failed. The worst error you can get is probably MissingQuotes.
Meta
{
	delimiter: // Delimiter used
	linebreak: // Line break sequence used
	aborted:   // Whether process was aborted
	fields:    // Array of field names
	truncated: // Whether preview consumed all input
	renamedHeaders: // Headers that are automatically renamed by the library to avoid duplication. {Column 1_1: 'Column 1' // the later header 'Column 1' was renamed to 'Column 1_1'}
}
  • Not all meta properties will always be available. For instance, fields is only given when header row is enabled.

Extras

There's a few other things that Papa exposes to you that weren't explained above.

Read-Only
Read-Only Property Explanation
Papa.BAD_DELIMITERS An array of characters that are not allowed as delimiters (\r, \n, ", \ufeff).
Papa.BYTE_ORDER_MARK The unicode Byte Order Mark (\ufeff).
Papa.RECORD_SEP The true delimiter. Invisible. ASCII code 30. Should be doing the job we strangely rely upon commas and tabs for.
Papa.UNIT_SEP Also sometimes used as a delimiting character. ASCII code 31.
Papa.WORKERS_SUPPORTED Whether or not the browser supports HTML5 Web Workers. If false, worker: true will have no effect.
Configurable
Configurable Property Explanation
Papa.LocalChunkSize The size in bytes of each file chunk. Used when streaming files obtained from the DOM that exist on the local computer. Default 10 MB.
Papa.RemoteChunkSize Same as LocalChunkSize, but for downloading files from remote locations. Default 5 MB.
Papa.DefaultDelimiter The delimiter used when it is left unspecified and cannot be detected automatically. Default is comma.
================================================ FILE: docs/faq.html ================================================ FAQ - Papa Parse

FAQ

General

Why use Papa Parse?

There's a thousand CSV libraries for Javascript. Papa is different. It's written with correctness and performance in mind. Papa is the first (and so far only) multi-threaded CSV parser that runs on web pages. It can parse files gigabytes in size without crashing the browser. It correctly handles malformed or edge-case CSV text. It can parse files on the local file system or download them over the Internet. Papa is boss.

Privacy advocates also use Papa Parse to avoid having to transmit sensitive files over the Internet. Now all the processing can be done locally on the client's computer. This is especially significant considering some organizations' policies.

As of version 4, Papa Parse is the fastest CSV parser for the browser, whereas it used to be the slowest.

Can I use Papa Parse server-side with Node.js?

Yes, Paparse supports Node. See our README for further details.

Does Papa Parse have any dependencies?

No. Papa Parse has no dependencies. If jQuery is present, however, it plugs in to make it easier to select files from the DOM.

Can I put other libraries in the same file as Papa Parse?

Yes.

Which browsers is it compatible with?

All modern, competent browsers should support all of the features. However, as usual, use IE at your own risk. It looks like IE 10+ and Safari 6+ should support all the features. Firefox and Chrome should work with all features back to versions 3 and 4. Opera 11 and up should be fine. If you really need to use Papa in old IE or Opera, then keep the fancy features off and you may be in luck.

Can Papa Parse be loaded asynchronously (after the page loads)?

Yes.

Is it open source? (Can I contribute something?)

Yes, please! I don't want to do this all by myself. Head over to the GitHub project page and hack away. If you're making a significant change, open an issue first so we can talk about it.

What's the deal with fast mode?

Fast mode makes Papa Parse screaming fast, but you wouldn't want to use it if there are quoted fields in your input. Fast mode is fast because it makes one major assumption: no quoted fields. If you don't specify fastMode either way, fast mode will be turned on automatically if there are no quote characters in the input. With fast mode on, 1 GB files can be parsed in about 20 seconds.

Why do non-ASCII characters look weird?

It's probably an encoding issue. The FileReader API allows you to specify an encoding, which you can do using the encoding configuration property. This property only works with local files and does not apply to strings or remote files. Also see issues #64 and #169 if you're having trouble parsing CSV files generated from Excel.



Streaming

Can Papa load and parse huge files?

Yes. Parsing huge text files is facilitated by streaming, where the file is loaded a little bit at a time, parsed, and the results are sent to your step callback function, row-by-row. You can also get results chunk-by-chunk (which is usually faster) by using the chunk callback function in the same way.

How do I stream my input?

Just specify a step callback function. Results will not be available after parsing is finished, however. You have to inspect the results one row at a time.

What if I want more than 1 row at a time?

Use the chunk callback instead. It works just like step, but you get an entire chunk of the file at a time, rather than a single row. Don't try to use step and chunk together (the behavior is undefined).

What is a stream and when should I stream files?

A stream is a unique data structure which, given infinite time, gives you infinite space. So if you're short on memory (as browsers often are), use a stream.

Wait, does that mean streaming takes more time?

Yes and no. Typically, when we gain speed, we pay with space. The opposite is true, too. Streaming uses significantly less memory with large inputs, but since the reading happens in chunks and results are processed at each row instead of at the very end, yes, it can be slower.

But consider the alternative: upload the file to a remote server, open and process it there, then compress the output and have the client download the results. How long does it take you to upload a 500 MB or 1 GB file? Then consider that the server still has to open the file and read its contents, which is what the client would have done minutes ago. The server might parse it faster with natively-compiled binaries, but only if its resources are dedicated to the task and isn't already parsing files for many other users.

So unless your clients have a fiber line and you have a scalable cloud application, local parsing by streaming is nearly guaranteed to be faster.

How do I get all the results together after streaming?

You don't. Unless you assemble it manually. And really, don't do that... it defeats the purpose of using a stream. Just take the parts you need as they come through.

Does Papa use a true stream?

Papa uses HTML5's FileReader API which uses a stream. FileReader doesn't technically allow us to hook into the underlying stream, but it does let us load the file in pieces. But fortunately you don't have to worry about that; it's all taken care of for you. Just take the results one row at a time.

Can I stream files over a network or the Internet?

Yes, Papa Parse supports this. It will download a file in pieces using HTTP's standard Range header, then pass the parsed results to your step function just like a local file. However, these requests may not work cross-origin (different domain/hostname), depending on the server's configuration.

Streaming remote files also requires the Content-Range header in the server's response. Most production-ready servers support this header, but Python's SimpleHTTPServer does not. If you need a quick and easy server, Caddy will do the trick: $ caddy

Can I pause and resume parsing?

Yes, as long as you are streaming and not using a worker. Your step callback (same with the chunk callback) is passed a parser which has pause, resume, and abort functions. This is exceptionally useful when performing asynchronous actions during parsing, for example, AJAX requests. You can always abort parsing in your callback, even when using workers, but pause and resume is only available without a worker.



Multi-Threading (Workers)

Can I use workers for unparsing?

No, unparsing CSV files with workers is not currently available. Workers can only be used for parsing CSV files.

What is a web worker? Why use one?

HTML5 Web Workers facilitate basic multi-threading in the browser. This means that a web page can spawn a new thread in the operating system that runs Javascript code. This is highly beneficial for long-running scripts that would otherwise lock up the web page.

How do I use a worker?

Just specify worker: true in your config. You'll also need to make a complete callback (unless you're streaming) so that you can get the results, because using a worker makes the parse function asynchronous.

Can I use a worker if I combine/concatenate my Javascript files?

Yes.

When should I use a worker?

That's up to you. The most typical reason to use a web worker is if your web page becomes unresponsive during parsing. In other words, if it freezes and you can't click things or the scrolling becomes choppy. If that happens, some browsers (like Firefox) will warn the user that a script has become unresponsive or is taking a long time (even if it's working properly). If this happens to you or some of your users, consider using a web worker, at least for the large inputs.

However, read the next answer for more info. Using workers has performance implications (both good and bad).

What are the performance implications of using a worker thread?

Using a worker will be a little slower. In Javascript, threads don't share memory. That's really annoying because sharing memory is the primary reason for multi-threading. As such, all parse results in a worker thread need to be copied to the main thread. And if you're parsing a string in a worker thread, that string also needs to be copied into the worker in the first place. (Files will be opened or downloaded by the worker itself, so the input doesn't need to be copied from the main thread in those cases.)

The process of sending data between the page and the worker thread can stall the main page for just a moment. Each thread must also wait for the data to finish sending before un-blocking.

Basically: if you don't have much time, don't use a worker. If you can afford a little extra time, use a worker. It will keep your page from appearing unresponsive and give users an overall better experience.

Can I stream and use a worker at the same time?

Yup. If the input is too large to fit in memory (or large enough to crash the browser), streaming is always the answer, even in a worker thread. Workers keep the page reactive. Streaming makes it able to fit in memory. Use both if you need to.

Can I pause/resume workers?

No. This would drastically slow down parsing, as it would require the worker to wait after every chunk for a "continue" signal from the main thread. But you can abort workers by calling .abort() on the parser that gets passed to your callback function.

I set worker:true and now I'm getting an error: "window is not defined." How do I fix it?

This is a fairly common issue with configuration and it appears to be related to the use of React or other third party tools. Since this is a configuration issue, the exact steps needed to solve it may vary. See Issue #655 on GitHub for a solution that worked for one person, and for links to other related issues.

================================================ FILE: docs/index.html ================================================ Papa Parse - Powerful CSV Parser for JavaScript

Papa Parse

The powerful, in-browser CSV parser for big boys and girls

  Download   Demo   Documentation
// Parse CSV string
var data = Papa.parse(csv);

// Convert back to CSV
var csv = Papa.unparse(data);

// Parse local CSV file
Papa.parse(file, {
	complete: function(results) {
		console.log("Finished:", results.data);
	}
});

// Stream big file in worker thread
Papa.parse(bigFile, {
	worker: true,
	step: function(results) {
		console.log("Row:", results.data);
	}
});
Version
5.0

Features

Now the fastest JavaScript CSV parser for the browser

The world's first multi-threaded CSV parser for the browser

Papa can handle files gigabytes in size without crashing

Use Papa when performance, privacy, and correctness matter to you

Papa alleviates privacy concerns related to uploading files

Malformed CSV is handled gracefully with a detailed error report

  • Stream local and remote files
  • Multi-threaded
  • Header row support
  • Type conversion
  • Skip commented lines
  • Fast mode
  • Graceful error handling
  • Optional sprinkle of jQuery


  • People Papa


    PapaParse   PapaParse

    SmartyStreets verifies addresses, many of which are in CSV files. Papa Parse can process huge files in the browser. "We rapidly built an awesome client-side file processor with Papa Parse."

    MetaReader helps you see your data from a meta level before you start detailed analysis. "Papa Parse made it very easy to load and ready user CSV files in the browser on the client side."

    EpiML is an agent-based mathematical model for the web, still in its early stages of development. "Papa makes it so easy to use CSV, which is good for scientists."

    CSV Parsing

    "Isn't parsing CSV just String.split(',')?"

    Heavens, no. Papa does it right. Just pass in the CSV string with an optional configuration.

    var results = Papa.parse(csvString, config);
    /*
    	results = {
    		data: [ ... ],    // parsed data
    		errors: [ ... ],  // errors encountered
    		meta: {	... }     // extra parse info
    	}
    */

    Delimiter Detection

    "But I don't know the delimiter..."

    That's okay. Papa will scan the first few rows to find the right delimiter.

    var results = Papa.parse(csvString);
    console.log(results.meta.delimiter);
    // "\t"

    Local Files

    "Great, but I have a file to parse."

    Then give Papa a File instead of a string. Since file parsing is asynchronous, don't forget a callback.

    Papa.parse(fileInput.files[0], {
    	complete: function(results) {
    		console.log(results);
    	}
    });

    Remote Files

    "No—I mean, the file isn't on my computer."

    Oh, well then just pass in the URL and—of course—a callback.

    Papa.parse("http://example.com/file.csv", {
    	download: true,
    	complete: function(results) {
    		console.log(results);
    	}
    });

    Streaming

    "Did I mention the file is huge?"

    That's what streaming is for. Specify a step callback to receive the results row-by-row. This way, you won't load the whole file into memory and crash the browser.

    Papa.parse("http://example.com/big.csv", {
    	download: true,
    	step: function(row) {
    		console.log("Row:", row.data);
    	},
    	complete: function() {
    		console.log("All done!");
    	}
    });

    Multi-Threading

    "Lovely. Now my web page locked up."

    That happens when a long-running script is executing in the same thread as the page. Use a Worker thread by specifying worker: true. It may take slightly longer, but your page will stay reactive.

    Papa.parse(bigFile, {
    	worker: true,
    	step: function(row) {
    		console.log("Row:", row.data);
    	},
    	complete: function() {
    		console.log("All done!");
    	}
    });

    Type Conversion

    "Hey, these numbers are parsed as strings."

    Everything is parsed as strings. If you want numbers and booleans, you can enable dynamic typing to do the conversion for you.

    // Converts numeric/boolean data
    var results = Papa.parse(csv, {
    	dynamicTyping: true
    });

    Comments

    "I forgot to mention: my CSV files have comments in them."

    Okay, first off: that's really weird. But fortunately, you can skip those lines... just specify the comment string.

    // Mostly found in academia, some CSV files
    // may have commented lines in them
    var results = Papa.parse(csv, {
    	comments: "#"
    });

    Error Handling

    "Aw, shoot. Errors."

    Papa handles errors pretty well. The CSV standard is somewhat loose ambiguous, so Papa is designed for edge cases. For example, mismatched fields won't break parsing.

    // Example error:
    {
    	type: "FieldMismatch",
    	code: "TooManyFields",
    	message: "Expected 3 fields, but parsed 4",
    	row: 1
    }

    jQuery Plugin

    "Can I use Papa with jQuery?"

    Sure, but it's not required. You can use jQuery to select file input elements and then parse their files. Papa exposes its file parsing API as a jQuery plugin only when jQuery is defined. Papa Parse has no dependencies.

    $("input[type=file]").parse({
    	config: {
    		complete: function(results, file) {
    			console.log("This file done:", file, results);
    		}
    	},
    	complete: function() {
    		console.log("All files done!");
    	}
    });

    JSON to CSV

    "Last thing: what about converting JSON to CSV?"

    Call unparse() instead of parse(), passing in your array of arrays or array of objects. Papa will figure it out.

    // Output is a properly-formatted CSV string.
    // See the docs for more configurability.
    var csv = Papa.unparse(yourData);

    Who's Your Papa?

    Lil' Papa (minified) for production use

    Fat Papa (un-minified) for development

    npm
    $ npm install papaparse

    bower
    $ bower install papaparse
    ================================================ FILE: docs/resources/css/common.css ================================================ /* Eric Meyer's Reset CSS v2.0 */ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0} body, main { background: #FFF; } body { font: 18px/1.5em 'Source Sans Pro', 'Helvetica Neue', sans-serif; color: #333; height: 100%; } main { padding-top: 100px; } a { color: #1D58B1; } a:hover { color: #2AACFC; } b { font-weight: bold; } i { font-style: italic; } p, li { line-height: 1.75em; } p { margin-bottom: 25px; } small { font-size: 12px; } h1, h2, h3, h4, h5 { text-align: center; } h1 { font-family: Lato; font-weight: 300; font-size: 40px; margin-bottom: 50px; } h2 { font-size: 60px; line-height: 1.25em; } h3 { font-size: 48px; margin-bottom: 30px; line-height: 1.5em; } h4 { font-size: 28px; margin-bottom: 50px; line-height: 1.25em; } h5, footer h4 { font-size: 20px; letter-spacing: 2px; text-transform: uppercase; color: #242627; line-height: 1em; margin: 50px auto; } h6 { font-weight: bold; text-align: left; margin: 40px auto 5px; } /* Neat hack! http://css-tricks.com/hash-tag-links-padding/ So when you navigate in-page, the sticky header doesn't cover it up */ h2[id]:before, h3[id]:before, h4[id]:before, h5[id]:before, h6[id]:before { display: block; content: " "; margin-top: -75px; height: 75px; visibility: hidden; } ul, ol { margin: 0 0 0 2em; } ul { list-style-type: disc; } ol { list-style-type: decimal; } header, main, footer { position: relative; z-index: 1; } header, .insignia { background: #FFF; border-color: #CCC; border-style: solid; box-shadow: 0 -4px 20px -3px rgba(0, 0, 0, 0.2); } header { position: fixed; top: 0; width: 100%; border-bottom-width: 1px; } section { padding: 100px 0; border-bottom: 1px solid #E3E3E3; } main h2 { color: #253C50; /* #365DA3 */ /* #3D3D3D */ /* #9B0000 */ font-weight: 300; line-height: 1.25em; margin: 0px 0 50px; } main pre { padding: 10px; background: #F5F5F5; } .text-logo, header .links a { display: inline-block; color: #777; } .text-logo { font-family: Arvo, sans-serif; letter-spacing: -1px; color: #1D80AB; font-size: 24px; text-decoration: none; padding: 15px 10px; } .text-logo:hover { color: #66B0E2; } header .links a { font-size: 14px; padding: 15px 25px; text-decoration: none; } header .links a:hover { color: #000; } header .links a:first-child { padding-left: 10px; } header .links a .fa { margin-right: 5px; } .donate { background: #D9FFD1; } .donate:hover { background: #A1FF87 !important; } code { font: 75%/1em 'Liberation Mono', 'Consolas', 'Monaco', 'Menlo', 'Courier New', monospace; color: #000; padding: 5px; background: #F5F5F5; } h2 code { font-size: 42px; background: none; } pre > code { display: block; line-height: 1.5em; font-size: 14px; tab-size: 4; } .button, button, input[type=button], button[type=submit] { display: inline-block; padding: 10px 25px; color: #FFF; border: 0; text-decoration: none; background: #366992; margin: 5px; transition: background .2s; border-radius: 50px; cursor: pointer; outline: none; line-height: 1.5em; font-size: 18px; } .button[disabled], button[disabled], input[disabled] { background: #BBB !important; cursor: default !important; } .button:hover, button:hover, input[type=button]:hover, button[type=submit]:hover { text-decoration: none; background: #4B91C9; color: #FFF; } .button.red, button.red { background: #A01919; } .button.red:hover, button.red:hover { background: #DD2222; } .button.green, button.green { background: #419236; } .button.green:hover, button.green:hover { background: #4DB43F; } .button.gray, button.gray { background: #666; } .button.gray:hover, button.gray:hover { background: #999; } hr { border: 0; border-top: 1px solid #D0D0D0; } table { border-collapse: collapse; width: 100%; } th, td { padding: 20px; font-size: 16px; border-bottom: 1px solid #E0E0E0; } th { font-weight: bold; text-align: left; } table pre code { font-size: 12px; } table pre, li pre { margin: 10px 0; } .text-center { text-align: center; } .text-right { text-align: right; } footer { z-index: 0; background: #263A49; box-shadow: 0 0 50px rgba(0, 0, 0, 0.5); border-bottom: 0; padding: 0; font-weight: 300; font-size: 15px; color: #EFEFEF; line-height: 1.5em; margin-top: 75px; } footer a { color: #EFEFEF; text-decoration: underline; } /* footer .footer-top { padding: 20px; background: #2C4252; } */ footer .footer-main { font-family: Lato; padding: 65px 0; } footer .links a { color: #A1B2C2; text-decoration: none; transition: color .2s; display: block; font-size: 14px; font-weight: 300; line-height: 2em; } footer .links a:hover { color: #ACD7FF; text-decoration: none; } footer h3 { color: #FFF; font-size: 22px; margin: 0; } footer h4 { margin: 0; } footer h4 a { color: #A1B2C2; text-decoration: underline; } footer h5 { color: #FFF; text-transform: uppercase; font-size: 16px; margin: 0 0 10px 0; font-weight: normal; text-align: left; } footer hr { border: 0; border-top: 1px solid #3E5566; width: 60%; min-width: 50px; margin: 10px 0; } .logo { display: inline-block; color: #263A49; font-family: Arvo; font-size: 90px; line-height: 1em; background: #EFEFEF; border-radius: 100px; padding: 10px 30px; } .stuck { position: fixed; top: 0; width: 100%; border-top-width: 0; border-bottom-width: 1px; } @media (max-width: 1100px) { .text-logo { font-size: 18px; } p, li { line-height: 1.5em; } } @media (max-width: 970px) { header .links a { padding: 15px; } header > .grid-container, header .mobile-grid-50 { padding: 0; } } @media (max-width: 840px) { header .links a { font-size: 12px; } } @media (max-width: 767px) { /* mobile */ p, li { line-height: 1.5em; } header, .sticky-wrapper { position: static; margin-bottom: 50px !important; } header > .grid-container, header .mobile-grid-50 { padding: 0; } section { padding: 50px 0; } header .links a { font-size: 16px; display: block; text-align: left; padding: 15px 10% !important; } main { padding-top: 0; } main h2 { font-size: 40px; } main h2 code { font-size: 30px; } td, th { font-size: 14px; padding: 10px; } footer h5 { margin-top: 40px; } } ================================================ FILE: docs/resources/css/demo.css ================================================ .tabs, .tab { border-color: #B4E3FF; border-style: solid; } .tabs { border-bottom-width: 1px; padding: 0 5%; margin-bottom: 30px; text-align: center; } .tab { display: inline-block; padding: 8px 20px; border-bottom-width: 1px; border-radius: 5px 5px 0 0; z-index: 2; cursor: pointer; font-size: 14px; color: #777; background: #FFF; margin-bottom: -1px; } .tab.active { border-width: 1px; border-bottom-color: #FFF; color: #000; } .tab:not(.active):hover { color: #007FB6; } label { display: block; font-size: 14px; line-height: 2em; } input[type=checkbox] { margin-right: 4px; } textarea, input[type=text], input[type=number], input[type=password], input[type=email] { font: 12px/1.25em Menlo, Monaco, 'Courier New', monospace; padding: 4px; tab-size: 4; } input[type=text], input[type=number], input[type=password], input[type=email] { margin: 0 6px; } textarea { box-sizing: border-box; width: 100%; height: 320px; padding: 10px; resize: vertical; } dfn { font-size: 12px; color: #999; display: block; line-height: 1.2em; margin-bottom: 15px; } input[type=checkbox] + dfn { padding-left: 22px; } input[type=file], #url { margin: 20px auto; display: block; } input[type=file] { padding: 10px; font-size: 12px; background: #F0F0F0; } #insert-tab { font-size: 12px; } .input-area { margin-bottom: 20px; font-size: 16px; line-height: 1em; } ul { margin-top: 20px; } li { line-height: 1.5em; } #input-local, #input-remote, #input-unparse { display: none; } #submit { width: 100%; max-width: 150px; } #url { width: 100%; font-size: 14px; max-width: 500px; } .see-results { color: #CC0000; margin-bottom: 20px; font-size: 12px; text-transform: uppercase; letter-spacing: 1px; line-height: 1.5em; } @media (max-width: 767px) { /* mobile */ textarea { height: 250px; } .tab { border: 0; background: #F0F0F0; border-radius: 0; margin: 10px; display: block; } .tab.active { background: #3B9CE2; color: #FFF; } } ================================================ FILE: docs/resources/css/home.css ================================================ #top { padding: 6% 0 8%; color: #1D80AB; background: #FFF; position: relative; z-index: 0; /* For better performance, trigger 3D graphics acceleration. This reduces lag/jitter considerably, esp. in Chrome. */ -webkit-transform: translateZ(0); -webkit-backface-visibility: hidden; transform-origin: 100% 100%; } #top code { background: none; } h1 { text-align: left; font-family: Arvo; font-size: 100px; line-height: 1em; margin-top: 8%; margin-bottom: 40px; letter-spacing: -5px; } h2 { font-size: 24px; text-align: left; margin-bottom: 50px; } /* Switch around h4 and h5 for homepage... */ h4 { font-size: 12px; letter-spacing: 2px; margin-bottom: 10px; text-transform: uppercase; color: #A1B2C2; line-height: 1em; } h5 { font-size: 28px; margin-bottom: 50px; line-height: 1.25em; text-transform: none; color: inherit; letter-spacing: 0; margin-top: 0; } #title-main { float: left; } #title-code { float: right; } main { padding-top: 0; } .fa-heart { color: #F00; } header { border-top-width: 1px; } header, .insignia { position: relative; } header, .sticky-wrapper { margin-bottom: -150px; } header .fa-heart { color: inherit; } .insignia { display: block; width: 250px; height: 250px; box-sizing: border-box; border-radius: 50%; margin: 0 auto; text-align: center; color: #1D80AB; z-index: 2; margin-bottom: 30px; border-width: 1px; } #version-intro { position: absolute; font-size: 12px; top: 18%; width: 100%; font-family: 'Source Sans Pro', sans-serif; text-transform: uppercase; letter-spacing: 2px; } #version { text-shadow: 0 3px 2px rgba(169, 169, 169, 0.5); font: 100px/250px Arvo, sans-serif; } .firefox-hack { position: absolute; width: 100%; } .lover { margin-bottom: 0; } .grid-container.narrow-grid { max-width: 850px; } .mini-papa { text-align: right; } #ticker { width: 90%; max-width: 800px; margin: 0 auto; height: 80px; position: relative; } .ticker-item { font-size: 24px; color: #565656; text-align: center; font-family: Lato; font-weight: 300; line-height: 1.25em; width: 100%; position: absolute; top: 0; -webkit-transition: transform .25s; transition: transform .25s; -webkit-transform: scale(0); transform: scale(0); } .ticker-item.current { -webkit-transform: scale(1); transform: scale(1); } .add-lover-link { text-decoration: none; } footer { margin-top: 0; } @media (max-width: 1150px) { #title-main h1 { font-size: 85px; } #title-main h2 { font-size: 20px; margin-bottom: 30px; } #title-code code { font-size: 12px; } button, .button { padding: 8px 20px; font-size: 14px; } header, .sticky-wrapper { margin-bottom: -120px; } .insignia { width: 175px; height: 175px; } #version { font-size: 70px; line-height: 175px; } } @media (max-width: 950px) { #title-code { display: none; } #top { padding-top: 0; } #title-main, #title-main h1, #title-main h2 { width: 100%; text-align: center; } #title-main { padding-bottom: 50px; } } @media (max-width: 767px) { /* mobile */ #top h2 { margin-bottom: 20px; } #title-main { padding-bottom: 10px; } .stuck { position: static; } .insignia { display: none; } #ticker { height: 120px; } .lover { margin-bottom: 25px; } .mini-papa { text-align: left; } } ================================================ FILE: docs/resources/css/tomorrow.highlight.css ================================================ /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ /* Tomorrow Comment */ .hljs-comment { color: #8e908c; } /* Tomorrow Red */ .hljs-variable, .hljs-attribute, .hljs-tag, .hljs-regexp, .ruby .hljs-constant, .xml .hljs-tag .hljs-title, .xml .hljs-pi, .xml .hljs-doctype, .html .hljs-doctype, .css .hljs-id, .css .hljs-class, .css .hljs-pseudo { color: #c82829; } /* Tomorrow Orange */ .hljs-number, .hljs-preprocessor, .hljs-pragma, .hljs-built_in, .hljs-literal, .hljs-params, .hljs-constant { color: #f5871f; } /* Tomorrow Yellow */ .ruby .hljs-class .hljs-title, .css .hljs-rules .hljs-attribute { color: #eab700; } /* Tomorrow Green */ .hljs-string, .hljs-value, .hljs-inheritance, .hljs-header, .ruby .hljs-symbol, .xml .hljs-cdata { color: #718c00; } /* Tomorrow Aqua */ .css .hljs-hexcolor { color: #3e999f; } /* Tomorrow Blue */ .hljs-function, .python .hljs-decorator, .python .hljs-title, .ruby .hljs-function .hljs-title, .ruby .hljs-title .hljs-keyword, .perl .hljs-sub, .javascript .hljs-title, .coffeescript .hljs-title { color: #4271ae; } /* Tomorrow Purple */ .hljs-keyword, .javascript .hljs-function { color: #8959a8; } .hljs { display: block; overflow-x: auto; /*background: white; padding: 0.5em;*/ color: #4d4d4c; -webkit-text-size-adjust: none; } .coffeescript .javascript, .javascript .xml, .tex .hljs-formula, .xml .javascript, .xml .vbscript, .xml .css, .xml .hljs-cdata { opacity: 0.5; } ================================================ FILE: docs/resources/css/unsemantic.css ================================================ /* ============================================ */ /* This file has a mobile-to-desktop breakpoint */ /* ============================================ */ @media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .clear { clear: both; display: block; overflow: hidden; visibility: hidden; width: 0; height: 0; } .grid-container:before, .clearfix:before, .grid-container:after, .clearfix:after { content: "."; display: block; overflow: hidden; visibility: hidden; font-size: 0; line-height: 0; width: 0; height: 0; } .grid-container:after, .clearfix:after { clear: both; } .grid-container { margin-left: auto; margin-right: auto; max-width: 1200px; padding-left: 10px; padding-right: 10px; } .grid-5, .mobile-grid-5, .grid-10, .mobile-grid-10, .grid-15, .mobile-grid-15, .grid-20, .mobile-grid-20, .grid-25, .mobile-grid-25, .grid-30, .mobile-grid-30, .grid-35, .mobile-grid-35, .grid-40, .mobile-grid-40, .grid-45, .mobile-grid-45, .grid-50, .mobile-grid-50, .grid-55, .mobile-grid-55, .grid-60, .mobile-grid-60, .grid-65, .mobile-grid-65, .grid-70, .mobile-grid-70, .grid-75, .mobile-grid-75, .grid-80, .mobile-grid-80, .grid-85, .mobile-grid-85, .grid-90, .mobile-grid-90, .grid-95, .mobile-grid-95, .grid-100, .mobile-grid-100, .grid-33, .mobile-grid-33, .grid-66, .mobile-grid-66 { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; padding-left: 10px; padding-right: 10px; } .grid-parent { padding-left: 0; padding-right: 0; } @media screen and (max-width: 767px) { .mobile-grid-100:before, .mobile-grid-100:after { content: "."; display: block; overflow: hidden; visibility: hidden; font-size: 0; line-height: 0; width: 0; height: 0; } .mobile-grid-100:after { clear: both; } .mobile-push-5, .mobile-pull-5, .mobile-push-10, .mobile-pull-10, .mobile-push-15, .mobile-pull-15, .mobile-push-20, .mobile-pull-20, .mobile-push-25, .mobile-pull-25, .mobile-push-30, .mobile-pull-30, .mobile-push-35, .mobile-pull-35, .mobile-push-40, .mobile-pull-40, .mobile-push-45, .mobile-pull-45, .mobile-push-50, .mobile-pull-50, .mobile-push-55, .mobile-pull-55, .mobile-push-60, .mobile-pull-60, .mobile-push-65, .mobile-pull-65, .mobile-push-70, .mobile-pull-70, .mobile-push-75, .mobile-pull-75, .mobile-push-80, .mobile-pull-80, .mobile-push-85, .mobile-pull-85, .mobile-push-90, .mobile-pull-90, .mobile-push-95, .mobile-pull-95, .mobile-push-33, .mobile-pull-33, .mobile-push-66, .mobile-pull-66 { position: relative; } .hide-on-mobile { display: none !important; } .mobile-grid-5 { float: left; width: 5%; } .mobile-prefix-5 { margin-left: 5%; } .mobile-suffix-5 { margin-right: 5%; } .mobile-push-5 { left: 5%; } .mobile-pull-5 { left: -5%; } .mobile-grid-10 { float: left; width: 10%; } .mobile-prefix-10 { margin-left: 10%; } .mobile-suffix-10 { margin-right: 10%; } .mobile-push-10 { left: 10%; } .mobile-pull-10 { left: -10%; } .mobile-grid-15 { float: left; width: 15%; } .mobile-prefix-15 { margin-left: 15%; } .mobile-suffix-15 { margin-right: 15%; } .mobile-push-15 { left: 15%; } .mobile-pull-15 { left: -15%; } .mobile-grid-20 { float: left; width: 20%; } .mobile-prefix-20 { margin-left: 20%; } .mobile-suffix-20 { margin-right: 20%; } .mobile-push-20 { left: 20%; } .mobile-pull-20 { left: -20%; } .mobile-grid-25 { float: left; width: 25%; } .mobile-prefix-25 { margin-left: 25%; } .mobile-suffix-25 { margin-right: 25%; } .mobile-push-25 { left: 25%; } .mobile-pull-25 { left: -25%; } .mobile-grid-30 { float: left; width: 30%; } .mobile-prefix-30 { margin-left: 30%; } .mobile-suffix-30 { margin-right: 30%; } .mobile-push-30 { left: 30%; } .mobile-pull-30 { left: -30%; } .mobile-grid-35 { float: left; width: 35%; } .mobile-prefix-35 { margin-left: 35%; } .mobile-suffix-35 { margin-right: 35%; } .mobile-push-35 { left: 35%; } .mobile-pull-35 { left: -35%; } .mobile-grid-40 { float: left; width: 40%; } .mobile-prefix-40 { margin-left: 40%; } .mobile-suffix-40 { margin-right: 40%; } .mobile-push-40 { left: 40%; } .mobile-pull-40 { left: -40%; } .mobile-grid-45 { float: left; width: 45%; } .mobile-prefix-45 { margin-left: 45%; } .mobile-suffix-45 { margin-right: 45%; } .mobile-push-45 { left: 45%; } .mobile-pull-45 { left: -45%; } .mobile-grid-50 { float: left; width: 50%; } .mobile-prefix-50 { margin-left: 50%; } .mobile-suffix-50 { margin-right: 50%; } .mobile-push-50 { left: 50%; } .mobile-pull-50 { left: -50%; } .mobile-grid-55 { float: left; width: 55%; } .mobile-prefix-55 { margin-left: 55%; } .mobile-suffix-55 { margin-right: 55%; } .mobile-push-55 { left: 55%; } .mobile-pull-55 { left: -55%; } .mobile-grid-60 { float: left; width: 60%; } .mobile-prefix-60 { margin-left: 60%; } .mobile-suffix-60 { margin-right: 60%; } .mobile-push-60 { left: 60%; } .mobile-pull-60 { left: -60%; } .mobile-grid-65 { float: left; width: 65%; } .mobile-prefix-65 { margin-left: 65%; } .mobile-suffix-65 { margin-right: 65%; } .mobile-push-65 { left: 65%; } .mobile-pull-65 { left: -65%; } .mobile-grid-70 { float: left; width: 70%; } .mobile-prefix-70 { margin-left: 70%; } .mobile-suffix-70 { margin-right: 70%; } .mobile-push-70 { left: 70%; } .mobile-pull-70 { left: -70%; } .mobile-grid-75 { float: left; width: 75%; } .mobile-prefix-75 { margin-left: 75%; } .mobile-suffix-75 { margin-right: 75%; } .mobile-push-75 { left: 75%; } .mobile-pull-75 { left: -75%; } .mobile-grid-80 { float: left; width: 80%; } .mobile-prefix-80 { margin-left: 80%; } .mobile-suffix-80 { margin-right: 80%; } .mobile-push-80 { left: 80%; } .mobile-pull-80 { left: -80%; } .mobile-grid-85 { float: left; width: 85%; } .mobile-prefix-85 { margin-left: 85%; } .mobile-suffix-85 { margin-right: 85%; } .mobile-push-85 { left: 85%; } .mobile-pull-85 { left: -85%; } .mobile-grid-90 { float: left; width: 90%; } .mobile-prefix-90 { margin-left: 90%; } .mobile-suffix-90 { margin-right: 90%; } .mobile-push-90 { left: 90%; } .mobile-pull-90 { left: -90%; } .mobile-grid-95 { float: left; width: 95%; } .mobile-prefix-95 { margin-left: 95%; } .mobile-suffix-95 { margin-right: 95%; } .mobile-push-95 { left: 95%; } .mobile-pull-95 { left: -95%; } .mobile-grid-33 { float: left; width: 33.33333%; } .mobile-prefix-33 { margin-left: 33.33333%; } .mobile-suffix-33 { margin-right: 33.33333%; } .mobile-push-33 { left: 33.33333%; } .mobile-pull-33 { left: -33.33333%; } .mobile-grid-66 { float: left; width: 66.66667%; } .mobile-prefix-66 { margin-left: 66.66667%; } .mobile-suffix-66 { margin-right: 66.66667%; } .mobile-push-66 { left: 66.66667%; } .mobile-pull-66 { left: -66.66667%; } .mobile-grid-100 { clear: both; width: 100%; } } @media screen and (min-width: 768px) { .grid-100:before, .grid-100:after { content: "."; display: block; overflow: hidden; visibility: hidden; font-size: 0; line-height: 0; width: 0; height: 0; } .grid-100:after { clear: both; } .push-5, .pull-5, .push-10, .pull-10, .push-15, .pull-15, .push-20, .pull-20, .push-25, .pull-25, .push-30, .pull-30, .push-35, .pull-35, .push-40, .pull-40, .push-45, .pull-45, .push-50, .pull-50, .push-55, .pull-55, .push-60, .pull-60, .push-65, .pull-65, .push-70, .pull-70, .push-75, .pull-75, .push-80, .pull-80, .push-85, .pull-85, .push-90, .pull-90, .push-95, .pull-95, .push-33, .pull-33, .push-66, .pull-66 { position: relative; } .hide-on-desktop { display: none !important; } .grid-5 { float: left; width: 5%; } .prefix-5 { margin-left: 5%; } .suffix-5 { margin-right: 5%; } .push-5 { left: 5%; } .pull-5 { left: -5%; } .grid-10 { float: left; width: 10%; } .prefix-10 { margin-left: 10%; } .suffix-10 { margin-right: 10%; } .push-10 { left: 10%; } .pull-10 { left: -10%; } .grid-15 { float: left; width: 15%; } .prefix-15 { margin-left: 15%; } .suffix-15 { margin-right: 15%; } .push-15 { left: 15%; } .pull-15 { left: -15%; } .grid-20 { float: left; width: 20%; } .prefix-20 { margin-left: 20%; } .suffix-20 { margin-right: 20%; } .push-20 { left: 20%; } .pull-20 { left: -20%; } .grid-25 { float: left; width: 25%; } .prefix-25 { margin-left: 25%; } .suffix-25 { margin-right: 25%; } .push-25 { left: 25%; } .pull-25 { left: -25%; } .grid-30 { float: left; width: 30%; } .prefix-30 { margin-left: 30%; } .suffix-30 { margin-right: 30%; } .push-30 { left: 30%; } .pull-30 { left: -30%; } .grid-35 { float: left; width: 35%; } .prefix-35 { margin-left: 35%; } .suffix-35 { margin-right: 35%; } .push-35 { left: 35%; } .pull-35 { left: -35%; } .grid-40 { float: left; width: 40%; } .prefix-40 { margin-left: 40%; } .suffix-40 { margin-right: 40%; } .push-40 { left: 40%; } .pull-40 { left: -40%; } .grid-45 { float: left; width: 45%; } .prefix-45 { margin-left: 45%; } .suffix-45 { margin-right: 45%; } .push-45 { left: 45%; } .pull-45 { left: -45%; } .grid-50 { float: left; width: 50%; } .prefix-50 { margin-left: 50%; } .suffix-50 { margin-right: 50%; } .push-50 { left: 50%; } .pull-50 { left: -50%; } .grid-55 { float: left; width: 55%; } .prefix-55 { margin-left: 55%; } .suffix-55 { margin-right: 55%; } .push-55 { left: 55%; } .pull-55 { left: -55%; } .grid-60 { float: left; width: 60%; } .prefix-60 { margin-left: 60%; } .suffix-60 { margin-right: 60%; } .push-60 { left: 60%; } .pull-60 { left: -60%; } .grid-65 { float: left; width: 65%; } .prefix-65 { margin-left: 65%; } .suffix-65 { margin-right: 65%; } .push-65 { left: 65%; } .pull-65 { left: -65%; } .grid-70 { float: left; width: 70%; } .prefix-70 { margin-left: 70%; } .suffix-70 { margin-right: 70%; } .push-70 { left: 70%; } .pull-70 { left: -70%; } .grid-75 { float: left; width: 75%; } .prefix-75 { margin-left: 75%; } .suffix-75 { margin-right: 75%; } .push-75 { left: 75%; } .pull-75 { left: -75%; } .grid-80 { float: left; width: 80%; } .prefix-80 { margin-left: 80%; } .suffix-80 { margin-right: 80%; } .push-80 { left: 80%; } .pull-80 { left: -80%; } .grid-85 { float: left; width: 85%; } .prefix-85 { margin-left: 85%; } .suffix-85 { margin-right: 85%; } .push-85 { left: 85%; } .pull-85 { left: -85%; } .grid-90 { float: left; width: 90%; } .prefix-90 { margin-left: 90%; } .suffix-90 { margin-right: 90%; } .push-90 { left: 90%; } .pull-90 { left: -90%; } .grid-95 { float: left; width: 95%; } .prefix-95 { margin-left: 95%; } .suffix-95 { margin-right: 95%; } .push-95 { left: 95%; } .pull-95 { left: -95%; } .grid-33 { float: left; width: 33.33333%; } .prefix-33 { margin-left: 33.33333%; } .suffix-33 { margin-right: 33.33333%; } .push-33 { left: 33.33333%; } .pull-33 { left: -33.33333%; } .grid-66 { float: left; width: 66.66667%; } .prefix-66 { margin-left: 66.66667%; } .suffix-66 { margin-right: 66.66667%; } .push-66 { left: 66.66667%; } .pull-66 { left: -66.66667%; } .grid-100 { clear: both; width: 100%; } } ================================================ FILE: docs/resources/files/big.csv ================================================ [File too large to display: 47.8 MB] ================================================ FILE: docs/resources/files/malformed.tsv ================================================ site lon lat max min precip snow snowdepth 1V4 -72.02 44.42 13 -5 0.01 -99 -99 BTV -73.15 44.47 14 -9 0.00 0.0 7 52 MVL -72.62 44.54 11 -7 0.00 -99 -99 MPV -72.56 44.20 12 -4 0.00 -99 -99 MSS -74.85 44.93 4 -150.00 -99 -99 PBG -73.47 44.65 15 -12 0.00 -99 -99 RUT -72.95 43.53 18 -2 -99 -99 -99 SLK -74.20 "44.39 7 -12 0.00 -99 -99 VSF -72.50 43.34 20 -1 0.04 -99 -99 ================================================ FILE: docs/resources/files/normal.csv ================================================ "CONTENT TYPE","TITLE","ABBR","ISSN","e-ISSN","PUBLICATION RANGE: START","PUBLICATION RANGE: LATEST PUBLISHED","SHORTCUT URL","ARCHIVE URL" "Journals","ACM Computing Surveys ","ACM Comput. Surv.","0360-0300","1557-7341","Volume 1 Issue 1 (March 1969)","Volume 46 Issue 1 (October 2013)","http://dl.acm.org/citation.cfm?id=J204","http://dl.acm.org/citation.cfm?id=J204&picked=prox" "Journals","ACM Journal of Computer Documentation ","ACM J. Comput. Doc.","1527-6805","1557-9441","Volume 24 Issue 1 (Feb. 1, 2000)","Volume 26 Issue 4 (November 2002)","http://dl.acm.org/citation.cfm?id=J24","http://dl.acm.org/citation.cfm?id=J24&picked=prox" "Journals","ACM Journal on Emerging Technologies in Computing Systems ","J. Emerg. Technol. Comput. Syst.","1550-4832","1550-4840","Volume 1 Issue 1 (April 2005)","Volume 9 Issue 4 (November 2013) - Special Issue on Bioinformatics","http://dl.acm.org/citation.cfm?id=J967","http://dl.acm.org/citation.cfm?id=J967&picked=prox" "Journals","Journal of Data and Information Quality ","J. Data and Information Quality","1936-1955","1936-1963","Volume 1 Issue 1 (June 2009)","Volume 4 Issue 3 (May 2013)","http://dl.acm.org/citation.cfm?id=J1191","http://dl.acm.org/citation.cfm?id=J1191&picked=prox" "Journals","Journal of Experimental Algorithmics ","J. Exp. Algorithmics","1084-6654","1084-6654","Volume 1 (1996)","Volume 18 (April 2013)","http://dl.acm.org/citation.cfm?id=J430","http://dl.acm.org/citation.cfm?id=J430&picked=prox" "Journals","Journal of the ACM ","J. ACM","0004-5411","1557-735X","Volume 1 Issue 1 (Jan. 1954)","Volume 60 Issue 6 (November 2013)","http://dl.acm.org/citation.cfm?id=J401","http://dl.acm.org/citation.cfm?id=J401&picked=prox" "Journals","Journal on Computing and Cultural Heritage ","J. Comput. Cult. Herit.","1556-4673","1556-4711","Volume 1 Issue 1 (June 2008)","Volume 6 Issue 3 (July 2013)","http://dl.acm.org/citation.cfm?id=J1157","http://dl.acm.org/citation.cfm?id=J1157&picked=prox" "Journals","Journal on Educational Resources in Computing ","J. Educ. Resour. Comput.","1531-4278","1531-4278","Volume 1 Issue 1es (March 2001)","Volume 13 Issue 3 (August 2013) - Special Issue on Alternatives to Lecture in the Computer Science Classroom","http://dl.acm.org/citation.cfm?id=J814","http://dl.acm.org/citation.cfm?id=J814&picked=prox" "Transactions","ACM Letters on Programming Languages and Systems ","ACM Lett. Program. Lang. Syst.","1057-4514","1557-7384","Volume 1 Issue 1 (March 1992)","Volume 2 Issue 1-4 (March–Dec. 1993)","http://dl.acm.org/citation.cfm?id=J513","http://dl.acm.org/citation.cfm?id=J513&picked=prox" "Transactions","ACM Transactions on Accessible Computing ","ACM Trans. Access. Comput.","1936-7228","1936-7236","Volume 1 Issue 1 (May 2008)","Volume 5 Issue 2 (October 2013)","http://dl.acm.org/citation.cfm?id=J1156","http://dl.acm.org/citation.cfm?id=J1156&picked=prox" "Transactions","ACM Transactions on Algorithms ","ACM Trans. Algorithms","1549-6325","1549-6333","Volume 1 Issue 1 (July 2005)","Volume 9 Issue 4 (September 2013)","http://dl.acm.org/citation.cfm?id=J982","http://dl.acm.org/citation.cfm?id=J982&picked=prox" "Transactions","ACM Transactions on Applied Perception ","ACM Trans. Appl. Percept.","1544-3558","1544-3965","Volume 1 Issue 1 (July 2004)","Volume 10 Issue 4 (October 2013)","http://dl.acm.org/citation.cfm?id=J932","http://dl.acm.org/citation.cfm?id=J932&picked=prox" "Transactions","ACM Transactions on Architecture and Code Optimization ","ACM Trans. Archit. Code Optim.","1544-3566","1544-3973","Volume 1 Issue 1 (March 2004)","Volume 10 Issue 4 (December 2013)","http://dl.acm.org/citation.cfm?id=J924","http://dl.acm.org/citation.cfm?id=J924&picked=prox" "Transactions","ACM Transactions on Asian Language Information Processing ","","1530-0226","1558-3430","Volume 1 Issue 1 (March 2002)","Volume 12 Issue 4 (October 2013)","http://dl.acm.org/citation.cfm?id=J820","http://dl.acm.org/citation.cfm?id=J820&picked=prox" "Transactions","ACM Transactions on Autonomous and Adaptive Systems ","ACM Trans. Auton. Adapt. Syst.","1556-4665","1556-4703","Volume 1 Issue 1 (September 2006)","Volume 8 Issue 3 (September 2013)","http://dl.acm.org/citation.cfm?id=J1010","http://dl.acm.org/citation.cfm?id=J1010&picked=prox" "Transactions","ACM Transactions on Computation Theory ","ACM Trans. Comput. Theory","1942-3454","1942-3462","Volume 1 Issue 1 (February 2009)","Volume 5 Issue 4 (November 2013)","http://dl.acm.org/citation.cfm?id=J1190","http://dl.acm.org/citation.cfm?id=J1190&picked=prox" "Transactions","ACM Transactions on Computational Logic ","ACM Trans. Comput. Logic","1529-3785","1557-945X","Volume 1 Issue 1 (July 2000)","Volume 14 Issue 4 (November 2013)","http://dl.acm.org/citation.cfm?id=J773","http://dl.acm.org/citation.cfm?id=J773&picked=prox" "Transactions","ACM Transactions on Computer Systems ","ACM Trans. Comput. Syst.","0734-2071","1557-7333","Volume 1 Issue 1 (Feb. 1983)","Volume 31 Issue 4 (December 2013)","http://dl.acm.org/citation.cfm?id=J774","http://dl.acm.org/citation.cfm?id=J774&picked=prox" "Transactions","ACM Transactions on Computer-Human Interaction ","ACM Trans. Comput.-Hum. Interact.","1073-0516","1557-7325","Volume 1 Issue 1 (March 1994)","Volume 20 Issue 5 (November 2013)","http://dl.acm.org/citation.cfm?id=J756","http://dl.acm.org/citation.cfm?id=J756&picked=prox" "Transactions","ACM Transactions on Computing Education ","Trans. Comput. Educ.","","1946-6226","Volume 1 Issue 1es (March 2001)","Volume 13 Issue 4 (November 2013)","http://dl.acm.org/citation.cfm?id=J1193","http://dl.acm.org/citation.cfm?id=J1193&picked=prox" "Transactions","ACM Transactions on Database Systems ","ACM Trans. Database Syst.","0362-5915","1557-4644","Volume 1 Issue 1 (March 1976)","Volume 38 Issue 4 (November 2013) - Invited papers issue","http://dl.acm.org/citation.cfm?id=J777","http://dl.acm.org/citation.cfm?id=J777&picked=prox" "Transactions","ACM Transactions on Design Automation of Electronic Systems ","ACM Trans. Des. Autom. Electron. Syst.","1084-4309","1557-7309","Volume 1 Issue 1 (Jan. 1996)","Volume 19 Issue 1 (December 2013)","http://dl.acm.org/citation.cfm?id=J776","http://dl.acm.org/citation.cfm?id=J776&picked=prox" "Transactions","ACM Transactions on Economics and Computation","ACM Trans. Econ. Comput.","2167-8375","2167-8383","Volume 1 Issue 1 (January 2013)","Volume 1 Issue 4 (December 2013)","http://dl.acm.org/citation.cfm?id=J1359","http://dl.acm.org/citation.cfm?id=J1359&picked=prox" "Transactions","ACM Transactions on Embedded Computing Systems ","ACM Trans. Embed. Comput. Syst.","1539-9087","1558-3465","Volume 1 Issue 1 (November 2002)","Volume 13 Issue 3 (December 2013)","http://dl.acm.org/citation.cfm?id=J840","http://dl.acm.org/citation.cfm?id=J840&picked=prox" "Transactions","ACM Transactions on Graphics ","ACM Trans. Graph.","0730-0301","1557-7368","Volume 1 Issue 1 (Jan. 1982)","Volume 32 Issue 6 (November 2013)","http://dl.acm.org/citation.cfm?id=J778","http://dl.acm.org/citation.cfm?id=J778&picked=prox" "Transactions","ACM Transactions on Information Systems ","ACM Trans. Inf. Syst.","1046-8188","1558-2868","Volume 1 Issue 1 (Jan. 1983)","Volume 31 Issue 4 (November 2013)","http://dl.acm.org/citation.cfm?id=J779","http://dl.acm.org/citation.cfm?id=J779&picked=prox" "Transactions","ACM Transactions on Information and System Security ","ACM Trans. Inf. Syst. Secur.","1094-9224","1557-7406","Volume 1 Issue 1 (Nov. 1998)","Volume 16 Issue 3 (November 2013)","http://dl.acm.org/citation.cfm?id=J789","http://dl.acm.org/citation.cfm?id=J789&picked=prox" "Transactions","ACM Transactions on Intelligent Systems and Technology ","ACM Trans. Intell. Syst. Technol.","2157-6904","2157-6912","Volume 1 Issue 1 (October 2010)","Volume 5 Issue 1 (December 2013) - Special Section on Intelligent Mobile Knowledge Discovery and Management Systems and Special Issue on Social Web Mining","http://dl.acm.org/citation.cfm?id=J1318","http://dl.acm.org/citation.cfm?id=J1318&picked=prox" "Transactions","ACM Transactions on Interactive Intelligent Systems ","ACM Trans. Interact. Intell. Syst.","2160-6455","2160-6463","Volume 1 Issue 1 (October 2011)","Volume 3 Issue 3 (October 2013)","http://dl.acm.org/citation.cfm?id=J1341","http://dl.acm.org/citation.cfm?id=J1341&picked=prox" "Transactions","ACM Transactions on Internet Technology ","ACM Trans. Internet Technol.","1533-5399","1557-6051","Volume 1 Issue 1 (Aug. 2001)","Volume 13 Issue 2 (December 2013)","http://dl.acm.org/citation.cfm?id=J780","http://dl.acm.org/citation.cfm?id=J780&picked=prox" "Transactions","ACM Transactions on Knowledge Discovery from Data ","ACM Trans. Knowl. Discov. Data","1556-4681","1556-472X","Volume 1 Issue 1 (March 2007)","Volume 7 Issue 3 (September 2013) - Special Issue on ACM SIGKDD 2012","http://dl.acm.org/citation.cfm?id=J1054","http://dl.acm.org/citation.cfm?id=J1054&picked=prox" "Transactions","ACM Transactions on Management Information Systems ","ACM Trans. Manage. Inf. Syst.","2158-656X","2158-6578","Volume 1 Issue 1 (December 2010)","Volume 4 Issue 3 (October 2013)","http://dl.acm.org/citation.cfm?id=J1320","http://dl.acm.org/citation.cfm?id=J1320&picked=prox" "Transactions","ACM Transactions on Mathematical Software ","ACM Trans. Math. Softw.","0098-3500","1557-7295","Volume 1 Issue 1 (March 1975)","Volume 40 Issue 1 (September 2013)","http://dl.acm.org/citation.cfm?id=J782","http://dl.acm.org/citation.cfm?id=J782&picked=prox" "Transactions","ACM Transactions on Modeling and Computer Simulation ","ACM Trans. Model. Comput. Simul.","1049-3301","1558-1195","Volume 1 Issue 1 (Jan. 1991)","Volume 23 Issue 4 (October 2013)","http://dl.acm.org/citation.cfm?id=J781","http://dl.acm.org/citation.cfm?id=J781&picked=prox" "Transactions","ACM Transactions on Multimedia Computing, Communications, and Applications ","ACM Trans. Multimedia Comput. Commun. Appl.","1551-6857","1551-6865","Volume 1 Issue 1 (February 2005)","Volume 10 Issue 1 (December 2013)","http://dl.acm.org/citation.cfm?id=J961","http://dl.acm.org/citation.cfm?id=J961&picked=prox" "Transactions","ACM Transactions on Programming Languages and Systems ","ACM Trans. Program. Lang. Syst.","0164-0925","1558-4593","Volume 1 Issue 1 (July 1979)","Volume 35 Issue 4 (December 2013)","http://dl.acm.org/citation.cfm?id=J783","http://dl.acm.org/citation.cfm?id=J783&picked=prox" "Transactions","ACM Transactions on Reconfigurable Technology and Systems ","ACM Trans. Reconfigurable Technol. Syst.","1936-7406","1936-7414","Volume 1 Issue 1 (March 2008)","Volume 6 Issue 4 (December 2013)","http://dl.acm.org/citation.cfm?id=J1151","http://dl.acm.org/citation.cfm?id=J1151&picked=prox" "Transactions","ACM Transactions on Sensor Networks ","ACM Trans. Sen. Netw.","1550-4859","1550-4867","Volume 1 Issue 1 (August 2005)","Volume 10 Issue 1 (November 2013)","http://dl.acm.org/citation.cfm?id=J981","http://dl.acm.org/citation.cfm?id=J981&picked=prox" "Transactions","ACM Transactions on Software Engineering and Methodology ","ACM Trans. Softw. Eng. Methodol.","1049-331X","1557-7392","Volume 1 Issue 1 (Jan. 1992)","Volume 22 Issue 4 (October 2013) - Testing, debugging, and error handling, formal methods, lifecycle concerns, evolution and maintenance","http://dl.acm.org/citation.cfm?id=J790","http://dl.acm.org/citation.cfm?id=J790&picked=prox" "Transactions","ACM Transactions on Speech and Language Processing ","ACM Trans. Speech Lang. Process.","1550-4875","1550-4883","Volume 1 (November 2004)","Volume 10 Issue 3 (July 2013) - Special issue on multiword expressions: From theory to practice and use, part 2","http://dl.acm.org/citation.cfm?id=J957","http://dl.acm.org/citation.cfm?id=J957&picked=prox" "Transactions","ACM Transactions on Storage ","Trans. Storage","1553-3077","1553-3093","Volume 1 Issue 1 (February 2005)","Volume 9 Issue 4 (November 2013)","http://dl.acm.org/citation.cfm?id=J960","http://dl.acm.org/citation.cfm?id=J960&picked=prox" "Transactions","ACM Transactions on the Web ","ACM Trans. Web","1559-1131","1559-114X","Volume 1 Issue 1 (May 2007)","Volume 7 Issue 4 (October 2013)","http://dl.acm.org/citation.cfm?id=J1062","http://dl.acm.org/citation.cfm?id=J1062&picked=prox" "Transactions","IEEE/ACM Transactions on Computational Biology and Bioinformatics ","IEEE/ACM Trans. Comput. Biol. Bioinformatics","1545-5963","","Volume 1 Issue 1 (January 2004)","Volume 10 Issue 3 (May 2013)","http://dl.acm.org/citation.cfm?id=J954","http://dl.acm.org/citation.cfm?id=J954&picked=prox" "Transactions","IEEE/ACM Transactions on Networking ","IEEE/ACM Trans. Netw.","1063-6692","","Volume 1 Issue 1 (Feb. 1993)","Volume 21 Issue 4 (August 2013)","http://dl.acm.org/citation.cfm?id=J771","http://dl.acm.org/citation.cfm?id=J771&picked=prox" "Magazines","ACM Inroads","ACM Inroads","2153-2184","2153-2192","Volume 1 Issue 1 (March 2010)","Volume 4 Issue 4 (December 2013)","http://dl.acm.org/citation.cfm?id=J1268","http://dl.acm.org/citation.cfm?id=J1268&picked=prox" "Magazines","Communications of the ACM","Commun. ACM","0001-0782","1557-7317","Volume 1 Issue 1 (Jan. 1958)","Volume 57 Issue 1 (January 2014)","http://dl.acm.org/citation.cfm?id=J79","http://dl.acm.org/citation.cfm?id=J79&picked=prox" "Magazines","Computers in Entertainment ","Comput. Entertain.","","1544-3574","Volume 1 Issue 1 (October 2003)","Volume 10 Issue 3 (October 2012) - Theoretical and Practical Computer Applications in Entertainment","http://dl.acm.org/citation.cfm?id=J912","http://dl.acm.org/citation.cfm?id=J912&picked=prox" "Magazines","Queue","Queue","1542-7730","1542-7749","Volume 1 Issue 1 (March 2003)","Volume 11 Issue 12 (December 2013) - Large-Scale Implementations","http://dl.acm.org/citation.cfm?id=J882","http://dl.acm.org/citation.cfm?id=J882&picked=prox" "Magazines","StandardView","StandardView","1067-9936","1557-7376","Volume 1 Issue 1 (Sept. 1993)","Volume 6 Issue 4 (Dec. 1998)","http://dl.acm.org/citation.cfm?id=J741","http://dl.acm.org/citation.cfm?id=J741&picked=prox" "Magazines","Ubiquity","Ubiquity","","1530-2180","Volume 2000 Issue February (February 1 - February 28, 2000)","Volume 2013 Issue December (December 2013)","http://dl.acm.org/citation.cfm?id=J793","http://dl.acm.org/citation.cfm?id=J793&picked=prox" "Magazines","XRDS: Crossroads, The ACM Magazine for Students","XRDS","1528-4972","1528-4980","Volume 1 Issue 1 (September 1994)","Volume 20 Issue 2 (Winter 2013)","http://dl.acm.org/citation.cfm?id=J1271","http://dl.acm.org/citation.cfm?id=J1271&picked=prox" "Magazines","eLearn","eLearn","","1535-394X","Volume 2001 Issue 5 (May 2001)","Volume 2013 Issue 12 (12-01-2013) - December 2013","http://dl.acm.org/citation.cfm?id=J815","http://dl.acm.org/citation.cfm?id=J815&picked=prox" "Magazines","intelligence","Intelligence","1523-8822","1557-9425","Issue 24 (October 1970)","Volume 12 Issue 4 (Winter 2001)","http://dl.acm.org/citation.cfm?id=J372","http://dl.acm.org/citation.cfm?id=J372&picked=prox" "Magazines","interactions","interactions","1072-5520","1558-3449","Volume 1 Issue 1 (Jan. 1994)","Volume 20 Issue 6 (November + December 2013)","http://dl.acm.org/citation.cfm?id=J373","http://dl.acm.org/citation.cfm?id=J373&picked=prox" "Magazines","netWorker","netWorker","1091-3556","1558-3473","Volume 1 Issue 1 (March/April 1997)","Volume 13 Issue 4 (Winter 2009) - Health and Biomedical Informatics","http://dl.acm.org/citation.cfm?id=J582","http://dl.acm.org/citation.cfm?id=J582&picked=prox" "Publications by Affiliated Organizations","ALGOL Bulletin","ALGOL Bull.","0084-6198","","Issue 1 (Mar. 1959)","Issue 52 (Aug. 1988)","http://dl.acm.org/citation.cfm?id=J33","http://dl.acm.org/citation.cfm?id=J33&picked=prox" "Publications by Affiliated Organizations","Computational Linguistics","Comput. Linguist.","0891-2017","","Volume 6 Issue 1 (January-March 1980)","Volume 39 Issue 2 (June 2013)","http://dl.acm.org/citation.cfm?id=J25","http://dl.acm.org/citation.cfm?id=J25&picked=prox" "Publications by Affiliated Organizations","Evolutionary Computation","Evol. Comput.","1063-6560","1530-9304","Volume 1 Issue 1 (Spring 1993)","Volume 21 Issue 4 (Winter 2013)","http://dl.acm.org/citation.cfm?id=J277","http://dl.acm.org/citation.cfm?id=J277&picked=prox" "Publications by Affiliated Organizations","Journal of Computing Sciences in Colleges","J. Comput. Sci. Coll.","1937-4771","1937-4763","Volume 6 Issue 5 (May 1991)","Volume 29 Issue 3 (January 2014)","http://dl.acm.org/citation.cfm?id=J420","http://dl.acm.org/citation.cfm?id=J420&picked=prox" "Publications by Affiliated Organizations","Journal of Usability Studies","J. Usability Studies","1931-3357","","Volume 5 Issue 4 (August 2010)","Volume 6 Issue 3 (May 2011)","http://dl.acm.org/citation.cfm?id=J1340","http://dl.acm.org/citation.cfm?id=J1340&picked=prox" "Publications by Affiliated Organizations","Linux Journal","Linux J.","1075-3583","","Volume 1994 Issue 1es (March 1994)","Volume 2013 Issue 235 (November 2013)","http://dl.acm.org/citation.cfm?id=J508","http://dl.acm.org/citation.cfm?id=J508&picked=prox" "Publications by Affiliated Organizations","Mobile Networks and Applications","Mob. Netw. Appl.","1383-469X","","Volume 1 Issue 1 (Aug. 1996)","Volume 18 Issue 5 (October 2013)","http://dl.acm.org/citation.cfm?id=J547","http://dl.acm.org/citation.cfm?id=J547&picked=prox" "Publications by Affiliated Organizations","Personal and Ubiquitous Computing","Personal Ubiquitous Comput.","1617-4909","","Volume 4 Issue 4 (August 2000)","Volume 17 Issue 7 (October 2013)","http://dl.acm.org/citation.cfm?id=J822","http://dl.acm.org/citation.cfm?id=J822&picked=prox" "Publications by Affiliated Organizations","Proceedings of the VLDB Endowment","Proc. VLDB Endow.","2150-8097","","Volume 1 Issue 1 (August 2008)","Volume 6 Issue 14 (September 2013)","http://dl.acm.org/citation.cfm?id=J1174","http://dl.acm.org/citation.cfm?id=J1174&picked=prox" "Publications by Affiliated Organizations","The Journal of Machine Learning Research","J. Mach. Learn. Res.","1532-4435","1533-7928","Volume 1 (9/1/2001)","Volume 14 Issue 1 (January 2013)","http://dl.acm.org/citation.cfm?id=J832","http://dl.acm.org/citation.cfm?id=J832&picked=prox" "Publications by Affiliated Organizations","The VLDB Journal — The International Journal on Very Large Data Bases","The VLDB Journal","1066-8888","","Volume 1 Issue 1 (July 1992)","Volume 22 Issue 5 (October 2013)","http://dl.acm.org/citation.cfm?id=J869","http://dl.acm.org/citation.cfm?id=J869&picked=prox" "Publications by Affiliated Organizations","Wireless Networks","Wirel. Netw.","1022-0038","","Volume 1 Issue 1 (Feb. 1995)","Volume 19 Issue 7 (October 2013)","http://dl.acm.org/citation.cfm?id=J804","http://dl.acm.org/citation.cfm?id=J804&picked=prox" "SIG Newsletters","3C ON-LINE","3C ON-LINE","1078-2192","","Volume 1 Issue 1 (Oct. 1994)","Volume 4 Issue 4 (Oct., 1997)","http://dl.acm.org/citation.cfm?id=J685","http://dl.acm.org/citation.cfm?id=J685&picked=prox" "SIG Newsletters","ACM Communications in Computer Algebra","ACM Commun. Comput. Algebra","1932-2240","","Issue 8 (December 1967)","Volume 47 Issue 1/2 (March/June 2013)","http://dl.acm.org/citation.cfm?id=J1000","http://dl.acm.org/citation.cfm?id=J1000&picked=prox" "SIG Newsletters","ACM Lisp Bulletin","Lisp Bull.","","","Volume 4 Issue 9 (September 1969)","Issue 3 (December 1979)","http://dl.acm.org/citation.cfm?id=J1166","http://dl.acm.org/citation.cfm?id=J1166&picked=prox" "SIG Newsletters","ACM SIGACCESS Accessibility and Computing","SIGACCESS Access. Comput.","1558-2337","1558-1187","Issue 77-78 (Sept. 2003 - Jan. 2004)","Issue 107 (September 2013)","http://dl.acm.org/citation.cfm?id=J956","http://dl.acm.org/citation.cfm?id=J956&picked=prox" "SIG Newsletters","ACM SIGACT News","SIGACT News","0163-5700","","Issue 1 (April 1969)","Volume 44 Issue 4 (December 2013)","http://dl.acm.org/citation.cfm?id=J697","http://dl.acm.org/citation.cfm?id=J697&picked=prox" "SIG Newsletters","ACM SIGAPL APL Quote Quad","SIGAPL APL Quote Quad","0163-6006","","Volume 3 Issue 1 (June 1971)","Volume 35 Issue 4 (December 2007)","http://dl.acm.org/citation.cfm?id=J46","http://dl.acm.org/citation.cfm?id=J46&picked=prox" "SIG Newsletters","ACM SIGAPP Applied Computing Review","SIGAPP Appl. Comput. Rev.","1559-6915","1931-0161","Volume 1 Issue 1 (Winter 1993)","Volume 13 Issue 3 (September 2013)","http://dl.acm.org/citation.cfm?id=J693","http://dl.acm.org/citation.cfm?id=J693&picked=prox" "SIG Newsletters","ACM SIGARCH Computer Architecture News","SIGARCH Comput. Archit. News","0163-5964","","Volume 1 Issue 1 (January 1972)","Volume 41 Issue 3 (June 2013) - ICSA '13","http://dl.acm.org/citation.cfm?id=J89","http://dl.acm.org/citation.cfm?id=J89&picked=prox" "SIG Newsletters","ACM SIGART Bulletin","SIGART Bull.","0163-5719","","Issue 24 (October 1970)","Volume 12 Issue 4 (Winter 2001)","http://dl.acm.org/citation.cfm?id=J686","http://dl.acm.org/citation.cfm?id=J686&picked=prox" "SIG Newsletters","ACM SIGAda Ada Letters","Ada Lett.","1094-3641","","Volume I Issue 1 (July-August 1981)","Volume 33 Issue 2 (August 2013)","http://dl.acm.org/citation.cfm?id=J32","http://dl.acm.org/citation.cfm?id=J32&picked=prox" "SIG Newsletters","ACM SIGBED Review","SIGBED Rev.","","1551-3688","Volume 1 Issue 1 (April 2004)","Volume 10 Issue 3 (October 2013)","http://dl.acm.org/citation.cfm?id=J994","http://dl.acm.org/citation.cfm?id=J994&picked=prox" "SIG Newsletters","ACM SIGBIO Newsletter","SIGBIO Newsl.","0163-5697","","Volume 1 Issue 2 (October 1976)","Volume 21 Issue 1 (April 2001)","http://dl.acm.org/citation.cfm?id=J698","http://dl.acm.org/citation.cfm?id=J698&picked=prox" "SIG Newsletters","ACM SIGBioinformatics Record","ACM SIGBioinformatics Rec.","2331-9291","2159-1210","Volume 1 Issue 1 (January 2011)","Volume 3 Issue 3 (September 2013)","http://dl.acm.org/citation.cfm?id=J1323","http://dl.acm.org/citation.cfm?id=J1323&picked=prox" "SIG Newsletters","ACM SIGCAPH Computers and the Physically Handicapped","SIGCAPH Comput. Phys. Handicap.","0163-5727","","Issue 5 (Fall 1971)","Issue 76 (June 2003)","http://dl.acm.org/citation.cfm?id=J298","http://dl.acm.org/citation.cfm?id=J298&picked=prox" "SIG Newsletters","ACM SIGCAS Computers and Society","SIGCAS Comput. Soc.","0095-2737","","Volume 1 Issue 2 (April 1970)","Volume 43 Issue 1 (May 2013) - Selected Papers from The Ninth International Conference on Computer Ethics: Philosophical Enquiry","http://dl.acm.org/citation.cfm?id=J198","http://dl.acm.org/citation.cfm?id=J198&picked=prox" "SIG Newsletters","ACM SIGCHI Bulletin","SIGCHI Bull.","0736-6906","","Volume 14 Issue 1 (July 1982)","Volume 32 Issue 2 (April 2000)","http://dl.acm.org/citation.cfm?id=J687","http://dl.acm.org/citation.cfm?id=J687&picked=prox" "SIG Newsletters","ACM SIGCHI Bulletin - a supplement to interactions","SIGCHI Bull.: suppl. interactions","0736-6906","1558-1217","Volume 2000 (July/August 2000)","Volume 2003 (May-June 2003)","http://dl.acm.org/citation.cfm?id=J122","http://dl.acm.org/citation.cfm?id=J122&picked=prox" "SIG Newsletters","ACM SIGCOMM Computer Communication Review","SIGCOMM Comput. Commun. Rev.","0146-4833","","Volume 1 Issue 2 (March 1970)","Volume 43 Issue 5 (October 2013)","http://dl.acm.org/citation.cfm?id=J101","http://dl.acm.org/citation.cfm?id=J101&picked=prox" "SIG Newsletters","ACM SIGCPR Computer Personnel","SIGCPR Comput. Pers.","0160-2497","","Volume 2 Issue 1 (July 1964)","Volume 20 Issue 4 (October 1999)","http://dl.acm.org/citation.cfm?id=J188","http://dl.acm.org/citation.cfm?id=J188&picked=prox" "SIG Newsletters","ACM SIGCSE Bulletin","SIGCSE Bull.","0097-8418","","Volume 1 Issue 1 (February 1969)","Volume 45 Issue 4 (October 2013)","http://dl.acm.org/citation.cfm?id=J688","http://dl.acm.org/citation.cfm?id=J688&picked=prox" "SIG Newsletters","ACM SIGCSIM Installation Management Review","Install Manag. Rev.","0163-5972","","Issue 1 (August 1969)","Volume 6 Issue 4 (December 1977)","http://dl.acm.org/citation.cfm?id=J959","http://dl.acm.org/citation.cfm?id=J959&picked=prox" "SIG Newsletters","ACM SIGCUE Outlook","SIGCUE Outlook","0163-5735","","Volume 4 Issue 1 (February 1970)","Volume 27 Issue 3 (September 2001)","http://dl.acm.org/citation.cfm?id=J678","http://dl.acm.org/citation.cfm?id=J678&picked=prox" "SIG Newsletters","ACM SIGDA Newsletter","SIGDA Newsl.","0163-5743","","Volume 1 Issue 1 (January 1971)","Volume 40 Issue 9 (September 2010)","http://dl.acm.org/citation.cfm?id=J700","http://dl.acm.org/citation.cfm?id=J700&picked=prox" "SIG Newsletters","ACM SIGDOC Asterisk Journal of Computer Documentation","SIGDOC Asterisk J. Comput. Doc.","0731-1001","","Volume 2 Issue 5 (October 1975)","Volume 12 Issue 4 (December 2011)","http://dl.acm.org/citation.cfm?id=J62","http://dl.acm.org/citation.cfm?id=J62&picked=prox" "SIG Newsletters","ACM SIGEVOlution","SIGEVOlution","","1931-8499","Volume 1 Issue 1 (April 2006)","Volume 6 Issue 1 (July 2012)","http://dl.acm.org/citation.cfm?id=J999","http://dl.acm.org/citation.cfm?id=J999&picked=prox" "SIG Newsletters","ACM SIGFORTH Newsletter","SIGFORTH Newsl.","1047-4544","","Volume 1 Issue 1 (Spring 1989)","Volume 4 Issue 4 (Dec. 1994)","http://dl.acm.org/citation.cfm?id=J696","http://dl.acm.org/citation.cfm?id=J696&picked=prox" "SIG Newsletters","ACM SIGGRAPH Computer Graphics","SIGGRAPH Comput. Graph.","0097-8930","","Volume 3 Issue 3 (Fal 1969)","Volume 45 Issue 1 (February 2011)","http://dl.acm.org/citation.cfm?id=J166","http://dl.acm.org/citation.cfm?id=J166&picked=prox" "SIG Newsletters","ACM SIGGROUP Bulletin","SIGGROUP Bull.","","","Volume 18 Issue 1 (April 1997)","Volume 25 Issue 2 (February 2005) - Special issue on virtual communities","http://dl.acm.org/citation.cfm?id=J702","http://dl.acm.org/citation.cfm?id=J702&picked=prox" "SIG Newsletters","ACM SIGHIT Record","SIGHIT Rec.","","2158-8813","Volume 1 Issue 1 (March 2011)","Volume 2 Issue 2 (September 2012)","http://dl.acm.org/citation.cfm?id=J1322","http://dl.acm.org/citation.cfm?id=J1322&picked=prox" "SIG Newsletters","ACM SIGHPC Connect","ACM SIGHPC Connect","","2168-135X","Volume 1 Issue 1 (June 2012)","Volume 2 Issue 1 (October 2013)","http://dl.acm.org/citation.cfm?id=J1356","http://dl.acm.org/citation.cfm?id=J1356&picked=prox" "SIG Newsletters","ACM SIGICE Bulletin","SIGICE Bull.","0893-2875","","Volume 19 Issue 3 (Feb. 1994)","Volume 23 Issue 2 (Oct. 1997)","http://dl.acm.org/citation.cfm?id=J694","http://dl.acm.org/citation.cfm?id=J694&picked=prox" "SIG Newsletters","ACM SIGIR Forum","SIGIR Forum","0163-5840","","Volume 6 Issue 2 (Summer 1971)","Volume 47 Issue 1 (June 2013)","http://dl.acm.org/citation.cfm?id=J701","http://dl.acm.org/citation.cfm?id=J701&picked=prox" "SIG Newsletters","ACM SIGITE Newsletter","SIGITE Newsl.","2166-1685","1550-1469","Volume 2 Issue 1 (Spring 2004)","Volume 9 Issue 2 (December 2012)","http://dl.acm.org/citation.cfm?id=J977","http://dl.acm.org/citation.cfm?id=J977&picked=prox" "SIG Newsletters","ACM SIGKDD Explorations Newsletter","SIGKDD Explor. Newsl.","1931-0145","1931-0153","Volume 1 Issue 1 (June 1999)","Volume 14 Issue 2 (December 2012)","http://dl.acm.org/citation.cfm?id=J721","http://dl.acm.org/citation.cfm?id=J721&picked=prox" "SIG Newsletters","ACM SIGLASH Newsletter","SIGLASH Newsl.","0036-147X","1931-1095","Volume 10 Issue 1-2 (December 1976/March 1977)","Volume 14 Issue 1-2 (March/June 1981)","http://dl.acm.org/citation.cfm?id=J958","http://dl.acm.org/citation.cfm?id=J958&picked=prox" "SIG Newsletters","ACM SIGMAP Bulletin","SIGMAP Bull.","0163-5786","1931-1184","Issue 5 (June 1969)","Issue 32 (April 1983)","http://dl.acm.org/citation.cfm?id=J952","http://dl.acm.org/citation.cfm?id=J952&picked=prox" "SIG Newsletters","ACM SIGMETRICS Performance Evaluation Review","SIGMETRICS Perform. Eval. Rev.","0163-5999","","Volume 1 Issue 1 (March 1972)","Volume 41 Issue 2 (September 2013) - Special issue on the 31st international symposium on computer performance, modeling, measurements and evaluation (IFIPWG 7.3 Performance 2013)","http://dl.acm.org/citation.cfm?id=J618","http://dl.acm.org/citation.cfm?id=J618&picked=prox" "SIG Newsletters","ACM SIGMICRO Newsletter","SIGMICRO Newsl.","1050-916X","","Volume 2 Issue 4 (January 1972)","Volume 23 Issue 1-2 (Dec. 1992)","http://dl.acm.org/citation.cfm?id=J703","http://dl.acm.org/citation.cfm?id=J703&picked=prox" "SIG Newsletters","ACM SIGMINI Newsletter","SIGMINI Newsl.","0163-576X","","Volume 1 Issue 1 (July 1975)","Volume 4 Issue 4 (August 1978)","http://dl.acm.org/citation.cfm?id=J951","http://dl.acm.org/citation.cfm?id=J951&picked=prox" "SIG Newsletters","ACM SIGMIS Database","SIGMIS Database","0095-0033","","Volume 1 Issue 2 (Summer 1969)","Volume 44 Issue 4 (November 2013)","http://dl.acm.org/citation.cfm?id=J219","http://dl.acm.org/citation.cfm?id=J219&picked=prox" "SIG Newsletters","ACM SIGMOBILE Mobile Computing and Communications Review","SIGMOBILE Mob. Comput. Commun. Rev.","1559-1662","1931-1222","Volume 1 Issue 1 (April 1997)","Volume 17 Issue 4 (October 2013)","http://dl.acm.org/citation.cfm?id=J548","http://dl.acm.org/citation.cfm?id=J548&picked=prox" "SIG Newsletters","ACM SIGMOD Record","SIGMOD Rec.","0163-5808","","Volume 1 Issue 1 (August 1969)","Volume 42 Issue 3 (September 2013)","http://dl.acm.org/citation.cfm?id=J689","http://dl.acm.org/citation.cfm?id=J689&picked=prox" "SIG Newsletters","ACM SIGMultimedia Records","SIGMultimedia Rec.","","1947-4598","Volume 1 Issue 1 (March 2009)","Volume 5 Issue 3 (September 2013)","http://dl.acm.org/citation.cfm?id=J1232","http://dl.acm.org/citation.cfm?id=J1232&picked=prox" "SIG Newsletters","ACM SIGNUM Newsletter","SIGNUM Newsl.","0163-5778","","Volume 1 Issue 1 (June 1966)","Volume 33 Issue 2 (April 1, 1998)","http://dl.acm.org/citation.cfm?id=J690","http://dl.acm.org/citation.cfm?id=J690&picked=prox" "SIG Newsletters","ACM SIGOA Newsletter","ACM SIGOA Newsletter","0737-819X","","Volume 1 Issue 1 (March 1980)","Volume 7 Issue 1 (Spring 1986)","http://dl.acm.org/citation.cfm?id=J915","http://dl.acm.org/citation.cfm?id=J915&picked=prox" "SIG Newsletters","ACM SIGOIS Bulletin","SIGOIS Bull.","0894-0819","","Volume 7 Issue 2-3 (Summer-Fall 1986)","Volume 17 Issue 3 (Dec. 1996)","http://dl.acm.org/citation.cfm?id=J705","http://dl.acm.org/citation.cfm?id=J705&picked=prox" "SIG Newsletters","ACM SIGOPS Operating Systems Review","SIGOPS Oper. Syst. Rev.","0163-5980","","Volume 3 Issue 1 (February 1969)","Volume 47 Issue 3 (December 2013)","http://dl.acm.org/citation.cfm?id=J597","http://dl.acm.org/citation.cfm?id=J597&picked=prox" "SIG Newsletters","ACM SIGPC Notes","SIGPC Note.","0163-5816","","Volume 1 Issue 2 (Summer 1978)","Volume 5 Issue 1-2 (Fall/Winter 1982/1983)","http://dl.acm.org/citation.cfm?id=J950","http://dl.acm.org/citation.cfm?id=J950&picked=prox" "SIG Newsletters","ACM SIGPLAN Fortran Forum","SIGPLAN Fortran Forum","1061-7264","1931-1311","Volume 1 Issue 1 (July 1982)","Volume 32 Issue 3 (December 2013)","http://dl.acm.org/citation.cfm?id=J286","http://dl.acm.org/citation.cfm?id=J286&picked=prox" "SIG Newsletters","ACM SIGPLAN Lisp Pointers","SIGPLAN Lisp Pointers","1045-3563","","Volume 1 Issue 1 (April-May 1987)","Volume VIII Issue 2 (May-Aug., 1995)","http://dl.acm.org/citation.cfm?id=J509","http://dl.acm.org/citation.cfm?id=J509&picked=prox" "SIG Newsletters","ACM SIGPLAN Notices","SIGPLAN Not.","0362-1340","1558-1160","Volume 1 Issue 8 (August 1966)","Volume 48 Issue 11 (November 2013) - ISMM '13","http://dl.acm.org/citation.cfm?id=J706","http://dl.acm.org/citation.cfm?id=J706&picked=prox" "SIG Newsletters","ACM SIGPLAN OOPS Messenger","SIGPLAN OOPS Mess.","1055-6400","","Volume 1 Issue 1 (Aug. 1990)","Volume 7 Issue 1 (Jan. 1996) - Special issue: object-oriented real-time systems","http://dl.acm.org/citation.cfm?id=J594","http://dl.acm.org/citation.cfm?id=J594&picked=prox" "SIG Newsletters","ACM SIGSAC Review","SIGSAC Rev.","0277-920X","","Volume 1 Issue 1 (Winter 1981-1982)","Volume 15 Issue 2 (April 1997)","http://dl.acm.org/citation.cfm?id=J691","http://dl.acm.org/citation.cfm?id=J691&picked=prox" "SIG Newsletters","ACM SIGSAM Bulletin","SIGSAM Bull.","0163-5824","","Issue 8 (December 1967)","Volume 47 Issue 1/2 (March/June 2013)","http://dl.acm.org/citation.cfm?id=J707","http://dl.acm.org/citation.cfm?id=J707&picked=prox" "SIG Newsletters","ACM SIGSIM Simulation Digest","SIGSIM Simul. Dig.","0163-6103","","Volume 3 Issue 1 (September 1971)","Volume 28 Issue 1 (July 1998)","http://dl.acm.org/citation.cfm?id=J711","http://dl.acm.org/citation.cfm?id=J711&picked=prox" "SIG Newsletters","ACM SIGSMALL Newsletter","SIGSMALL Newsl.","0272-720X","","Volume 4 Issue 5 (October 1978)","Volume 10 Issue 4 (October 1984)","http://dl.acm.org/citation.cfm?id=J949","http://dl.acm.org/citation.cfm?id=J949&picked=prox" "SIG Newsletters","ACM SIGSMALL/PC Notes","SIGSMALL/PC Notes","0893-2875","","Volume 11 Issue 3 (Aug. 1985)","Volume 19 Issue 2 (Nov. 1993)","http://dl.acm.org/citation.cfm?id=J692","http://dl.acm.org/citation.cfm?id=J692&picked=prox" "SIG Newsletters","ACM SIGSOC Bulletin","SIGSOC Bull.","0163-5794","","Volume 1 Issue 1 (March 1969)","Volume 13 Issue 4 (April 1982)","http://dl.acm.org/citation.cfm?id=J948","http://dl.acm.org/citation.cfm?id=J948&picked=prox" "SIG Newsletters","ACM SIGSOFT Software Engineering Notes","SIGSOFT Softw. Eng. Notes","0163-5948","","Volume 1 Issue 1 (May 1976)","Volume 38 Issue 6 (November 2013)","http://dl.acm.org/citation.cfm?id=J728","http://dl.acm.org/citation.cfm?id=J728&picked=prox" "SIG Newsletters","ACM SIGUCCS Newsletter","SIGUCCS Newsl.","0736-6892","","Volume 1 Issue 1 (January 1965)","Volume 28 Issue 4 (Dec. 1998)","http://dl.acm.org/citation.cfm?id=J708","http://dl.acm.org/citation.cfm?id=J708&picked=prox" "SIG Newsletters","ACM SIGUCCS plugged in","ACM SIGUCCS plugged in","","2168-8516","Volume 1 Issue 1 (Summer 2012)","Volume 2 Issue 1 (Summer 2013)","http://dl.acm.org/citation.cfm?id=J1358","http://dl.acm.org/citation.cfm?id=J1358&picked=prox" "SIG Newsletters","ACM SIGWEB Newsletter","SIGWEB Newsl.","1931-1745","1931-1435","Volume 1 Issue 1 (March 1992)","Issue Autumn (Autumn 2013)","http://dl.acm.org/citation.cfm?id=J507","http://dl.acm.org/citation.cfm?id=J507&picked=prox" "SIG Newsletters","ACM SIGecom Exchanges","SIGecom Exch.","","1551-9031","Volume 1 Issue 1 (Summer, 2000)","Volume 12 Issue 1 (June 2013)","http://dl.acm.org/citation.cfm?id=J684","http://dl.acm.org/citation.cfm?id=J684&picked=prox" "SIG Newsletters","Communication Design Quarterly Review","Commun. Des. Q. Rev","2166-1200","2166-1642","Volume 2 Issue 1 (March 2001)","Volume 2 Issue 1 (November 2013)","http://dl.acm.org/citation.cfm?id=J1351","http://dl.acm.org/citation.cfm?id=J1351&picked=prox" "SIG Newsletters","SIGSPATIAL Special","SIGSPATIAL Special","","1946-7729","Volume 1 Issue 1 (March 2009)","Volume 5 Issue 3 (November 2013)","http://dl.acm.org/citation.cfm?id=J1196","http://dl.acm.org/citation.cfm?id=J1196&picked=prox" "Conference Proceedings","3DOR: 3D Object Retrieval","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/3dor/","http://portal.acm.org/proceedings/3dor/archive/" "Conference Proceedings","3DVP: 3D Video Processing","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/3dvp/","http://portal.acm.org/proceedings/3dvp/archive/" "Conference Proceedings","A-MOST: Advances in Model-Based Testing","","","","2005 (May 2005)","2007 (July 2007)","http://portal.acm.org/proceedings/a-most/","http://portal.acm.org/proceedings/a-most/archive/" "Conference Proceedings","A2CWiC: Amrita ACM-W Celebration on Women in Computing in India","","","","2010 (September 2010)","2010 (September 2010)","http://portal.acm.org/proceedings/a2cwic/","http://portal.acm.org/proceedings/a2cwic/archive/" "Conference Proceedings","AAA-IDEA: Advanced Architectures and Algorithms for Internet Delivery and Applications","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/aaa-idea/","http://portal.acm.org/proceedings/aaa-idea/archive/" "Conference Proceedings","AADEBUG: Automated analysis-driven debugging","","","","2005 (September 2005)","2005 (September 2005)","http://portal.acm.org/proceedings/aadebug/","http://portal.acm.org/proceedings/aadebug/archive/" "Conference Proceedings","AAMAS: Autonomous Agents and Multiagent Systems","","","","2002 (July 2002)","2013 (May 2013)","http://portal.acm.org/proceedings/aamas/","http://portal.acm.org/proceedings/aamas/archive/" "Conference Proceedings","ACDC: Automated Control for Datacenters and Clouds","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/acdc/","http://portal.acm.org/proceedings/acdc/archive/" "Conference Proceedings","ACET: Advances in Computer Entertainment Technology","","","","2004 (September 2004)","2011 (November 2011)","http://portal.acm.org/proceedings/ace/","http://portal.acm.org/proceedings/ace/archive/" "Conference Proceedings","ACISNR: Applications of Computer and Information Sciences to Nature Research","","","","2010 (May 2010)","2010 (May 2010)","http://portal.acm.org/proceedings/acisnr/","http://portal.acm.org/proceedings/acisnr/archive/" "Conference Proceedings","ACL2: ACL2 Theorem Prover and its Applications","","","","2006 (August 2006)","2009 (May 2009)","http://portal.acm.org/proceedings/acl2/","http://portal.acm.org/proceedings/acl2/archive/" "Conference Proceedings","ACM DEV: Computing for Development","","","","2010 (December 2010)","2013 (January 2013)","http://portal.acm.org/proceedings/acmdev/","http://portal.acm.org/proceedings/acmdev/archive/" "Conference Proceedings","ACM POLICY: ACM POLICY","","","","1998 (June 1998)","1998 (June 1998)","http://portal.acm.org/proceedings/acmpolicy/","http://portal.acm.org/proceedings/acmpolicy/archive/" "Conference Proceedings","ACM SE: Annual Southeast Regional Conference","","","","1967 (June 1967)","2013 (April 2013)","http://portal.acm.org/proceedings/acmse/","http://portal.acm.org/proceedings/acmse/archive/" "Conference Proceedings","ACM-BCS: ACM-BCS","","","","2010 (April 2010)","2010 (April 2010)","http://portal.acm.org/proceedings/acm-bcs/","http://portal.acm.org/proceedings/acm-bcs/archive/" "Conference Proceedings","ACM: ACM Annual Conference/Annual Meeting","","","","1952 (May 1952)","1987 (December 1987)","http://portal.acm.org/proceedings/acm/","http://portal.acm.org/proceedings/acm/archive/" "Conference Proceedings","ACPIS: Aspects, Components, and Patterns for Infrastructure Software","","","","2007 (March 2007)","2009 (March 2009)","http://portal.acm.org/proceedings/acpis/","http://portal.acm.org/proceedings/acpis/archive/" "Conference Proceedings","ACSAC: Annual Computer Security Applications Conference","","","","2010 (December 2010)","2012 (December 2012)","http://portal.acm.org/proceedings/acsac/","http://portal.acm.org/proceedings/acsac/archive/" "Conference Proceedings","ACSE: Australasian Conference on Computing Education","","","","1996 (July 1996)","2010 (January 2010)","http://portal.acm.org/proceedings/acse/","http://portal.acm.org/proceedings/acse/archive/" "Conference Proceedings","ACoM: Assessment of Contemporary Modularization Techniques","","","","2007 (May 2007)","2007 (May 2007)","http://portal.acm.org/proceedings/acom/","http://portal.acm.org/proceedings/acom/archive/" "Conference Proceedings","ADAMUS: Adaptive and Dependable Mobile Ubiquitous Systems","","","","2009 (July 2009)","2009 (July 2009)","http://portal.acm.org/proceedings/adamus/","http://portal.acm.org/proceedings/adamus/archive/" "Conference Proceedings","ADKDD: Data Mining and Audience Intelligence for Advertising","","","","2007 (August 2007)","2013 (August 2013)","http://portal.acm.org/proceedings/adkdd/","http://portal.acm.org/proceedings/adkdd/archive/" "Conference Proceedings","ADPUC: Advanced Data Processing in Ubiquitous Computing ","","","","2006 (November 2006)","2006 (November 2006)","http://portal.acm.org/proceedings/adpuc/","http://portal.acm.org/proceedings/adpuc/archive/" "Conference Proceedings","AFFINE: Affective-Aware Virtual Agents and Social Robots","","","","2009 (November 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/affine/","http://portal.acm.org/proceedings/affine/archive/" "Conference Proceedings","AFIPS: AFIPS","","","","1955 (March 1955)","1984 (July 1984)","http://portal.acm.org/proceedings/afips/","http://portal.acm.org/proceedings/afips/archive/" "Conference Proceedings","AFM: Automated Formal Methods","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/afm/","http://portal.acm.org/proceedings/afm/archive/" "Conference Proceedings","AFRIGRAPH: Computer Graphics, Virtual Reality, Visualisation and Interaction in Africa","","","","2001 (November 2001)","2010 (June 2010)","http://portal.acm.org/proceedings/afrigraph/","http://portal.acm.org/proceedings/afrigraph/archive/" "Conference Proceedings","AGENTS: Autonomous Agents","","","","1997 (February 1997)","2001 (May 2001)","http://portal.acm.org/proceedings/agents/","http://portal.acm.org/proceedings/agents/archive/" "Conference Proceedings","AH: Augmented Human","","","","2010 (April 2010)","2013 (March 2013)","http://portal.acm.org/proceedings/ah/","http://portal.acm.org/proceedings/ah/archive/" "Conference Proceedings","AIEE-IRE: AIEE-IRE","","","","1951 (December 1951)","1962 (May 1962)","http://portal.acm.org/proceedings/aiee-ire/","http://portal.acm.org/proceedings/aiee-ire/archive/" "Conference Proceedings","AIEMPro: Automated Information Extraction in Media Production","","","","2010 (October 2010)","2011 (December 2011)","http://portal.acm.org/proceedings/aiempro/","http://portal.acm.org/proceedings/aiempro/archive/" "Conference Proceedings","AIGC: Artificial Intelligence in Grid Computing","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/aigc/","http://portal.acm.org/proceedings/aigc/archive/" "Conference Proceedings","AINTEC: Asian Conference on Internet Engineering","","","","2008 (November 2008)","2012 (November 2012)","http://portal.acm.org/proceedings/aintec/","http://portal.acm.org/proceedings/aintec/archive/" "Conference Proceedings","AIPACa: Applications of Private and Anonymous Communications","","","","2008 (September 2008)","2008 (September 2008)","http://portal.acm.org/proceedings/aipaca/","http://portal.acm.org/proceedings/aipaca/archive/" "Conference Proceedings","AIRS: Asia Information Retrieval Symposium ","","","","2008 (January 2008)","2009 (October 2009)","http://portal.acm.org/proceedings/airs/","http://portal.acm.org/proceedings/airs/archive/" "Conference Proceedings","AIRWeb: Adversarial Information Retrieval on the Web","","","","2007 (May 2007)","2009 (April 2009)","http://portal.acm.org/proceedings/airweb/","http://portal.acm.org/proceedings/airweb/archive/" "Conference Proceedings","AISC/MKM/Calculemus: AISC/MKM/Calculemus Conference on Intelligent Computer Mathematics","","","","2010 (July 2010)","2010 (July 2010)","http://portal.acm.org/proceedings/aisc/mkm/calculemus/","http://portal.acm.org/proceedings/aisc/mkm/calculemus/archive/" "Conference Proceedings","AISec: Artificial Intelligence and Security","","","","2008 (October 2008)","2013 (November 2013)","http://portal.acm.org/proceedings/aisec/","http://portal.acm.org/proceedings/aisec/archive/" "Conference Proceedings","ALICE: Alice Symposium","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/alice/","http://portal.acm.org/proceedings/alice/archive/" "Conference Proceedings","AM: Audio Mostly","","","","2010 (September 2010)","2012 (September 2012)","http://portal.acm.org/proceedings/am/","http://portal.acm.org/proceedings/am/archive/" "Conference Proceedings","AMC: Ambient Media Computing","","","","2009 (October 2009)","2009 (October 2009)","http://portal.acm.org/proceedings/amc/","http://portal.acm.org/proceedings/amc/archive/" "Conference Proceedings","AMCMM: Audio and Music Computing Multimedia","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/amcmm/","http://portal.acm.org/proceedings/amcmm/archive/" "Conference Proceedings","ANCS: Architectures for Networking and Communications Systems","","","","2005 (October 2005)","2013 (October 2013)","http://portal.acm.org/proceedings/ancs/","http://portal.acm.org/proceedings/ancs/archive/" "Conference Proceedings","AND: Analytics for Noisy Unstructured Text Data","","","","2008 (July 2008)","2010 (October 2010)","http://portal.acm.org/proceedings/and/","http://portal.acm.org/proceedings/and/archive/" "Conference Proceedings","ANNA: Analysis of Neural Network Applications","","","","1991 (May 1991)","1991 (May 1991)","http://portal.acm.org/proceedings/anna/","http://portal.acm.org/proceedings/anna/archive/" "Conference Proceedings","ANSS: Annual Simulation Symposium","","","","1973 (June 1973)","2013 (April 2013)","http://portal.acm.org/proceedings/anss/","http://portal.acm.org/proceedings/anss/archive/" "Conference Proceedings","AOM: Aspect-Oriented Modeling","","","","2007 (March 2007)","2009 (March 2009)","http://portal.acm.org/proceedings/aom/","http://portal.acm.org/proceedings/aom/archive/" "Conference Proceedings","AOMD: Aspect Oriented Middleware Development","","","","2005 (November 2005)","2005 (November 2005)","http://portal.acm.org/proceedings/aomd/","http://portal.acm.org/proceedings/aomd/archive/" "Conference Proceedings","AOSD: Aspect-Oriented Software Development","","","","2002 (April 2002)","2013 (March 2013)","http://portal.acm.org/proceedings/aosd/","http://portal.acm.org/proceedings/aosd/archive/" "Conference Proceedings","APGV: Applied Perception in Graphics and Visualization","","","","2004 (August 2004)","2011 (August 2011)","http://portal.acm.org/proceedings/apgv/","http://portal.acm.org/proceedings/apgv/archive/" "Conference Proceedings","APL: APL","","","","1969 (January 1969)","2003 (June 2003)","http://portal.acm.org/proceedings/apl/","http://portal.acm.org/proceedings/apl/archive/" "Conference Proceedings","APLWACA: Analysis and Programming Languages for Web Applications and Cloud Applications","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/aplwaca/","http://portal.acm.org/proceedings/aplwaca/archive/" "Conference Proceedings","APOS: Scrutinizing Agile Practices","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/apos/","http://portal.acm.org/proceedings/apos/archive/" "Conference Proceedings","APS: Adaptive, Personalization & the Semantic Web","","","","2006 (August 2006)","2006 (August 2006)","http://portal.acm.org/proceedings/aps/","http://portal.acm.org/proceedings/aps/archive/" "Conference Proceedings","APSys: Asia-Pacific Workshop on Systems","","","","2010 (August 2010)","2013 (July 2013)","http://portal.acm.org/proceedings/apsys/","http://portal.acm.org/proceedings/apsys/archive/" "Conference Proceedings","AREA: Analysis and Retrieval of Events","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/area/","http://portal.acm.org/proceedings/area/archive/" "Conference Proceedings","ARM: Adaptive and Reflective MIddleware","","","","2004 (October 2004)","2013 (December 2013)","http://portal.acm.org/proceedings/arm/","http://portal.acm.org/proceedings/arm/archive/" "Conference Proceedings","ARTEMIS: Analysis and Retrieval of Tracked Events and Motion in Imagery Streams","","","","2010 (October 2010)","2013 (October 2013)","http://portal.acm.org/proceedings/artemis/","http://portal.acm.org/proceedings/artemis/archive/" "Conference Proceedings","ASE: Automated Software Engineering","","","","1997 (November 1997)","2012 (September 2012)","http://portal.acm.org/proceedings/ase/","http://portal.acm.org/proceedings/ase/archive/" "Conference Proceedings","ASIA CCS: Information, Computer and Communications Security","","","","2006 (March 2006)","2013 (May 2013)","http://portal.acm.org/proceedings/asiaccs/","http://portal.acm.org/proceedings/asiaccs/archive/" "Conference Proceedings","ASIA-PEPM: Partial Evaluation and Semantics-Based Program Manipulation","","","","2002 (September 2002)","2002 (September 2002)","http://portal.acm.org/proceedings/asia-pepm/","http://portal.acm.org/proceedings/asia-pepm/archive/" "Conference Proceedings","ASID: Architectural and System Support for Improving Software Dependability","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/asid/","http://portal.acm.org/proceedings/asid/archive/" "Conference Proceedings","ASPDAC: Asia and South Pacific Design Automation Conference","","","","1995 (August 1995)","2011 (January 2011)","http://portal.acm.org/proceedings/aspdac/","http://portal.acm.org/proceedings/aspdac/archive/" "Conference Proceedings","ASPLOS: Architectural Support for Programming Languages and Operating Systems","","","","1982 (March 1982)","2013 (March 2013)","http://portal.acm.org/proceedings/asplos/","http://portal.acm.org/proceedings/asplos/archive/" "Conference Proceedings","AST: Automation of Software Test","","","","2006 (May 2006)","2011 (May 2011)","http://portal.acm.org/proceedings/ast/","http://portal.acm.org/proceedings/ast/archive/" "Conference Proceedings","AUIC: User Interface","","","","2001 (January 2001)","2010 (January 2010)","http://portal.acm.org/proceedings/auic/","http://portal.acm.org/proceedings/auic/archive/" "Conference Proceedings","AUPC: Agent-Oriented Software Engineering Challenges for Ubiquitous and Pervasive Computing","","","","2008 (July 2008)","2009 (July 2009)","http://portal.acm.org/proceedings/aupc/","http://portal.acm.org/proceedings/aupc/archive/" "Conference Proceedings","AVI: Advanced Visual Interfaces","","","","1994 (June 1994)","2012 (May 2012)","http://portal.acm.org/proceedings/avi/","http://portal.acm.org/proceedings/avi/archive/" "Conference Proceedings","AVSTP2P: Advanced video streaming techniques for peer-to-peer networks and social networking","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/avstp2p/","http://portal.acm.org/proceedings/avstp2p/archive/" "Conference Proceedings","AcessNets: Access Networks","","","","2006 (September 2006)","2006 (September 2006)","http://portal.acm.org/proceedings/acessnets/","http://portal.acm.org/proceedings/acessnets/archive/" "Conference Proceedings","Ambi-Sys: Ambient Media and Systems","","","","2008 (February 2008)","2008 (February 2008)","http://portal.acm.org/proceedings/ambi-sys/","http://portal.acm.org/proceedings/ambi-sys/archive/" "Conference Proceedings","Assets: Computers and Accessibility","","","","1994 (October 1994)","2013 (October 2013)","http://portal.acm.org/proceedings/assets/","http://portal.acm.org/proceedings/assets/archive/" "Conference Proceedings","AusGrid: Grid Computing and e-Research","","","","2008 (January 2008)","2009 (January 2009)","http://portal.acm.org/proceedings/ausgrid/","http://portal.acm.org/proceedings/ausgrid/archive/" "Conference Proceedings","AutomotiveUI: Automotive User Interfaces and Interactive Vehicular Applications","","","","2009 (September 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/automotiveui/","http://portal.acm.org/proceedings/automotiveui/archive/" "Conference Proceedings","Autonomics: Autonomic Computing and Communication Systems","","","","2007 (October 2007)","2008 (September 2008)","http://portal.acm.org/proceedings/autonomics/","http://portal.acm.org/proceedings/autonomics/archive/" "Conference Proceedings","BADS: Bio-Inspired Algorithms for Distributed Systems","","","","2009 (June 2009)","2011 (June 2011)","http://portal.acm.org/proceedings/bads/","http://portal.acm.org/proceedings/bads/archive/" "Conference Proceedings","BCB: Bioinformatics and Computational Biology","","","","2010 (August 2010)","2007 (September 2013)","http://portal.acm.org/proceedings/bcb/","http://portal.acm.org/proceedings/bcb/archive/" "Conference Proceedings","BCS-HCI: British HCI Group Annual Conference on People and Computers","","","","2007 (September 2007)","2009 (September 2009)","http://portal.acm.org/proceedings/bcs-hci/","http://portal.acm.org/proceedings/bcs-hci/archive/" "Conference Proceedings","BELIV: Beyond Time and Errors: Novel evaluation Methods for Information Visualization","","","","2006 (May 2006)","2012 (October 2012)","http://portal.acm.org/proceedings/beliv/","http://portal.acm.org/proceedings/beliv/archive/" "Conference Proceedings","BIOKDD: Bioinformatics","","","","2005 (August 2005)","2013 (August 2013)","http://portal.acm.org/proceedings/biokdd/","http://portal.acm.org/proceedings/biokdd/archive/" "Conference Proceedings","BIONETICS: Bio Inspired Models of Network, Information and Computing Systems","","","","2006 (December 2006)","2006 (December 2006)","http://portal.acm.org/proceedings/bionetics/","http://portal.acm.org/proceedings/bionetics/archive/" "Conference Proceedings","BM-FA: Behaviour Modelling","","","","2010 (June 2010)","2012 (July 2012)","http://portal.acm.org/proceedings/bm-fa/","http://portal.acm.org/proceedings/bm-fa/archive/" "Conference Proceedings","BM-MDA: Behaviour Modelling in Model-Driven Architecture","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/bm-mda/","http://portal.acm.org/proceedings/bm-mda/archive/" "Conference Proceedings","BPAOSD: Best Practices in Applying Aspect-Oriented Software Development","","","","2007 (March 2007)","2007 (March 2007)","http://portal.acm.org/proceedings/bpaosd/","http://portal.acm.org/proceedings/bpaosd/archive/" "Conference Proceedings","BQGT: Behavioral and Quantitative Game Theory","","","","2010 (May 2010)","2010 (May 2010)","http://portal.acm.org/proceedings/bqgt/","http://portal.acm.org/proceedings/bqgt/archive/" "Conference Proceedings","BWAN: Broadband Wireless Access for Ubiquitous Networking","","","","2006 (September 2006)","2006 (September 2006)","http://portal.acm.org/proceedings/bwan/","http://portal.acm.org/proceedings/bwan/archive/" "Conference Proceedings","Baltic Sea: Baltic Sea Conference on Computing Education Research","","","","2006 (February 2006)","2006 (February 2006)","http://portal.acm.org/proceedings/balticsea/","http://portal.acm.org/proceedings/balticsea/archive/" "Conference Proceedings","BiPi: Business Impact of Process Improvements","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/bipi/","http://portal.acm.org/proceedings/bipi/archive/" "Conference Proceedings","BooksOnline: Research Advances in Large Digital Book Repositories","","","","2008 (October 2008)","2012 (October 2012)","http://portal.acm.org/proceedings/booksonline/","http://portal.acm.org/proceedings/booksonline/archive/" "Conference Proceedings","BuildSys: Embedded Sensing Systems for Energy-Efficiency in Buildings","","","","2009 (November 2009)","2013 (November 2013)","http://portal.acm.org/proceedings/buildsys/","http://portal.acm.org/proceedings/buildsys/archive/" "Conference Proceedings","C&C: Creativity and Cognition","","","","1999 (October 1999)","2013 (June 2013)","http://portal.acm.org/proceedings/c&c/","http://portal.acm.org/proceedings/c&c/archive/" "Conference Proceedings","C&T: Communities and Technologies","","","","2009 (June 2009)","2013 (June 2013)","http://portal.acm.org/proceedings/c&t/","http://portal.acm.org/proceedings/c&t/archive/" "Conference Proceedings","C3P: Hypercube Concurrent Computers and Applications","","","","1988 (January 1988)","1988 (January 1989)","http://portal.acm.org/proceedings/c3p/","http://portal.acm.org/proceedings/c3p/archive/" "Conference Proceedings","C3S2E: Canadian Conference on Computer Science and Software Engineering","","","","2008 (May 2008)","2013 (July 2013)","http://portal.acm.org/proceedings/cse/","http://portal.acm.org/proceedings/cse/archive/" "Conference Proceedings","CAI: Context in Advanced Interfaces","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/cai/","http://portal.acm.org/proceedings/cai/archive/" "Conference Proceedings","CAMA: Contextualized Attention Metadata","","","","2006 (November 2006)","2006 (November 2006)","http://portal.acm.org/proceedings/cama/","http://portal.acm.org/proceedings/cama/archive/" "Conference Proceedings","CAMRa: Context-aware Movie Recommendation","","","","2010 (September 2010)","2011 (October 2011)","http://portal.acm.org/proceedings/camra/","http://portal.acm.org/proceedings/camra/archive/" "Conference Proceedings","CAMS: Context-Aware Middleware and Services","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/cams/","http://portal.acm.org/proceedings/cams/archive/" "Conference Proceedings","CARPE: Continous Archival and Retrieval of Personal Experiences","","","","2004 (October 2004)","2006 (October 2006)","http://portal.acm.org/proceedings/carpe/","http://portal.acm.org/proceedings/carpe/archive/" "Conference Proceedings","CARS: Critical Automotive Applications","","","","2010 (April 2010)","2010 (April 2010)","http://portal.acm.org/proceedings/cars/","http://portal.acm.org/proceedings/cars/archive/" "Conference Proceedings","CASEMANS: Context-Awareness for Self-Managing Systems","","","","2008 (May 2008)","2011 (September 2011)","http://portal.acm.org/proceedings/casemans/","http://portal.acm.org/proceedings/casemans/archive/" "Conference Proceedings","CASES: Compilers, Architectures and Synthesis for Embedded Systems","","","","2000 (November 2000)","2013 (September 2013)","http://portal.acm.org/proceedings/cases/","http://portal.acm.org/proceedings/cases/archive/" "Conference Proceedings","CASTA: Context-Aware Software Technology and Application","","","","2009 (August 2009)","2009 (August 2009)","http://portal.acm.org/proceedings/casta/","http://portal.acm.org/proceedings/casta/archive/" "Conference Proceedings","CAW: Computer Architecture for Non-Numeric Processing","","","","1977 (January 1977)","1980 (March 1980)","http://portal.acm.org/proceedings/caw/","http://portal.acm.org/proceedings/caw/archive/" "Conference Proceedings","CBHPC: Component-Based High Performance Computing","","","","2008 (October 2008)","2009 (November 2009)","http://portal.acm.org/proceedings/cbhpc/","http://portal.acm.org/proceedings/cbhpc/archive/" "Conference Proceedings","CC: Critical Computing","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/cc/","http://portal.acm.org/proceedings/cc/archive/" "Conference Proceedings","CCS: Computer and Communications Security","","","","1993 (December 1993)","2013 (November 2013)","http://portal.acm.org/proceedings/ccs/","http://portal.acm.org/proceedings/ccs/archive/" "Conference Proceedings","CCSC: Consortium for Computing Sciences in Colleges","","","","1991 (May 1991)","2001 (April 2001)","http://portal.acm.org/proceedings/ccsc/","http://portal.acm.org/proceedings/ccsc/archive/" "Conference Proceedings","CCSW: Cloud Computing Security Workshop","","","","2009 (November 2009)","2013 (November 2013)","http://portal.acm.org/proceedings/ccsw/","http://portal.acm.org/proceedings/ccsw/archive/" "Conference Proceedings","CCU: Contemporary Computing in Ukraine","","","","2000 (February 2000)","2000 (February 2000)","http://portal.acm.org/proceedings/ccu/","http://portal.acm.org/proceedings/ccu/archive/" "Conference Proceedings","CEA: Cooking and Eating Activities","","","","2009 (October 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/cea/","http://portal.acm.org/proceedings/cea/archive/" "Conference Proceedings","CF: Computing Frontiers","","","","2004 (April 2004)","2013 (May 2013)","http://portal.acm.org/proceedings/cf/","http://portal.acm.org/proceedings/cf/archive/" "Conference Proceedings","CFI: Future Internet Technologies","","","","2009 (June 2009)","2012 (September 2012)","http://portal.acm.org/proceedings/cfi/","http://portal.acm.org/proceedings/cfi/archive/" "Conference Proceedings","CFP: Computers, Freedom and Privacy","","","","1992 (April 1992)","2002 (April 2002)","http://portal.acm.org/proceedings/cfp/","http://portal.acm.org/proceedings/cfp/archive/" "Conference Proceedings","CGI: Computer Graphics International","","","","1996 (June 1996)","2009 (May 2009)","http://portal.acm.org/proceedings/cgi/","http://portal.acm.org/proceedings/cgi/archive/" "Conference Proceedings","CGO: Code Generation and Optimization","","","","2003 (March 2003)","2013 (February 2013)","http://portal.acm.org/proceedings/cgo/","http://portal.acm.org/proceedings/cgo/archive/" "Conference Proceedings","CHANTS: Challenged Networks","","","","2006 (September 2006)","2013 (September 2013)","http://portal.acm.org/proceedings/chants/","http://portal.acm.org/proceedings/chants/archive/" "Conference Proceedings","CHASE: Cooperative and Human Aspects on Software Engineering","","","","2008 (May 2008)","2011 (May 2011)","http://portal.acm.org/proceedings/chase/","http://portal.acm.org/proceedings/chase/archive/" "Conference Proceedings","CHI EA: Conference on Human Factors in Computing Systems-Extended Abstracts","","","","1997 (March 1997)","2013 (April 2013)","http://portal.acm.org/proceedings/chiea/","http://portal.acm.org/proceedings/chiea/archive/" "Conference Proceedings","CHI: Conference on Human Factors in Computing Systems","","","","1981 (May 1981)","2013 (April 2013)","http://portal.acm.org/proceedings/chi/","http://portal.acm.org/proceedings/chi/archive/" "Conference Proceedings","CHINA HPC: High Performance Computing","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/chinahpc/","http://portal.acm.org/proceedings/chinahpc/archive/" "Conference Proceedings","CHINZ: ACM SIGCHI New Zealand Chapter's International Conference on Human-Computer Interaction","","","","2001 (July 2001)","2012 (July 2012)","http://portal.acm.org/proceedings/chinz/","http://portal.acm.org/proceedings/chinz/archive/" "Conference Proceedings","CHiMiT: Computer Human Interaction for the Management of Information Technology","","","","2007 (March 2007)","2011 (December 2011)","http://portal.acm.org/proceedings/chimit/","http://portal.acm.org/proceedings/chimit/archive/" "Conference Proceedings","CIAA: Implementation and Application of Automata","","","","2003 (July 2002)","2003 (July 2002)","http://portal.acm.org/proceedings/ciaa/","http://portal.acm.org/proceedings/ciaa/archive/" "Conference Proceedings","CIAO: Context, Information and Ontologies","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/ciao/","http://portal.acm.org/proceedings/ciao/archive/" "Conference Proceedings","CIKM: Conference on Information and Knowledge Management","","","","1993 (December 1993)","2013 (October 2013)","http://portal.acm.org/proceedings/cikm/","http://portal.acm.org/proceedings/cikm/archive/" "Conference Proceedings","CIMS: CyberInfrastructure: Information Management in eScience","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/cims/","http://portal.acm.org/proceedings/cims/archive/" "Conference Proceedings","CIVR: Conference on Image and Video Retrieval","","","","2007 (July 2007)","2010 (July 2010)","http://portal.acm.org/proceedings/civr/","http://portal.acm.org/proceedings/civr/archive/" "Conference Proceedings","CLADE: Challenges of Large Applications in Distributed Environments","","","","2003 (June 2003)","2009 (June 2009)","http://portal.acm.org/proceedings/clade/","http://portal.acm.org/proceedings/clade/archive/" "Conference Proceedings","CLIHC: Latin American Conference on Human-Computer Interaction","","","","2003 (August 2003)","2005 (October 2005)","http://portal.acm.org/proceedings/clihc/","http://portal.acm.org/proceedings/clihc/archive/" "Conference Proceedings","CLOUD: Software Engineering Challenges of Cloud Computing","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/cloud/","http://portal.acm.org/proceedings/cloud/archive/" "Conference Proceedings","CMM: Connected Multimedia","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/cmm/","http://portal.acm.org/proceedings/cmm/archive/" "Conference Proceedings","CMSB: Computational Methods in Systems Biology","","","","2010 (September 2010)","2011 (September 2011)","http://portal.acm.org/proceedings/cmsb/","http://portal.acm.org/proceedings/cmsb/archive/" "Conference Proceedings","CNIKM: Complex Networks Meet Information & Knowledge Management","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/cnikm/","http://portal.acm.org/proceedings/cnikm/archive/" "Conference Proceedings","CNS: Communications and Networking Simulation","","","","2008 (April 2008)","2013 (April 2013)","http://portal.acm.org/proceedings/cns/","http://portal.acm.org/proceedings/cns/archive/" "Conference Proceedings","COCS: Conference on Organizational Computing Systems","","","","1984 (January 1984)","1995 (August 1995)","http://portal.acm.org/proceedings/cocs/","http://portal.acm.org/proceedings/cocs/archive/" "Conference Proceedings","CODES: Hardware Software Codesign","","","","1994 (September 1994)","2012 (October 2012)","http://portal.acm.org/proceedings/codes/","http://portal.acm.org/proceedings/codes/archive/" "Conference Proceedings","COLT: Computational Learning Theory","","","","1988 (December 1988)","1999 (July 1999)","http://portal.acm.org/proceedings/colt/","http://portal.acm.org/proceedings/colt/archive/" "Conference Proceedings","COM.Geo: Computing for Geospatial Research & Application","","","","2010 (June 2010)","2012 (July 2012)","http://portal.acm.org/proceedings/com.geo/","http://portal.acm.org/proceedings/com.geo/archive/" "Conference Proceedings","COMM: Communications Architectures and Protocols","","","","2000 (November 2000)","2000 (November 2000)","http://portal.acm.org/proceedings/comm/","http://portal.acm.org/proceedings/comm/archive/" "Conference Proceedings","COMPUTE: COMPUTE","","","","2008 (January 2008)","2013 (August 2013)","http://portal.acm.org/proceedings/compute/","http://portal.acm.org/proceedings/compute/archive/" "Conference Proceedings","COMSWARE: Communication System Software and Middleware","","","","2009 (June 2009)","2011 (July 2011)","http://portal.acm.org/proceedings/comsware/","http://portal.acm.org/proceedings/comsware/archive/" "Conference Proceedings","COP: Context-Oriented Programming","","","","2009 (July 2009)","2013 (July 2013)","http://portal.acm.org/proceedings/cop/","http://portal.acm.org/proceedings/cop/archive/" "Conference Proceedings by Affiliated Organizations","CPR: Computers and People Research","","","","1962 (June 1962)","2013 (May 2013)","http://portal.acm.org/proceedings/sigcpr/","http://portal.acm.org/proceedings/sigcpr/archive/" "Conference Proceedings","CQL: Computers and the Quality of Life","","","","1990 (August 1990)","1996 (February 1996)","http://portal.acm.org/proceedings/cql/","http://portal.acm.org/proceedings/cql/archive/" "Conference Proceedings","CSAW: Computer Security Architectures","","","","2007 (November 2007)","2008 (October 2008)","http://portal.acm.org/proceedings/csaw/","http://portal.acm.org/proceedings/csaw/archive/" "Conference Proceedings","CSC: Conference on Computer Science","","","","1973 (February 1973)","1996 (February 1996)","http://portal.acm.org/proceedings/csc/","http://portal.acm.org/proceedings/csc/archive/" "Conference Proceedings","CSCW: Computer Supported Cooperative Work","","","","1986 (December 1986)","2013 (February 2013)","http://portal.acm.org/proceedings/cscw/","http://portal.acm.org/proceedings/cscw/archive/" "Conference Proceedings","CSI-KDD: CyberSecurity and Intelligence Informatics","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/csi-kdd/","http://portal.acm.org/proceedings/csi-kdd/archive/" "Conference Proceedings","CSIIRW: Cyber Security and Information Intelligence Research","","","","2008 (May 2008)","2013 (January 2013)","http://portal.acm.org/proceedings/csiirw/","http://portal.acm.org/proceedings/csiirw/archive/" "Conference Proceedings","CSSSIA: Context Enabled Source and Service Selection, Integration and Adaption","","","","2008 (April 2008)","2008 (April 2008)","http://portal.acm.org/proceedings/csssia/","http://portal.acm.org/proceedings/csssia/archive/" "Conference Proceedings","CSTST: Soft Computing as Transdisciplinary Science and Technology","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/cstst/","http://portal.acm.org/proceedings/cstst/archive/" "Conference Proceedings","CUFP: Commercial Users of Functional Programming","","","","2007 (October 2007)","2010 (October 2010)","http://portal.acm.org/proceedings/cufp/","http://portal.acm.org/proceedings/cufp/archive/" "Conference Proceedings","CUU: Conference on Universal Usability","","","","2000 (November 2000)","2003 (November 2003)","http://portal.acm.org/proceedings/cuu/","http://portal.acm.org/proceedings/cuu/archive/" "Conference Proceedings","CVDB: Computer Vision Meets Databases","","","","2004 (June 2004)","2005 (June 2005)","http://portal.acm.org/proceedings/cvdb/","http://portal.acm.org/proceedings/cvdb/archive/" "Conference Proceedings","CVE: Collaborative Virtual Environments","","","","2000 (September 2000)","2002 (September 2002)","http://portal.acm.org/proceedings/cve/","http://portal.acm.org/proceedings/cve/archive/" "Conference Proceedings","CVSM: Comparison and Versioning of Software Models","","","","2008 (May 2008)","2009 (May 2009)","http://portal.acm.org/proceedings/cvsm/","http://portal.acm.org/proceedings/cvsm/archive/" "Conference Proceedings","CWIT: Women and ICT","","","","2005 (June 2005)","2005 (June 2005)","http://portal.acm.org/proceedings/cwit/","http://portal.acm.org/proceedings/cwit/archive/" "Conference Proceedings","CWNETS: Cognitive Wireless Networks","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/cwnets/","http://portal.acm.org/proceedings/cwnets/archive/" "Conference Proceedings","Casemans: Context-Awareness for Self-Managing Systems","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/casemans/","http://portal.acm.org/proceedings/casemans/archive/" "Conference Proceedings","CloudDB: Cloud Data Management","","","","2009 (November 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/clouddb/","http://portal.acm.org/proceedings/clouddb/archive/" "Conference Proceedings","CoNEXT: Co-NEXT","","","","2005 (October 2005)","2013 (December 2013)","http://portal.acm.org/proceedings/conext/","http://portal.acm.org/proceedings/conext/archive/" "Conference Proceedings","CoRoNet: Cognitive Radio Networks","","","","2009 (September 2009)","2011 (September 2011)","http://portal.acm.org/proceedings/coronet/","http://portal.acm.org/proceedings/coronet/archive/" "Conference Proceedings","CommunicabilityMS: Communicability Design and Evaluation in Cultural and Ecological Multimedia System","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/communicabilityms/","http://portal.acm.org/proceedings/communicabilityms/archive/" "Conference Proceedings","CompBio: Computational biology","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/compbio/","http://portal.acm.org/proceedings/compbio/archive/" "Conference Proceedings","CompFrame: Component and Framework Technology in High-Performance and Scientific Computing","","","","2007 (October 2007)","2007 (October 2007)","http://portal.acm.org/proceedings/compframe/","http://portal.acm.org/proceedings/compframe/archive/" "Conference Proceedings","CompSysTech: Computer Systems and Technologies","","","","2000 (June 2000)","2013 (June 2013)","http://portal.acm.org/proceedings/compsystech/","http://portal.acm.org/proceedings/compsystech/archive/" "Conference Proceedings","Companion: Middleware 08 Conference Companion","","","","2008 (December 2008)","2008 (December 2008)","http://portal.acm.org/proceedings/companion/","http://portal.acm.org/proceedings/companion/archive/" "Conference Proceedings","Creating: Creating Out of the Machine","","","","2008 (June 2008)","2008 (June 2008)","http://portal.acm.org/proceedings/creating/","http://portal.acm.org/proceedings/creating/archive/" "Conference Proceedings","DAC: Design Automation Conference","","","","1964 (January 1964)","2013 (May 2013)","http://portal.acm.org/proceedings/dac/","http://portal.acm.org/proceedings/dac/archive/" "Conference Proceedings","DADC: Data-aware Distributed Computing","","","","2008 (June 2008)","2009 (June 2009)","http://portal.acm.org/proceedings/dadc/","http://portal.acm.org/proceedings/dadc/archive/" "Conference Proceedings","DAMP: Declarative Aspects of Multicore Programming","","","","2007 (January 2007)","2012 (January 2012)","http://portal.acm.org/proceedings/damp/","http://portal.acm.org/proceedings/damp/archive/" "Conference Proceedings","DARE: Designing Augmented Reality Environments","","","","2000 (April 2000)","2013 (November 2013)","http://portal.acm.org/proceedings/dare/","http://portal.acm.org/proceedings/dare/archive/" "Conference Proceedings","DAS: Document Analysis Systems","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/das/","http://portal.acm.org/proceedings/das/archive/" "Conference Proceedings","DATACOMM: Data Communications and Data Networks","","","","1973 (January 1973)","1973 (January 1973)","http://portal.acm.org/proceedings/datacomm/","http://portal.acm.org/proceedings/datacomm/archive/" "Conference Proceedings","DATE: Design, Automation and Test in Europe","","","","1998 (February 1998)","2013 (March 2013)","http://portal.acm.org/proceedings/date/","http://portal.acm.org/proceedings/date/archive/" "Conference Proceedings","DBTest: Testing Database Systems","","","","2008 (June 2008)","2013 (June 2013)","http://portal.acm.org/proceedings/dbtest/","http://portal.acm.org/proceedings/dbtest/archive/" "Conference Proceedings","DCOSS: Distributed Computing in Sensor Systems","","","","2007 (June 2007)","2010 (June 2010)","http://portal.acm.org/proceedings/dcoss/","http://portal.acm.org/proceedings/dcoss/archive/" "Conference Proceedings","DD4LCCI: Data Dissemination for Large Scale Complex Critical Infrastructures","","","","2010 (April 2010)","2010 (April 2010)","http://portal.acm.org/proceedings/dd4lcci/","http://portal.acm.org/proceedings/dd4lcci/archive/" "Conference Proceedings","DDDM: Domain Driven Data Mining","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/dddm/","http://portal.acm.org/proceedings/dddm/archive/" "Conference Proceedings","DEAS: Design and Evolution of Autonomic Application Software","","","","2005 (May 2005)","2005 (May 2005)","http://portal.acm.org/proceedings/deas/","http://portal.acm.org/proceedings/deas/archive/" "Conference Proceedings","DEBS: Distributed Event-Based Systems","","","","2003 (June 2003)","2013 (June 2013)","http://portal.acm.org/proceedings/debs/","http://portal.acm.org/proceedings/debs/archive/" "Conference Proceedings","DEECS: Data Enginering issues in E-commerce and Services","","","","2007 (June 2007)","2007 (June 2007)","http://portal.acm.org/proceedings/deecs/","http://portal.acm.org/proceedings/deecs/archive/" "Conference Proceedings","DEFECTS: Defects in Large Software Systems","","","","2008 (July 2008)","2009 (June 2009)","http://portal.acm.org/proceedings/defects/","http://portal.acm.org/proceedings/defects/archive/" "Conference Proceedings","DESIRE: Creativity and Innovation in Design","","","","2010 (August 2010)","2011 (October 2011)","http://portal.acm.org/proceedings/desire/","http://portal.acm.org/proceedings/desire/archive/" "Conference Proceedings","DESRIST: Design Science Research in Information Systems and Technology","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/desrist/","http://portal.acm.org/proceedings/desrist/archive/" "Conference Proceedings","DIALM: DIALM","","","","1999 (August 1999)","2010 (September 2010)","http://portal.acm.org/proceedings/dialm/","http://portal.acm.org/proceedings/dialm/archive/" "Conference Proceedings","DIM: Digital Identity Management","","","","2005 (November 2005)","2013 (November 2013)","http://portal.acm.org/proceedings/dim/","http://portal.acm.org/proceedings/dim/archive/" "Conference Proceedings","DIMEA: Digital Interactive Media in Entertainment and Arts","","","","2007 (September 2007)","2008 (September 2008)","http://portal.acm.org/proceedings/dimea/","http://portal.acm.org/proceedings/dimea/archive/" "Conference Proceedings","DIN: Dynamic Interconnection of Networks","","","","2005 (September 2005)","2005 (September 2005)","http://portal.acm.org/proceedings/din/","http://portal.acm.org/proceedings/din/archive/" "Conference Proceedings","DIS: Designing Interactive Systems","","","","1995 (August 1995)","2012 (June 2012)","http://portal.acm.org/proceedings/dis/","http://portal.acm.org/proceedings/dis/archive/" "Conference Proceedings","DIWANS: Dependability Issues in Wireless and Ad-Hoc Networks and Sensor Networks","","","","2006 (September 2006)","2006 (September 2006)","http://portal.acm.org/proceedings/diwans/","http://portal.acm.org/proceedings/diwans/archive/" "Conference Proceedings","DL: Digital Libraries","","","","1996 (April 1996)","2000 (June 2000)","http://portal.acm.org/proceedings/dl/","http://portal.acm.org/proceedings/dl/archive/" "Conference Proceedings","DLS: Dynamic Languages","","","","2005 (October 2005)","2013 (October 2013)","http://portal.acm.org/proceedings/dls/","http://portal.acm.org/proceedings/dls/archive/" "Conference Proceedings","DMG: Data Mining for Geoinformatics","","","","2010 (November 2010)","2010 (November 2010)","http://portal.acm.org/proceedings/dmg/","http://portal.acm.org/proceedings/dmg/archive/" "Conference Proceedings","DMKD: Research Issues in Data Mining and Knowledge Discovery","","","","2003 (June 2003)","2004 (June 2004)","http://portal.acm.org/proceedings/dmkd/","http://portal.acm.org/proceedings/dmkd/archive/" "Conference Proceedings","DMMT: Data Mining using Matrices and Tensors","","","","2001 (July 2001)","2009 (June 2009)","http://portal.acm.org/proceedings/dmmt/","http://portal.acm.org/proceedings/dmmt/archive/" "Conference Proceedings","DMSN: Data Management for Sensor Networks","","","","2004 (August 2004)","2010 (September 2010)","http://portal.acm.org/proceedings/dmsn/","http://portal.acm.org/proceedings/dmsn/archive/" "Conference Proceedings","DMSSP: Data Mining Standards, Services and Platforms","","","","2006 (August 2006)","2006 (August 2006)","http://portal.acm.org/proceedings/dmssp/","http://portal.acm.org/proceedings/dmssp/archive/" "Conference Proceedings","DO: Distributed Objects","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/do/","http://portal.acm.org/proceedings/do/archive/" "Conference Proceedings","DOCPROCS: Document Processing Systems","","","","1988 (January 2000)","1988 (January 2000)","http://portal.acm.org/proceedings/docprocs/","http://portal.acm.org/proceedings/docprocs/archive/" "Conference Proceedings","DOLAP: Data Warehousing and OLAP","","","","1998 (November 1998)","2013 (October 2013)","http://portal.acm.org/proceedings/dolap/","http://portal.acm.org/proceedings/dolap/archive/" "Conference Proceedings","DOSTA: Domain Specific Approaches to Software Test Automation","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/dosta/","http://portal.acm.org/proceedings/dosta/archive/" "Conference Proceedings","DPDS: Databases in Parallel and Distributed Systems","","","","1990 (July 1990)","1988 (January 2000)","http://portal.acm.org/proceedings/dpds/","http://portal.acm.org/proceedings/dpds/archive/" "Conference Proceedings","DPPI: Designing Pleasurable Products and Interfaces","","","","2003 (June 2003)","2013 (September 2013)","http://portal.acm.org/proceedings/dppi/","http://portal.acm.org/proceedings/dppi/archive/" "Conference Proceedings","DRM: Digital Rights Management","","","","2003 (October 2003)","2011 (October 2011)","http://portal.acm.org/proceedings/drm/","http://portal.acm.org/proceedings/drm/archive/" "Conference Proceedings","DS-RT: Distributed Simulation and Real Time Applications","","","","2000 (August 2000)","2012 (October 2012)","http://portal.acm.org/proceedings/ds-rt/","http://portal.acm.org/proceedings/ds-rt/archive/" "Conference Proceedings","DSAL: Domain-Specific Aspect Languages","","","","2007 (March 2007)","2012 (March 2012)","http://portal.acm.org/proceedings/dsal/","http://portal.acm.org/proceedings/dsal/archive/" "Conference Proceedings","DSL: Domain-Specific Languages","","","","1999 (December 1999)","1999 (December 1999)","http://portal.acm.org/proceedings/dsl/","http://portal.acm.org/proceedings/dsl/archive/" "Conference Proceedings","DSM: Doctoral Symposium on Middleware","","","","2004 (October 2004)","2012 (October 2012)","http://portal.acm.org/proceedings/dsm/","http://portal.acm.org/proceedings/dsm/archive/" "Conference Proceedings","DSMM: Data-Intensive Software Management and Mining","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/dsmm/","http://portal.acm.org/proceedings/dsmm/archive/" "Conference Proceedings","DTMBIO: Data and Text Mining in Biomedical Informatics","","","","2008 (October 2008)","2013 (November 2013)","http://portal.acm.org/proceedings/dtmbio/","http://portal.acm.org/proceedings/dtmbio/archive/" "Conference Proceedings","DUX: Designing for User eXperiences","","","","2003 (June 2003)","2007 (November 2007)","http://portal.acm.org/proceedings/dux/","http://portal.acm.org/proceedings/dux/archive/" "Conference Proceedings","DYADEM-FTS: Dependeability Models for Fault-Tolerant Systems","","","","2010 (April 2010)","2010 (April 2010)","http://portal.acm.org/proceedings/dyadem-fts/","http://portal.acm.org/proceedings/dyadem-fts/archive/" "Conference Proceedings","DYNAMO: Dynamic and Adaptive Compilation and Optimization","","","","2000 (January 2000)","2000 (January 2000)","http://portal.acm.org/proceedings/dynamo/","http://portal.acm.org/proceedings/dynamo/archive/" "Conference Proceedings","DaGreS: Data Grids for eScience","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/dagres/","http://portal.acm.org/proceedings/dagres/archive/" "Conference Proceedings","DaMaP: Data Management in Peer-to-Peer Systems","","","","2008 (March 2008)","2008 (March 2008)","http://portal.acm.org/proceedings/damap/","http://portal.acm.org/proceedings/damap/archive/" "Conference Proceedings","DaMoN: Data Management on New Hardware","","","","2005 (June 2005)","2013 (June 2013)","http://portal.acm.org/proceedings/damon/","http://portal.acm.org/proceedings/damon/archive/" "Conference Proceedings","DataX: Database Technologies for Handling XML Information on the Web","","","","2008 (March 2008)","2008 (March 2008)","http://portal.acm.org/proceedings/datax/","http://portal.acm.org/proceedings/datax/archive/" "Conference Proceedings","DocEng: Document Engineering","","","","2001 (November 2001)","2013 (September 2013)","http://portal.acm.org/proceedings/doceng/","http://portal.acm.org/proceedings/doceng/archive/" "Conference Proceedings","Dutch HCI: Dutch directions in HCI","","","","2004 (June 2004)","2004 (June 2004)","http://portal.acm.org/proceedings/dutchhci/","http://portal.acm.org/proceedings/dutchhci/archive/" "Conference Proceedings","E-WIND: Experimental Approaches to Wireless Network Design and Analysis","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/e-wind/","http://portal.acm.org/proceedings/e-wind/archive/" "Conference Proceedings","EA: Early Aspects","","","","2006 (May 2006)","2011 (March 2011)","http://portal.acm.org/proceedings/ea/","http://portal.acm.org/proceedings/ea/archive/" "Conference Proceedings","EATIS: Euro American Conference on Telematics and Information Systems","","","","2007 (May 2007)","2012 (May 2012)","http://portal.acm.org/proceedings/eatis/","http://portal.acm.org/proceedings/eatis/archive/" "Conference Proceedings","EC: Electronic Commerce","","","","1999 (November 1999)","2013 (June 2013)","http://portal.acm.org/proceedings/ec/","http://portal.acm.org/proceedings/ec/archive/" "Conference Proceedings","ECA: Ethics in the Computer Age","","","","1994 (November 1994)","1994 (November 1994)","http://portal.acm.org/proceedings/eca/","http://portal.acm.org/proceedings/eca/archive/" "Conference Proceedings","ECCE: European Conference on Cognitive Ergonomics","","","","2006 (September 2006)","2013 (August 2013)","http://portal.acm.org/proceedings/ecce/","http://portal.acm.org/proceedings/ecce/archive/" "Conference Proceedings","ECHT: European Conference on Hypermedia Technology","","","","1992 (November 1992)","1994 (September 1994)","http://portal.acm.org/proceedings/echt/","http://portal.acm.org/proceedings/echt/archive/" "Conference Proceedings","ECIR: European Conference on Information Retrieval","","","","2008 (March 2008)","2012 (April 2012)","http://portal.acm.org/proceedings/ecir/","http://portal.acm.org/proceedings/ecir/archive/" "Conference Proceedings","ECMFA-TW: ECMFA Traceability Workshop","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/ecmfa-tw/","http://portal.acm.org/proceedings/ecmfa-tw/archive/" "Conference Proceedings","ECOOP: European Conference on Object-Oriented Programming","","","","2007 (July 2007)","2013 (July 2013)","http://portal.acm.org/proceedings/ecoop/","http://portal.acm.org/proceedings/ecoop/archive/" "Conference Proceedings","ECSA: European Conference on Software Architecture","","","","2010 (August 2010)","2012 (August 2012)","http://portal.acm.org/proceedings/ecsa/","http://portal.acm.org/proceedings/ecsa/archive/" "Conference Proceedings","EDBT: Extending Database Technology","","","","2008 (March 2008)","2013 (March 2013)","http://portal.acm.org/proceedings/edbt/","http://portal.acm.org/proceedings/edbt/archive/" "Conference Proceedings","EDSER: Economics-Driven Software Engineering Research","","","","2005 (May 2005)","2006 (May 2006)","http://portal.acm.org/proceedings/edser/","http://portal.acm.org/proceedings/edser/archive/" "Conference Proceedings","EDT: Emerging Displays Technologies","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/edt/","http://portal.acm.org/proceedings/edt/archive/" "Conference Proceedings","EDTC: European Conference on Design and Test","","","","1995 (March 1995)","1997 (March 1997)","http://portal.acm.org/proceedings/edtc/","http://portal.acm.org/proceedings/edtc/archive/" "Conference Proceedings","EESR: End-to-end, Sense-and-respond Systems, Applications and Services","","","","2005 (June 2005)","2005 (June 2005)","http://portal.acm.org/proceedings/eesr/","http://portal.acm.org/proceedings/eesr/archive/" "Conference Proceedings","EFTS: Engineering Fault Tolerant Systems","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/efts/","http://portal.acm.org/proceedings/efts/archive/" "Conference Proceedings","EGPGV: Eurographics Workshop on Parallel Graphics and Visualization","","","","2002 (September 2002)","2002 (September 2002)","http://portal.acm.org/proceedings/egpgv/","http://portal.acm.org/proceedings/egpgv/archive/" "Conference Proceedings","EGRW: Eurographics Workshop on Rendering","","","","2002 (July 2002)","2002 (July 2002)","http://portal.acm.org/proceedings/egrw/","http://portal.acm.org/proceedings/egrw/archive/" "Conference Proceedings","EGVE: Virtual Environments","","","","2002 (May 2002)","2007 (July 2007)","http://portal.acm.org/proceedings/egve/","http://portal.acm.org/proceedings/egve/archive/" "Conference Proceedings","EICS: Engineering Interactive Computing Systems","","","","2009 (July 2009)","2013 (June 2013)","http://portal.acm.org/proceedings/eics/","http://portal.acm.org/proceedings/eics/archive/" "Conference Proceedings","ELW: European Lisp Workshop","","","","2009 (July 2009)","2010 (June 2010)","http://portal.acm.org/proceedings/elw/","http://portal.acm.org/proceedings/elw/archive/" "Conference Proceedings","EMSOFT: Embedded Software","","","","2004 (September 2004)","2013 (September 2013)","http://portal.acm.org/proceedings/emsoft/","http://portal.acm.org/proceedings/emsoft/archive/" "Conference Proceedings","EOMAS: Enterprises & Organizational Modeling and Simulation","","","","2009 (June 2009)","2010 (June 2010)","http://portal.acm.org/proceedings/eomas/","http://portal.acm.org/proceedings/eomas/archive/" "Conference Proceedings","EPIA: Progress in Artificial Intelligence","","","","2007 (December 2007)","2007 (December 2007)","http://portal.acm.org/proceedings/epia/","http://portal.acm.org/proceedings/epia/archive/" "Conference Proceedings","ERLANG: ERLANG","","","","2002 (October 2002)","2013 (September 2013)","http://portal.acm.org/proceedings/erlang/","http://portal.acm.org/proceedings/erlang/archive/" "Conference Proceedings","ESAIR: Exploiting Semantic Annotations in Information Retrieval","","","","2009 (February 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/esair/","http://portal.acm.org/proceedings/esair/archive/" "Conference Proceedings","ESC: Economics of Software and Computation","","","","2007 (May 2007)","2013 (November 2013)","http://portal.acm.org/proceedings/esc/","http://portal.acm.org/proceedings/esc/archive/" "Conference Proceedings","ESEC/FSE: European Software Engineering Conference","","","","1997 (November 1997)","2013 (August 2013)","http://portal.acm.org/proceedings/esec/fse/","http://portal.acm.org/proceedings/esec/fse/archive/" "Conference Proceedings","ESEM: Empirical Software Engineering and Measurement","","","","2007 (September 2007)","2012 (September 2012)","http://portal.acm.org/proceedings/esem/","http://portal.acm.org/proceedings/esem/archive/" "Conference Proceedings","ESP: Empirical Studies of Programmers","","","","1997 (October 1997)","1997 (October 1997)","http://portal.acm.org/proceedings/esp/","http://portal.acm.org/proceedings/esp/archive/" "Conference Proceedings","ESSPE: Engineering of Software Services for Pervasive Environments","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/esspe/","http://portal.acm.org/proceedings/esspe/archive/" "Conference Proceedings","ESTMED: Embedded Systems for Real Time Multimedia","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/estmed/","http://portal.acm.org/proceedings/estmed/archive/" "Conference Proceedings","ETOOS: Testing Object-Oriented Systems","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/etoos/","http://portal.acm.org/proceedings/etoos/archive/" "Conference Proceedings","ETP: Effective Telepresence","","","","2003 (November 2003)","2004 (October 2004)","http://portal.acm.org/proceedings/etp/","http://portal.acm.org/proceedings/etp/archive/" "Conference Proceedings","ETRA: Eye Tracking Research and Applications","","","","2000 (November 2000)","2012 (March 2012)","http://portal.acm.org/proceedings/etra/","http://portal.acm.org/proceedings/etra/archive/" "Conference Proceedings","EURO-DAC: European Design Automation","","","","1990 (March 1990)","1996 (September 1996)","http://portal.acm.org/proceedings/euro-dac/","http://portal.acm.org/proceedings/euro-dac/archive/" "Conference Proceedings","EUROSEC: European Workshop on System Security","","","","2008 (March 2008)","2011 (April 2011)","http://portal.acm.org/proceedings/eurosec/","http://portal.acm.org/proceedings/eurosec/archive/" "Conference Proceedings","EUSAI: European Union symposium on Ambient intelligence","","","","2004 (November 2004)","2004 (November 2004)","http://portal.acm.org/proceedings/eusai/","http://portal.acm.org/proceedings/eusai/archive/" "Conference Proceedings","EW: ACM SIGOPS European Workshop","","","","1985 (January 1985)","2004 (September 2004)","http://portal.acm.org/proceedings/ew/","http://portal.acm.org/proceedings/ew/archive/" "Conference Proceedings","EiMM: Events in Multimedia","","","","2009 (October 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/eimm/","http://portal.acm.org/proceedings/eimm/archive/" "Conference Proceedings","EmNets: Embedded Networked Sensors","","","","2005 (April 2005)","2007 (June 2007)","http://portal.acm.org/proceedings/emnets/","http://portal.acm.org/proceedings/emnets/archive/" "Conference Proceedings","Emme: Educational Multimedia and Multimedia Education","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/emme/","http://portal.acm.org/proceedings/emme/archive/" "Conference Proceedings","Ergo'IA: Ergonomie et Informatique Avancee Conference","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/ergo'ia/","http://portal.acm.org/proceedings/ergo'ia/archive/" "Conference Proceedings","EuroITV: Interactive TV & Video","","","","2007 (May 2007)","2013 (June 2013)","http://portal.acm.org/proceedings/euroitv/","http://portal.acm.org/proceedings/euroitv/archive/" "Conference Proceedings","EuroSys: European Conference on Computer Systems","","","","2006 (April 2006)","2013 (April 2013)","http://portal.acm.org/proceedings/eurosys/","http://portal.acm.org/proceedings/eurosys/archive/" "Conference Proceedings","ExpCS: Experimental Computer Science","","","","2007 (June 2007)","2007 (June 2007)","http://portal.acm.org/proceedings/expcs/","http://portal.acm.org/proceedings/expcs/archive/" "Conference Proceedings","FAA: Facial Analysis and Animation","","","","2010 (October 2010)","2012 (September 2012)","http://portal.acm.org/proceedings/faa/","http://portal.acm.org/proceedings/faa/archive/" "Conference Proceedings","FAST: File and Storage Technologies","","","","2005 (December 2005)","2012 (February 2012)","http://portal.acm.org/proceedings/fast/","http://portal.acm.org/proceedings/fast/archive/" "Conference Proceedings","FDG: Foundations of Digital Games","","","","2009 (April 2009)","2012 (May 2012)","http://portal.acm.org/proceedings/fdg/","http://portal.acm.org/proceedings/fdg/archive/" "Conference Proceedings","FDNA: Future Directions in Network Architectures","","","","2003 (August 2003)","2004 (August 2004)","http://portal.acm.org/proceedings/fdna/","http://portal.acm.org/proceedings/fdna/archive/" "Conference Proceedings","FDPE: Functional and Declarative Progamming in Education","","","","2005 (September 2005)","2008 (September 2008)","http://portal.acm.org/proceedings/fdpe/","http://portal.acm.org/proceedings/fdpe/archive/" "Conference Proceedings","FIT: Frontiers of Information Technology","","","","2009 (December 2009)","2010 (December 2010)","http://portal.acm.org/proceedings/fit/","http://portal.acm.org/proceedings/fit/archive/" "Conference Proceedings","FLOSS: Emerging Trends in Free/Libre/Open Source Software Research and Development","","","","2007 (May 2007)","2010 (May 2010)","http://portal.acm.org/proceedings/floss/","http://portal.acm.org/proceedings/floss/archive/" "Conference Proceedings","FMICS: Formal Methods for Industrial Critical Systems","","","","2005 (September 2005)","2005 (September 2005)","http://portal.acm.org/proceedings/fmics/","http://portal.acm.org/proceedings/fmics/archive/" "Conference Proceedings","FMSE: Formal Methods in Security Engineering","","","","2003 (October 2003)","2008 (October 2008)","http://portal.acm.org/proceedings/fmse/","http://portal.acm.org/proceedings/fmse/archive/" "Conference Proceedings","FMSP: Formal Methods in Software Practice","","","","1998 (March 1998)","2000 (August 2000)","http://portal.acm.org/proceedings/fmsp/","http://portal.acm.org/proceedings/fmsp/archive/" "Conference Proceedings","FOAL: Foundations of Aspect-Oriented Languages","","","","2007 (March 2007)","2013 (March 2013)","http://portal.acm.org/proceedings/foal/","http://portal.acm.org/proceedings/foal/archive/" "Conference Proceedings","FOGA: Foundations of Genetic Algorithms","","","","2007 (January 2007)","2013 (January 2013)","http://portal.acm.org/proceedings/foga/","http://portal.acm.org/proceedings/foga/archive/" "Conference Proceedings","FOIS: Formal Ontology in Information Systems","","","","2001 (October 2001)","2001 (October 2001)","http://portal.acm.org/proceedings/fois/","http://portal.acm.org/proceedings/fois/archive/" "Conference Proceedings","FORTH: FORTH","","","","1989 (January 1989)","1992 (December 1993)","http://portal.acm.org/proceedings/forth/","http://portal.acm.org/proceedings/forth/archive/" "Conference Proceedings","FOSD: Feature-Oriented Software Development","","","","2009 (October 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/fosd/","http://portal.acm.org/proceedings/fosd/archive/" "Conference Proceedings","FOSE: Future of Software Engineering","","","","2007 (May 2007)","2007 (May 2007)","http://portal.acm.org/proceedings/fose/","http://portal.acm.org/proceedings/fose/archive/" "Conference Proceedings","FOWANC: Foundations of Wireless Ad-Hoc and Sensor Networking and Computing","","","","2008 (May 2008)","2009 (May 2009)","http://portal.acm.org/proceedings/fowanc/","http://portal.acm.org/proceedings/fowanc/archive/" "Conference Proceedings","FPCA: Functional Programming Languages and Computer Architecture","","","","1981 (October 1981)","1995 (October 1995)","http://portal.acm.org/proceedings/fpca/","http://portal.acm.org/proceedings/fpca/archive/" "Conference Proceedings","FPGA: Field Programmable Gate Arrays","","","","1995 (February 1995)","2013 (February 2013)","http://portal.acm.org/proceedings/fpga/","http://portal.acm.org/proceedings/fpga/archive/" "Conference Proceedings","FPGAworld: FPGAworld","","","","2009 (September 2009)","2013 (September 2013)","http://portal.acm.org/proceedings/fpgaworld/","http://portal.acm.org/proceedings/fpgaworld/archive/" "Conference Proceedings","FSEDS: Foundations of Software Engineering Doctoral Symposium","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/fseds/","http://portal.acm.org/proceedings/fseds/archive/" "Conference Proceedings","FSEN: Fundamentals of Software Engineering","","","","2007 (April 2007)","2007 (April 2007)","http://portal.acm.org/proceedings/fsen/","http://portal.acm.org/proceedings/fsen/archive/" "Conference Proceedings","FSM: Functional Size Measurement","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/fsm/","http://portal.acm.org/proceedings/fsm/archive/" "Conference Proceedings","FTfJP: Formal Techniques for Java-like Programs","","","","2009 (July 2009)","2013 (July 2013)","http://portal.acm.org/proceedings/ftfjp/","http://portal.acm.org/proceedings/ftfjp/archive/" "Conference Proceedings","FeBiD: International Workshop on Feedback Control Implementation and Design in Computing Systems and Networks","","","","2010 (April 2010)","2010 (April 2010)","http://portal.acm.org/proceedings/febid/","http://portal.acm.org/proceedings/febid/archive/" "Conference Proceedings","FoSER: Future of Software Engineering Research ","","","","2010 (November 2010)","2010 (November 2010)","http://portal.acm.org/proceedings/foser/","http://portal.acm.org/proceedings/foser/archive/" "Conference Proceedings","Fun and Games: Fun and Games","","","","2010 (September 2010)","2010 (September 2010)","http://portal.acm.org/proceedings/funandgames/","http://portal.acm.org/proceedings/funandgames/archive/" "Conference Proceedings","Future Play: Future Play","","","","2007 (November 2007)","2010 (May 2010)","http://portal.acm.org/proceedings/futureplay/","http://portal.acm.org/proceedings/futureplay/archive/" "Conference Proceedings","GCE: Grid Computing Environments","","","","2009 (November 2009)","2011 (November 2011)","http://portal.acm.org/proceedings/gce/","http://portal.acm.org/proceedings/gce/archive/" "Conference Proceedings","GCM: Green Computing","","","","2010 (November 2010)","2011 (December 2011)","http://portal.acm.org/proceedings/gcm/","http://portal.acm.org/proceedings/gcm/archive/" "Conference Proceedings","GDCSE: Game Development in Computer Science Education","","","","2008 (February 2008)","2008 (February 2008)","http://portal.acm.org/proceedings/gdcse/","http://portal.acm.org/proceedings/gdcse/archive/" "Conference Proceedings","GEC: Genetic and Evolutionary Computation","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/gec/","http://portal.acm.org/proceedings/gec/archive/" "Conference Proceedings","GECCO: Genetic and Evolutionary Computation Conference","","","","1996 (July 1996)","2013 (July 2013)","http://portal.acm.org/proceedings/gecco/","http://portal.acm.org/proceedings/gecco/archive/" "Conference Proceedings","GH: Graphics Hardware","","","","1997 (August 1997)","2008 (June 2008)","http://portal.acm.org/proceedings/gh/","http://portal.acm.org/proceedings/gh/archive/" "Conference Proceedings","GI: Graphics Interface","","","","2004 (May 2004)","2013 (May 2013)","http://portal.acm.org/proceedings/gi/","http://portal.acm.org/proceedings/gi/archive/" "Conference Proceedings","GIR: Geographic Information Retrieval","","","","2005 (November 2005)","2010 (February 2010)","http://portal.acm.org/proceedings/gir/","http://portal.acm.org/proceedings/gir/archive/" "Conference Proceedings","GIS: Geographic Information Systems","","","","1996 (November 1996)","2012 (November 2012)","http://portal.acm.org/proceedings/gis/","http://portal.acm.org/proceedings/gis/archive/" "Conference Proceedings","GLSVLSI: Great Lakes Symposium on VLSI","","","","1995 (March 1995)","2013 (May 2013)","http://portal.acm.org/proceedings/glsvlsi/","http://portal.acm.org/proceedings/glsvlsi/archive/" "Conference Proceedings","GMAC: Grids Meets Autonomic Computing","","","","2009 (June 2009)","2010 (June 2010)","http://portal.acm.org/proceedings/gmac/","http://portal.acm.org/proceedings/gmac/archive/" "Conference Proceedings","GMW: Grid Monitoring","","","","2007 (June 2007)","2007 (June 2007)","http://portal.acm.org/proceedings/gmw/","http://portal.acm.org/proceedings/gmw/archive/" "Conference Proceedings","GPCE: Generative Programming and Component Engineering","","","","2002 (October 2002)","2013 (October 2013)","http://portal.acm.org/proceedings/gpce/","http://portal.acm.org/proceedings/gpce/archive/" "Conference Proceedings","GPGPU: General Purpose Processing on Graphics Processing Units","","","","2009 (March 2009)","2012 (March 2012)","http://portal.acm.org/proceedings/gpgpu/","http://portal.acm.org/proceedings/gpgpu/archive/" "Conference Proceedings","GRAPHITE: Computer Graphics and Interactive Techniques in Australia and South East Asia","","","","2003 (February 2003)","2007 (December 2007)","http://portal.acm.org/proceedings/graphite/","http://portal.acm.org/proceedings/graphite/archive/" "Conference Proceedings","GRID: Grid Computing","","","","2003 (November 2003)","2008 (September 2008)","http://portal.acm.org/proceedings/grid/","http://portal.acm.org/proceedings/grid/archive/" "Conference Proceedings","GROUP: Supporting Group Work","","","","1997 (November 1997)","2012 (October 2012)","http://portal.acm.org/proceedings/group/","http://portal.acm.org/proceedings/group/archive/" "Conference Proceedings","GRaMoT: Graph and Model Transformations","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/gramot/","http://portal.acm.org/proceedings/gramot/archive/" "Conference Proceedings","GSD: Global Software Development for the Practitioner","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/gsd/","http://portal.acm.org/proceedings/gsd/archive/" "Conference Proceedings","GTIP: Governance of Technology, Information, and Policies ","","","","2010 (December 2010)","2011 (December 2011)","http://portal.acm.org/proceedings/gtip/","http://portal.acm.org/proceedings/gtip/archive/" "Conference Proceedings","GaMMa: Global Integrated Model Management","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/gamma/","http://portal.acm.org/proceedings/gamma/archive/" "Conference Proceedings","GameNets: Game Theory for Communications and Networks","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/gamenets/","http://portal.acm.org/proceedings/gamenets/archive/" "Conference Proceedings","Green Networking: Green networking","","","","2010 (August 2010)","2011 (August 2011)","http://portal.acm.org/proceedings/greennetworking/","http://portal.acm.org/proceedings/greennetworking/archive/" "Conference Proceedings","GridNets: Networks for Grid Applications","","","","2007 (October 2007)","2007 (October 2007)","http://portal.acm.org/proceedings/gridnets/","http://portal.acm.org/proceedings/gridnets/archive/" "Conference Proceedings","HAS: Haptic User Interfaces in Ambient Media Systems","","","","2008 (February 2008)","2008 (February 2008)","http://portal.acm.org/proceedings/has/","http://portal.acm.org/proceedings/has/archive/" "Conference Proceedings","HCC: Human-Centered Computing","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/hcc/","http://portal.acm.org/proceedings/hcc/archive/" "Conference Proceedings","HCM: Human-Centered Multimedia","","","","2006 (October 2006)","2007 (September 2007)","http://portal.acm.org/proceedings/hcm/","http://portal.acm.org/proceedings/hcm/archive/" "Conference Proceedings","HCOMP: Human Computation","","","","2009 (June 2009)","2010 (July 2010)","http://portal.acm.org/proceedings/hcomp/","http://portal.acm.org/proceedings/hcomp/archive/" "Conference Proceedings","HDP: Hardcopy Document Processing","","","","2004 (November 2004)","2004 (November 2004)","http://portal.acm.org/proceedings/hdp/","http://portal.acm.org/proceedings/hdp/archive/" "Conference Proceedings","HIKM: Healthcare Information and Knowledge Management","","","","2006 (November 2006)","2010 (January 2010)","http://portal.acm.org/proceedings/hikm/","http://portal.acm.org/proceedings/hikm/archive/" "Conference Proceedings","HLLCA: High-Level-Language Computer Architecture","","","","1973 (November 1973)","1973 (November 1973)","http://portal.acm.org/proceedings/hllca/","http://portal.acm.org/proceedings/hllca/archive/" "Conference Proceedings","HLPP: High-level parallel programming and applications","","","","2010 (September 2010)","2011 (September 2011)","http://portal.acm.org/proceedings/hlpp/","http://portal.acm.org/proceedings/hlpp/archive/" "Conference Proceedings","HOPL: History of Programming Languages","","","","1993 (April 1993)","2007 (June 2007)","http://portal.acm.org/proceedings/hopl/","http://portal.acm.org/proceedings/hopl/archive/" "Conference Proceedings","HPCVirt: System-level Virtualization for High Performance Computing","","","","2008 (March 2008)","2009 (March 2009)","http://portal.acm.org/proceedings/hpcvirt/","http://portal.acm.org/proceedings/hpcvirt/archive/" "Conference Proceedings","HPDC: High Performance Distributed Computing","","","","1995 (August 1995)","2013 (June 2013)","http://portal.acm.org/proceedings/hpdc/","http://portal.acm.org/proceedings/hpdc/archive/" "Conference Proceedings","HPDGIS: High Performance and Distributed Geographic Information Systems ","","","","2010 (November 2010)","2011 (November 2011)","http://portal.acm.org/proceedings/hpdgis/","http://portal.acm.org/proceedings/hpdgis/archive/" "Conference Proceedings","HPG: High Perfomance Graphics","","","","2009 (August 2009)","2013 (July 2013)","http://portal.acm.org/proceedings/hpg/","http://portal.acm.org/proceedings/hpg/archive/" "Conference Proceedings","HPRCTA: High-Performance Reconfigurable Computing Technology and Applications","","","","2007 (November 2007)","2009 (November 2009)","http://portal.acm.org/proceedings/hprcta/","http://portal.acm.org/proceedings/hprcta/archive/" "Conference Proceedings","HPW: History of Personal Workstations","","","","1986 (January 1986)","1986 (January 1986)","http://portal.acm.org/proceedings/hpw/","http://portal.acm.org/proceedings/hpw/archive/" "Conference Proceedings","HRI: Human-Robot Interaction","","","","2006 (March 2006)","2013 (March 2013)","http://portal.acm.org/proceedings/hri/","http://portal.acm.org/proceedings/hri/archive/" "Conference Proceedings","HSCC: Hybrid Systems: Computation and Control","","","","2010 (April 2010)","2013 (April 2013)","http://portal.acm.org/proceedings/hscc/","http://portal.acm.org/proceedings/hscc/archive/" "Conference Proceedings","HSNC: History of Scientific and Numeric Computation","","","","1987 (October 1987)","1987 (October 1987)","http://portal.acm.org/proceedings/hsnc/","http://portal.acm.org/proceedings/hsnc/archive/" "Conference Proceedings","HSSE: Human and Social Factors of Software Engineering","","","","2005 (May 2005)","2005 (May 2005)","http://portal.acm.org/proceedings/hsse/","http://portal.acm.org/proceedings/hsse/archive/" "Conference Proceedings","HT: Hypertext and hypermedia","","","","1987 (November 1987)","2013 (May 2013)","http://portal.acm.org/proceedings/ht/","http://portal.acm.org/proceedings/ht/archive/" "Conference Proceedings","Haskell: Haskell","","","","2002 (October 2002)","2013 (September 2013)","http://portal.acm.org/proceedings/haskell/","http://portal.acm.org/proceedings/haskell/archive/" "Conference Proceedings","HealthNet: Networking Support for Health Care and Assisted Living Environments","","","","2007 (June 2007)","2008 (June 2008)","http://portal.acm.org/proceedings/healthnet/","http://portal.acm.org/proceedings/healthnet/archive/" "Conference Proceedings","HetRec: Information Heterogeneity and Fusion in Recommender Systems ","","","","2010 (September 2010)","2011 (October 2011)","http://portal.acm.org/proceedings/hetrec/","http://portal.acm.org/proceedings/hetrec/archive/" "Conference Proceedings","HeterSanet: Heterogeneous Sensor and Actor Networks","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/hetersanet/","http://portal.acm.org/proceedings/hetersanet/archive/" "Conference Proceedings","HiPC: High Performance Computing ","","","","2008 (December 2008)","2008 (December 2008)","http://portal.acm.org/proceedings/hipc/","http://portal.acm.org/proceedings/hipc/archive/" "Conference Proceedings","HomeNets: Home Networks","","","","2010 (September 2010)","2011 (August 2011)","http://portal.acm.org/proceedings/homenets/","http://portal.acm.org/proceedings/homenets/archive/" "Conference Proceedings","HotMobile: Mobile Computing Systems and Applications","","","","2008 (February 2008)","2013 (February 2013)","http://portal.acm.org/proceedings/hotmobile/","http://portal.acm.org/proceedings/hotmobile/archive/" "Conference Proceedings","HotPlanet: Hot Topics of Planet-Scale Mobility Measurements","","","","2009 (June 2009)","2013 (August 2013)","http://portal.acm.org/proceedings/hotplanet/","http://portal.acm.org/proceedings/hotplanet/archive/" "Conference Proceedings","HotSWUp: Hot Topics in Software Upgrades","","","","2008 (October 2008)","2009 (October 2009)","http://portal.acm.org/proceedings/hotswup/","http://portal.acm.org/proceedings/hotswup/archive/" "Conference Proceedings","Hotnets: Hot Topics in Networks","","","","2010 (October 2010)","2013 (November 2013)","http://portal.acm.org/proceedings/hotnets/","http://portal.acm.org/proceedings/hotnets/archive/" "Conference Proceedings","HuCom: Human Factors and Computational Models in Negotiation","","","","2009 (December 2008)","2009 (December 2008)","http://portal.acm.org/proceedings/hucom/","http://portal.acm.org/proceedings/hucom/archive/" "Conference Proceedings","I-SEMANTICS: Semantic Systems","","","","2010 (September 2010)","2013 (September 2013)","http://portal.acm.org/proceedings/i-semantics/","http://portal.acm.org/proceedings/i-semantics/archive/" "Conference Proceedings","I3D: Interactive 3D Graphics and Games","","","","1987 (January 1987)","2013 (March 2013)","http://portal.acm.org/proceedings/i3d/","http://portal.acm.org/proceedings/i3d/archive/" "Conference Proceedings","IAT: Intelligent Agent Technology","","","","2006 (December 2006)","2007 (November 2007)","http://portal.acm.org/proceedings/iat/","http://portal.acm.org/proceedings/iat/archive/" "Conference Proceedings","ICAC3: Advances in Computing, Communication and Control","","","","2009 (January 2009)","2009 (January 2009)","http://portal.acm.org/proceedings/icac3/","http://portal.acm.org/proceedings/icac3/archive/" "Conference Proceedings","ICAC: Autonomic Computing","","","","2009 (June 2009)","2012 (September 2012)","http://portal.acm.org/proceedings/icac/","http://portal.acm.org/proceedings/icac/archive/" "Conference Proceedings","ICAIL: International Conference on Artificial Intelligence and Law","","","","1987 (December 1987)","2013 (June 2013)","http://portal.acm.org/proceedings/icail/","http://portal.acm.org/proceedings/icail/archive/" "Conference Proceedings","ICAIT: Advanced Infocomm Technology","","","","2008 (July 2008)","2008 (July 2008)","http://portal.acm.org/proceedings/icait/","http://portal.acm.org/proceedings/icait/archive/" "Conference Proceedings","ICAT: Augmented Tele-existence","","","","2005 (December 2005)","2005 (December 2005)","http://portal.acm.org/proceedings/icat/","http://portal.acm.org/proceedings/icat/archive/" "Conference Proceedings","ICCAD: International Conference on Computer-Aided Design","","","","1992 (November 1992)","2012 (November 2012)","http://portal.acm.org/proceedings/iccad/","http://portal.acm.org/proceedings/iccad/archive/" "Conference Proceedings","ICCPS: Cyber-Physical Systems","","","","2010 (April 2010)","2013 (April 2013)","http://portal.acm.org/proceedings/iccps/","http://portal.acm.org/proceedings/iccps/archive/" "Conference Proceedings","ICDL: International Conference on Dynamic Languages","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/icdl/","http://portal.acm.org/proceedings/icdl/archive/" "Conference Proceedings","ICDSC: Distributed Smart Cameras","","","","2010 (August 2010)","2010 (August 2010)","http://portal.acm.org/proceedings/icdsc/","http://portal.acm.org/proceedings/icdsc/archive/" "Conference Proceedings","ICDT: Database Theory","","","","2009 (March 2009)","2013 (March 2013)","http://portal.acm.org/proceedings/icdt/","http://portal.acm.org/proceedings/icdt/archive/" "Conference Proceedings","ICE: Information and Computation Economies","","","","1998 (October 1998)","1998 (October 1998)","http://portal.acm.org/proceedings/ice/","http://portal.acm.org/proceedings/ice/archive/" "Conference Proceedings","ICEC: International Conference on Electronic Commerce","","","","2003 (September 2003)","2012 (August 2012)","http://portal.acm.org/proceedings/icec/","http://portal.acm.org/proceedings/icec/archive/" "Conference Proceedings","ICEGOV: International Conference on Theory and Practice of Electronic Governance","","","","2007 (December 2007)","2012 (October 2012)","http://portal.acm.org/proceedings/icegov/","http://portal.acm.org/proceedings/icegov/archive/" "Conference Proceedings","ICER: International Computing Education Research Workshop","","","","2005 (October 2005)","2013 (August 2013)","http://portal.acm.org/proceedings/icer/","http://portal.acm.org/proceedings/icer/archive/" "Conference Proceedings","ICFP: International Conference on Functional Programmuing","","","","1996 (June 1996)","2013 (September 2013)","http://portal.acm.org/proceedings/icfp/","http://portal.acm.org/proceedings/icfp/archive/" "Conference Proceedings","ICHIT: International Conference on Hybrid Information Technology","","","","2009 (August 2009)","2009 (August 2009)","http://portal.acm.org/proceedings/ichit/","http://portal.acm.org/proceedings/ichit/archive/" "Conference Proceedings","ICIC: Intercultural Collaboration","","","","2010 (August 2010)","2012 (March 2012)","http://portal.acm.org/proceedings/icic/","http://portal.acm.org/proceedings/icic/archive/" "Conference Proceedings","ICIMCS: Internet Multimedia Computing and Service","","","","2009 (November 2009)","2013 (August 2013)","http://portal.acm.org/proceedings/icimcs/","http://portal.acm.org/proceedings/icimcs/archive/" "Conference Proceedings","ICIS: International Conference on Computer and Information Science","","","","1989 (December 1989)","2009 (November 2009)","http://portal.acm.org/proceedings/icis/","http://portal.acm.org/proceedings/icis/archive/" "Conference Proceedings","ICMI: International Conference on Multimodal Interfaces","","","","2002 (October 2002)","2013 (December 2013)","http://portal.acm.org/proceedings/icmi/","http://portal.acm.org/proceedings/icmi/archive/" "Conference Proceedings","ICML: International Conference on Machine Learning","","","","2004 (July 2004)","2009 (June 2009)","http://portal.acm.org/proceedings/icml/","http://portal.acm.org/proceedings/icml/archive/" "Conference Proceedings","ICOOOLPS: Implementation, Compilation, Optimization of Object-Oriented Languages and Programming Systems","","","","2009 (July 2009)","2013 (July 2013)","http://portal.acm.org/proceedings/icooolps/","http://portal.acm.org/proceedings/icooolps/archive/" "Conference Proceedings","ICPS: Pervasive Services","","","","2008 (July 2008)","2009 (July 2009)","http://portal.acm.org/proceedings/icps/","http://portal.acm.org/proceedings/icps/archive/" "Conference Proceedings","ICPW: International Conference on Pragmatic Web","","","","2007 (October 2007)","2008 (November 2008)","http://portal.acm.org/proceedings/icpw/","http://portal.acm.org/proceedings/icpw/archive/" "Conference Proceedings","ICS: International Conference on Supercomputing","","","","1988 (June 1988)","2013 (June 2013)","http://portal.acm.org/proceedings/ics/","http://portal.acm.org/proceedings/ics/archive/" "Conference Proceedings","ICSE: International Conference on Software Engineering","","","","1976 (October 1976)","2012 (June 2012)","http://portal.acm.org/proceedings/icse/","http://portal.acm.org/proceedings/icse/archive/" "Conference Proceedings","ICSOC: International Conference on Service Oriented Computing","","","","2004 (November 2004)","2004 (November 2004)","http://portal.acm.org/proceedings/icsoc/","http://portal.acm.org/proceedings/icsoc/archive/" "Conference Proceedings","ICTD: Information and Communication Technologies and Development ","","","","2009 (April 2009)","2013 (December 2013)","http://portal.acm.org/proceedings/ictd/","http://portal.acm.org/proceedings/ictd/archive/" "Conference Proceedings","ICUIMC: International Conference on Ubiquitous Information Management and Communication","","","","2008 (January 2008)","2013 (January 2013)","http://portal.acm.org/proceedings/icuimc/","http://portal.acm.org/proceedings/icuimc/archive/" "Conference Proceedings","ICVGIP: Indian Conference on Computer Vision, Graphics and Image Processing","","","","2010 (December 2010)","2012 (December 2012)","http://portal.acm.org/proceedings/icvgip/","http://portal.acm.org/proceedings/icvgip/archive/" "Conference Proceedings","ICWE: Web Engineering","","","","2006 (July 2006)","2006 (July 2006)","http://portal.acm.org/proceedings/icwe/","http://portal.acm.org/proceedings/icwe/archive/" "Conference Proceedings","ICWET: Workshop on Emerging Trends in Technology","","","","2010 (February 2010)","2011 (February 2011)","http://portal.acm.org/proceedings/icwet/","http://portal.acm.org/proceedings/icwet/archive/" "Conference Proceedings","IDAR: Innovative Database Research","","","","2008 (June 2008)","2010 (June 2010)","http://portal.acm.org/proceedings/idar/","http://portal.acm.org/proceedings/idar/archive/" "Conference Proceedings","IDC: Interaction Design and Children","","","","2003 (July 2003)","2013 (June 2013)","http://portal.acm.org/proceedings/idc/","http://portal.acm.org/proceedings/idc/archive/" "Conference Proceedings","IDEAS: International Database Engineering & Applications Symposium","","","","2008 (September 2008)","2013 (October 2013)","http://portal.acm.org/proceedings/ideas/","http://portal.acm.org/proceedings/ideas/archive/" "Conference Proceedings","IDL: Interface Definition Languages","","","","1994 (August 1994)","1994 (August 1994)","http://portal.acm.org/proceedings/idl/","http://portal.acm.org/proceedings/idl/archive/" "Conference Proceedings","IDTRUST: Identity and Trust on the Internet","","","","2008 (March 2008)","2010 (April 2010)","http://portal.acm.org/proceedings/idtrust/","http://portal.acm.org/proceedings/idtrust/archive/" "Conference Proceedings","IE: Interactive Entertainment","","","","2006 (December 2006)","2013 (September 2013)","http://portal.acm.org/proceedings/ie/","http://portal.acm.org/proceedings/ie/archive/" "Conference Proceedings","IEA/AIE: Industrial and Engineering Applications of Artificial Intelligence and Expert Systems","","","","1988 (June 1988)","2011 (June 2011)","http://portal.acm.org/proceedings/iea/aie/","http://portal.acm.org/proceedings/iea/aie/archive/" "Conference Proceedings","IFMT: Next-Generation Multicore/Manycore Technologies","","","","2008 (November 2008)","2010 (June 2010)","http://portal.acm.org/proceedings/ifmt/","http://portal.acm.org/proceedings/ifmt/archive/" "Conference Proceedings","IHC: Brazilian Symposium on Human Factors in Computing Systems","","","","2006 (November 2006)","2012 (November 2012)","http://portal.acm.org/proceedings/ihc/","http://portal.acm.org/proceedings/ihc/archive/" "Conference Proceedings","IHI: International Health Informatics Symposium","","","","2010 (November 2010)","2012 (January 2012)","http://portal.acm.org/proceedings/ihi/","http://portal.acm.org/proceedings/ihi/archive/" "Conference Proceedings","IHIS: Interoperability of Heterogeneous Information Systems","","","","2005 (November 2005)","2005 (November 2005)","http://portal.acm.org/proceedings/ihis/","http://portal.acm.org/proceedings/ihis/archive/" "Conference Proceedings","IHM: International Conference on Association Francophone d'Interaction Homme-Machine","","","","2002 (November 2002)","2013 (November 2013)","http://portal.acm.org/proceedings/ihm/","http://portal.acm.org/proceedings/ihm/archive/" "Conference Proceedings","IIES: Isolation and Integration in Embedded Systems","","","","2008 (April 2008)","2009 (March 2009)","http://portal.acm.org/proceedings/iies/","http://portal.acm.org/proceedings/iies/archive/" "Conference Proceedings","IIiX: Information Interaction in Context","","","","2006 (October 2006)","2012 (August 2012)","http://portal.acm.org/proceedings/iiix/","http://portal.acm.org/proceedings/iiix/archive/" "Conference Proceedings","ILC: International Lisp Conference","","","","2009 (April 2007)","2010 (October 2010)","http://portal.acm.org/proceedings/ilc/","http://portal.acm.org/proceedings/ilc/archive/" "Conference Proceedings","IMC: Internet Measurement Conference","","","","2003 (October 2003)","2013 (October 2013)","http://portal.acm.org/proceedings/imc/","http://portal.acm.org/proceedings/imc/archive/" "Conference Proceedings","IMCE: Interactive Multimedia for Consumer Electronics","","","","2009 (October 2009)","2009 (October 2009)","http://portal.acm.org/proceedings/imce/","http://portal.acm.org/proceedings/imce/archive/" "Conference Proceedings","IMW: Internet Measurement Workshop","","","","2001 (November 2001)","2002 (November 2002)","http://portal.acm.org/proceedings/imw/","http://portal.acm.org/proceedings/imw/archive/" "Conference Proceedings","INA-OCMC: Interconnection Network Architecture: On-Chip, Multi-Chip","","","","2011 (January 2011)","2011 (January 2011)","http://portal.acm.org/proceedings/ina-ocmc/","http://portal.acm.org/proceedings/ina-ocmc/archive/" "Conference Proceedings","INM: Internet Network Management","","","","2006 (September 2006)","2007 (August 2007)","http://portal.acm.org/proceedings/inm/","http://portal.acm.org/proceedings/inm/archive/" "Conference Proceedings","INT3: Intelligent Narrative Technologies","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/int3/","http://portal.acm.org/proceedings/int3/archive/" "Conference Proceedings","INTERACT: Interaction between Compilers and Computer Architecture","","","","2010 (March 2010)","2010 (March 2010)","http://portal.acm.org/proceedings/interact/","http://portal.acm.org/proceedings/interact/archive/" "Conference Proceedings","INTETAIN: Intelligent Technologies for Interactive Entertainment","","","","2007 (January 2008)","2007 (January 2008)","http://portal.acm.org/proceedings/intetain/","http://portal.acm.org/proceedings/intetain/archive/" "Conference Proceedings","IOPADS: I/O in Parallel and Distributed Systems","","","","1996 (May 1996)","1999 (May 1999)","http://portal.acm.org/proceedings/iopads/","http://portal.acm.org/proceedings/iopads/archive/" "Conference Proceedings","IPSN: Information Processing in Sensor Networks","","","","2004 (April 2004)","2013 (April 2013)","http://portal.acm.org/proceedings/ipsn/","http://portal.acm.org/proceedings/ipsn/archive/" "Conference Proceedings","IPT/EDT: Immersive Projection technologies/Emerging Display Technologies","","","","2008 (August 2008)","2008 (August 2008)","http://portal.acm.org/proceedings/ipt/edt/","http://portal.acm.org/proceedings/ipt/edt/archive/" "Conference Proceedings","IPTComm: Principles, Systems and Applications of IP Telecommunications","","","","2007 (July 2007)","2010 (August 2010)","http://portal.acm.org/proceedings/iptcomm/","http://portal.acm.org/proceedings/iptcomm/archive/" "Conference Proceedings","IQIS: Information Quality in Information Systems","","","","2004 (June 2004)","2005 (June 2005)","http://portal.acm.org/proceedings/iqis/","http://portal.acm.org/proceedings/iqis/archive/" "Conference Proceedings","IR: Intermediate Representations","","","","1995 (March 1995)","1995 (March 1995)","http://portal.acm.org/proceedings/ir/","http://portal.acm.org/proceedings/ir/archive/" "Conference Proceedings","IRAL: Information Retrieval with Asian Languages","","","","2000 (November 2000)","2000 (November 2000)","http://portal.acm.org/proceedings/iral/","http://portal.acm.org/proceedings/iral/archive/" "Conference Proceedings","IRE-ACM-AIEE: IRE-ACM-AIEE","","","","1957 (February 1957)","1961 (May 1961)","http://portal.acm.org/proceedings/ire-acm-aiee/","http://portal.acm.org/proceedings/ire-acm-aiee/archive/" "Conference Proceedings","IRTAW: Real-Time Ada","","","","1987 (October 1987)","2007 (April 2007)","http://portal.acm.org/proceedings/irtaw/","http://portal.acm.org/proceedings/irtaw/archive/" "Conference Proceedings","IS: Guidelines for undergraduate degree programs on Model curriculum and guidelines for undergraduate degree programs in information systems","","","","1997 (December 1997)","1997 (December 1997)","http://portal.acm.org/proceedings/is/","http://portal.acm.org/proceedings/is/archive/" "Conference Proceedings","ISA: Indoor Spatial Awareness ","","","","2010 (November 2010)","2012 (November 2012)","http://portal.acm.org/proceedings/isa/","http://portal.acm.org/proceedings/isa/archive/" "Conference Proceedings","ISAW: Software Architecture Workshop","","","","1996 (October 1996)","1998 (November 1998)","http://portal.acm.org/proceedings/isaw/","http://portal.acm.org/proceedings/isaw/archive/" "Conference Proceedings","ISB: International Symposium on Biocomputing","","","","2010 (February 2010)","2010 (February 2010)","http://portal.acm.org/proceedings/isb/","http://portal.acm.org/proceedings/isb/archive/" "Conference Proceedings","ISCA: International Symposium on Computer Architecture","","","","1973 (December 1973)","2013 (June 2013)","http://portal.acm.org/proceedings/isca/","http://portal.acm.org/proceedings/isca/archive/" "Conference Proceedings","ISEC: India Software Engineering Conference","","","","2008 (February 2008)","2013 (February 2013)","http://portal.acm.org/proceedings/isec/","http://portal.acm.org/proceedings/isec/archive/" "Conference Proceedings","ISESE: International Symposium on Empirical Software Engineering","","","","2002 (October 2002)","2006 (September 2006)","http://portal.acm.org/proceedings/isese/","http://portal.acm.org/proceedings/isese/archive/" "Conference Proceedings","ISLPED: International Symposium on Low Power Electronic Design","","","","1995 (April 1995)","2012 (July 2012)","http://portal.acm.org/proceedings/islped/","http://portal.acm.org/proceedings/islped/archive/" "Conference Proceedings","ISMAR: Mixed and Augmented Reality","","","","2002 (September 2002)","2009 (October 2009)","http://portal.acm.org/proceedings/ismar/","http://portal.acm.org/proceedings/ismar/archive/" "Conference Proceedings","ISMIS: International Symposium on Methodologies for Intelligent Systems","","","","1986 (December 1986)","1986 (December 1986)","http://portal.acm.org/proceedings/ismis/","http://portal.acm.org/proceedings/ismis/archive/" "Conference Proceedings","ISMM: Memory Management","","","","1998 (October 1998)","2013 (June 2013)","http://portal.acm.org/proceedings/ismm/","http://portal.acm.org/proceedings/ismm/archive/" "Conference Proceedings","ISPA: Parallel and Distributed Processing and Applications","","","","2003 (July 2003)","2004 (December 2004)","http://portal.acm.org/proceedings/ispa/","http://portal.acm.org/proceedings/ispa/archive/" "Conference Proceedings","ISPD: Physical Design","","","","1997 (April 1997)","2013 (March 2013)","http://portal.acm.org/proceedings/ispd/","http://portal.acm.org/proceedings/ispd/archive/" "Conference Proceedings","ISPW: International Software Process Workshop","","","","1988 (April 1988)","1996 (June 1996)","http://portal.acm.org/proceedings/ispw/","http://portal.acm.org/proceedings/ispw/archive/" "Conference Proceedings","ISQED: Quality Electronic Design","","","","2006 (March 2006)","2006 (March 2006)","http://portal.acm.org/proceedings/isqed/","http://portal.acm.org/proceedings/isqed/archive/" "Conference Proceedings","ISSAC: International Symposium of Symbolic and Algebraic Computation","","","","1989 (July 1989)","2013 (June 2013)","http://portal.acm.org/proceedings/issac/","http://portal.acm.org/proceedings/issac/archive/" "Conference Proceedings","ISSS: International Symposium on System Synthesis","","","","1994 (May 1994)","2002 (October 2002)","http://portal.acm.org/proceedings/isss/","http://portal.acm.org/proceedings/isss/archive/" "Conference Proceedings","ISSTA: International Symposium on Software Testing and Analysis","","","","1993 (August 1993)","2013 (July 2013)","http://portal.acm.org/proceedings/issta/","http://portal.acm.org/proceedings/issta/archive/" "Conference Proceedings","ISTA: Information Science, Technology and Applications","","","","2009 (March 2009)","2009 (March 2009)","http://portal.acm.org/proceedings/ista/","http://portal.acm.org/proceedings/ista/archive/" "Conference Proceedings","ISWSA: Intelligent Semantic Web — Services and Applications","","","","2010 (June 2010)","2011 (April 2011)","http://portal.acm.org/proceedings/iswsa/","http://portal.acm.org/proceedings/iswsa/archive/" "Conference Proceedings","ITS: Interactive Tabletops and Surfaces","","","","2009 (November 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/its/","http://portal.acm.org/proceedings/its/archive/" "Conference Proceedings","ITiCSE: Innovation and Technology in Computer Science Education","","","","1996 (June 1996)","2013 (July 2013)","http://portal.acm.org/proceedings/iticse/","http://portal.acm.org/proceedings/iticse/archive/" "Conference Proceedings","IUCS: International Universal Communication Symposium","","","","2009 (December 2009)","2009 (December 2009)","http://portal.acm.org/proceedings/iucs/","http://portal.acm.org/proceedings/iucs/archive/" "Conference Proceedings","IUI: Intelligent User Interfaces","","","","1993 (February 1993)","2013 (March 2013)","http://portal.acm.org/proceedings/iui/","http://portal.acm.org/proceedings/iui/archive/" "Conference Proceedings","IVME: Interpreters, Virtual Machines and Emulators","","","","2003 (June 2003)","2004 (June 2004)","http://portal.acm.org/proceedings/ivme/","http://portal.acm.org/proceedings/ivme/archive/" "Conference Proceedings","IW-SOSWE: Service Oriented Software Engineering","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/iw-soswe/","http://portal.acm.org/proceedings/iw-soswe/archive/" "Conference Proceedings","IWAAPF: Application and Advances of Problem Frames","","","","2006 (May 2006)","2008 (May 2008)","http://portal.acm.org/proceedings/iwaapf/","http://portal.acm.org/proceedings/iwaapf/archive/" "Conference Proceedings","IWACO: International Workshop on Aliasing, Confinement and Ownership in Object-Oriented Programming","","","","2009 (July 2009)","2009 (July 2009)","http://portal.acm.org/proceedings/iwaco/","http://portal.acm.org/proceedings/iwaco/archive/" "Conference Proceedings","IWCMC: International Wireless Communications and Mobile Computing Conference","","","","2006 (July 2006)","2010 (June 2010)","http://portal.acm.org/proceedings/iwcmc/","http://portal.acm.org/proceedings/iwcmc/archive/" "Conference Proceedings","IWCTS: Computational Transportation Science","","","","2009 (November 2009)","2013 (November 2013)","http://portal.acm.org/proceedings/iwcts/","http://portal.acm.org/proceedings/iwcts/archive/" "Conference Proceedings","IWDE: Digital Engineering","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/iwde/","http://portal.acm.org/proceedings/iwde/archive/" "Conference Proceedings","IWGS: International Workshop on GeoStreaming","","","","2010 (November 2010)","2012 (November 2012)","http://portal.acm.org/proceedings/iwgs/","http://portal.acm.org/proceedings/iwgs/archive/" "Conference Proceedings","IWIC: Intercultural Collaboration","","","","2009 (February 2009)","2009 (February 2009)","http://portal.acm.org/proceedings/iwic/","http://portal.acm.org/proceedings/iwic/archive/" "Conference Proceedings","IWICSS: Incorporating COTS Software into Software Systems","","","","2007 (May 2007)","2007 (May 2007)","http://portal.acm.org/proceedings/iwicss/","http://portal.acm.org/proceedings/iwicss/archive/" "Conference Proceedings","IWMCP: Model Comparison in Practice","","","","2010 (July 2010)","2011 (June 2011)","http://portal.acm.org/proceedings/iwmcp/","http://portal.acm.org/proceedings/iwmcp/archive/" "Conference Proceedings","IWMSE: Multicore Software Engineering","","","","2008 (May 2008)","2011 (May 2011)","http://portal.acm.org/proceedings/iwmse/","http://portal.acm.org/proceedings/iwmse/archive/" "Conference Proceedings","IWOCE: Open Component EcoSystems","","","","2009 (August 2009)","2009 (August 2009)","http://portal.acm.org/proceedings/iwoce/","http://portal.acm.org/proceedings/iwoce/archive/" "Conference Proceedings","IWPSE-EVOL: Software Evolution and Principles of Software Evolution ","","","","2010 (September 2010)","2011 (September 2011)","http://portal.acm.org/proceedings/iwpse-evol/","http://portal.acm.org/proceedings/iwpse-evol/archive/" "Conference Proceedings","IWPSE: Principles of Software Evolution","","","","2001 (September 2001)","2013 (August 2013)","http://portal.acm.org/proceedings/iwpse/","http://portal.acm.org/proceedings/iwpse/archive/" "Conference Proceedings","IWQoS: Quality of Service","","","","2003 (June 2003)","2012 (June 2012)","http://portal.acm.org/proceedings/iwqos/","http://portal.acm.org/proceedings/iwqos/archive/" "Conference Proceedings","IWRIDL: Research Issues in Digital Libraries","","","","2007 (December 2006)","2007 (December 2006)","http://portal.acm.org/proceedings/iwridl/","http://portal.acm.org/proceedings/iwridl/archive/" "Conference Proceedings","IWSC: Software Clones","","","","2010 (May 2010)","2011 (May 2011)","http://portal.acm.org/proceedings/iwsc/","http://portal.acm.org/proceedings/iwsc/archive/" "Conference Proceedings","IWSESS: Software Engineering for Secure Systems","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/iwsess/","http://portal.acm.org/proceedings/iwsess/archive/" "Conference Proceedings","IWSSD: International Workshop on Software Specification and Design","","","","1989 (April 1989)","2000 (November 2000)","http://portal.acm.org/proceedings/iwssd/","http://portal.acm.org/proceedings/iwssd/archive/" "Conference Proceedings","IWST: Smalltalk Technologies","","","","2009 (August 2009)","2012 (August 2012)","http://portal.acm.org/proceedings/iwst/","http://portal.acm.org/proceedings/iwst/archive/" "Conference Proceedings","IWSTI: Satellite/Terrestrial Interworking","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/iwsti/","http://portal.acm.org/proceedings/iwsti/archive/" "Conference Proceedings","IWVS: Video Surveillance","","","","2003 (November 2003)","2003 (November 2003)","http://portal.acm.org/proceedings/iwvs/","http://portal.acm.org/proceedings/iwvs/archive/" "Conference Proceedings","InfoScale: Scalable Information Systems","","","","2006 (May 2006)","2007 (June 2007)","http://portal.acm.org/proceedings/infoscale/","http://portal.acm.org/proceedings/infoscale/archive/" "Conference Proceedings","InfoSecCD: Information Security Curriculum Development","","","","2004 (October 2004)","2013 (October 2013)","http://portal.acm.org/proceedings/infoseccd/","http://portal.acm.org/proceedings/infoseccd/archive/" "Conference Proceedings","InfoSecu: Information Security","","","","2004 (November 2004)","2004 (November 2004)","http://portal.acm.org/proceedings/infosecu/","http://portal.acm.org/proceedings/infosecu/archive/" "Conference Proceedings","Insider Threats: Insider Threats","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/insiderthreats/","http://portal.acm.org/proceedings/insiderthreats/archive/" "Conference Proceedings","InterSense: Integrated Internet Ad Hoc and Sensor Networks","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/intersense/","http://portal.acm.org/proceedings/intersense/archive/" "Conference Proceedings","Internetware: Internetware","","","","2009 (October 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/internetware/","http://portal.acm.org/proceedings/internetware/archive/" "Conference Proceedings","Interperf: Interdisciplinary Systems Approach in Performance Evaluation and Design of Computer & Communications Systems","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/interperf/","http://portal.acm.org/proceedings/interperf/archive/" "Conference Proceedings","JAVA: Java Grande","","","","1999 (June 1999)","2000 (June 2000)","http://portal.acm.org/proceedings/java/","http://portal.acm.org/proceedings/java/archive/" "Conference Proceedings","JCDL: Joint Conference on Digital Libraries","","","","2001 (January 2001)","2013 (July 2013)","http://portal.acm.org/proceedings/jcdl/","http://portal.acm.org/proceedings/jcdl/archive/" "Conference Proceedings","JGI: ACM-ISCOPE conference on Java Grande","","","","2001 (June 2001)","2002 (November 2002)","http://portal.acm.org/proceedings/jgi/","http://portal.acm.org/proceedings/jgi/archive/" "Conference Proceedings","JTRES: Java Technologies for Real-Time and Embedded Systems","","","","2006 (October 2006)","2013 (October 2013)","http://portal.acm.org/proceedings/jtres/","http://portal.acm.org/proceedings/jtres/archive/" "Conference Proceedings","K-CAP: Knowledge Capture","","","","2001 (October 2001)","2013 (June 2013)","http://portal.acm.org/proceedings/k-cap/","http://portal.acm.org/proceedings/k-cap/archive/" "Conference Proceedings","KDD: Knowledge Discovery and Data Mining","","","","1999 (August 1999)","2013 (August 2013)","http://portal.acm.org/proceedings/kdd/","http://portal.acm.org/proceedings/kdd/archive/" "Conference Proceedings","KEYS: Keyword Search on Structured Data","","","","2009 (June 2009)","2012 (May 2012)","http://portal.acm.org/proceedings/keys/","http://portal.acm.org/proceedings/keys/archive/" "Conference Proceedings","Koli Calling: Koli Calling International Conference on Computing Education Research ","","","","2010 (October 2010)","2013 (November 2013)","http://portal.acm.org/proceedings/kolicalling/","http://portal.acm.org/proceedings/kolicalling/archive/" "Conference Proceedings","Koli: Computing Education Research","","","","2008 (November 2008)","2008 (November 2008)","http://portal.acm.org/proceedings/koli/","http://portal.acm.org/proceedings/koli/archive/" "Conference Proceedings","LADIS: Large-Scale Distributed Systems and Middleware","","","","2008 (September 2008)","2010 (July 2010)","http://portal.acm.org/proceedings/ladis/","http://portal.acm.org/proceedings/ladis/archive/" "Conference Proceedings","LANC: Latin American Networking Conference","","","","2003 (October 2003)","2012 (October 2012)","http://portal.acm.org/proceedings/lanc/","http://portal.acm.org/proceedings/lanc/archive/" "Conference Proceedings","LATE: Linking Aspect Technology and Evolution","","","","2007 (March 2007)","2008 (March 2008)","http://portal.acm.org/proceedings/late/","http://portal.acm.org/proceedings/late/archive/" "Conference Proceedings","LBSN: Location Based Social Networks","","","","2009 (November 2009)","2012 (November 2012)","http://portal.acm.org/proceedings/lbsn/","http://portal.acm.org/proceedings/lbsn/archive/" "Conference Proceedings","LCR: Languages, Compilers, and Run-time Support for Scalable Systems","","","","2004 (October 2004)","2004 (October 2004)","http://portal.acm.org/proceedings/lcr/","http://portal.acm.org/proceedings/lcr/archive/" "Conference Proceedings","LCSD: Library-Centric Software Design","","","","2007 (October 2007)","2007 (October 2007)","http://portal.acm.org/proceedings/lcsd/","http://portal.acm.org/proceedings/lcsd/archive/" "Conference Proceedings","LCTES: Languages, Compilers, and Tools for Embedded Systems","","","","1995 (November 1995)","2013 (June 2013)","http://portal.acm.org/proceedings/lctes/","http://portal.acm.org/proceedings/lctes/archive/" "Conference Proceedings","LDTA: Language Descriptions, Tools and Applications","","","","2010 (March 2010)","2012 (March 2012)","http://portal.acm.org/proceedings/ldta/","http://portal.acm.org/proceedings/ldta/archive/" "Conference Proceedings","LFMTP: Logical Frameworks and Meta-Languages","","","","2009 (August 2009)","2013 (September 2013)","http://portal.acm.org/proceedings/lfmtp/","http://portal.acm.org/proceedings/lfmtp/archive/" "Conference Proceedings","LFP: LISP and Functional Programming","","","","1980 (August 1980)","1994 (July 1994)","http://portal.acm.org/proceedings/lfp/","http://portal.acm.org/proceedings/lfp/archive/" "Conference Proceedings","LISP: Celebrating the 50th Anniversary of Lisp","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/lisp/","http://portal.acm.org/proceedings/lisp/archive/" "Conference Proceedings","LMSA: Leadership and Management in Software Architecture","","","","2008 (May 2008)","2009 (May 2009)","http://portal.acm.org/proceedings/lmsa/","http://portal.acm.org/proceedings/lmsa/archive/" "Conference Proceedings","LOCWEB: Location and the Web","","","","2008 (April 2008)","2010 (November 2010)","http://portal.acm.org/proceedings/locweb/","http://portal.acm.org/proceedings/locweb/archive/" "Conference Proceedings","LS-MMRM: Large-Scale Multimedia Retrieval and Mining","","","","2009 (October 2009)","2009 (October 2009)","http://portal.acm.org/proceedings/ls-mmrm/","http://portal.acm.org/proceedings/ls-mmrm/archive/" "Conference Proceedings","LSAD: Large-Scale Attack Defense","","","","2006 (September 2006)","2007 (August 2007)","http://portal.acm.org/proceedings/lsad/","http://portal.acm.org/proceedings/lsad/archive/" "Conference Proceedings","LSAP: Large-scale System and Application Performance","","","","2009 (June 2009)","2011 (June 2011)","http://portal.acm.org/proceedings/lsap/","http://portal.acm.org/proceedings/lsap/archive/" "Conference Proceedings","LSDS-IR: Large-Scale Distributed Systems for Information Retrieval","","","","2008 (October 2008)","2011 (October 2011)","http://portal.acm.org/proceedings/lsds-ir/","http://portal.acm.org/proceedings/lsds-ir/archive/" "Conference Proceedings","LUV: LISP Users and Vendors","","","","1992 (August 1992)","1995 (August 1994)","http://portal.acm.org/proceedings/luv/","http://portal.acm.org/proceedings/luv/archive/" "Conference Proceedings","LinkKDD: Link Discovery","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/linkkdd/","http://portal.acm.org/proceedings/linkkdd/archive/" "Conference Proceedings","M-MPAC: Middleware for Pervasive Mobile and Embedded Computing","","","","2009 (November 2009)","2011 (December 2011)","http://portal.acm.org/proceedings/m-mpac/","http://portal.acm.org/proceedings/m-mpac/archive/" "Conference Proceedings","MACS: Modeling and Analysis of Concerns in Software","","","","2005 (May 2005)","2005 (May 2005)","http://portal.acm.org/proceedings/macs/","http://portal.acm.org/proceedings/macs/archive/" "Conference Proceedings","MAI: Middleware Application Interaction","","","","2007 (March 2007)","2009 (June 2009)","http://portal.acm.org/proceedings/mai/","http://portal.acm.org/proceedings/mai/archive/" "Conference Proceedings","MASPEGHI: MechAnisms for SPEcialization, Generalization and inHerItance","","","","2010 (June 2010)","2013 (July 2013)","http://portal.acm.org/proceedings/maspeghi/","http://portal.acm.org/proceedings/maspeghi/archive/" "Conference Proceedings","MAW: Memory Access on Future Processors","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/maw/","http://portal.acm.org/proceedings/maw/archive/" "Conference Proceedings","MB: Methods and Techniques in Behavioral Research","","","","2010 (August 2010)","2010 (August 2010)","http://portal.acm.org/proceedings/mb/","http://portal.acm.org/proceedings/mb/archive/" "Conference Proceedings","MC: Middleware Companion","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/mc/","http://portal.acm.org/proceedings/mc/archive/" "Conference Proceedings","MCMC: Mobile Cloud Media Computing","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/mcmc/","http://portal.acm.org/proceedings/mcmc/archive/" "Conference Proceedings","MCPS: Contents Proctection and Security","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/mcps/","http://portal.acm.org/proceedings/mcps/archive/" "Conference Proceedings","MCS: Mobile Cloud Computing and Services","","","","2010 (June 2010)","2013 (December 2013)","http://portal.acm.org/proceedings/mcs/","http://portal.acm.org/proceedings/mcs/archive/" "Conference Proceedings","MD: Massive Datasets","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/md/","http://portal.acm.org/proceedings/md/archive/" "Conference Proceedings","MDAC: Massive Data Analytics on the Cloud","","","","2010 (April 2010)","2010 (April 2010)","http://portal.acm.org/proceedings/mdac/","http://portal.acm.org/proceedings/mdac/archive/" "Conference Proceedings","MDI: Model-Drive Interoperability","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/mdi/","http://portal.acm.org/proceedings/mdi/archive/" "Conference Proceedings","MDM: Mobile Data Management","","","","2005 (May 2005)","2010 (May 2010)","http://portal.acm.org/proceedings/mdm/","http://portal.acm.org/proceedings/mdm/archive/" "Conference Proceedings","MDMKDD: Multimedia Data Mining","","","","2010 (July 2010)","2012 (August 2012)","http://portal.acm.org/proceedings/mdmkdd/","http://portal.acm.org/proceedings/mdmkdd/archive/" "Conference Proceedings","MDS: Middleware Doctoral Symposium","","","","2006 (November 2006)","2013 (December 2013)","http://portal.acm.org/proceedings/mds/","http://portal.acm.org/proceedings/mds/archive/" "Conference Proceedings","MEDEA: Memory Performance: Dealing with Applications, Systems and Architecture","","","","2003 (September 2003)","2009 (September 2009)","http://portal.acm.org/proceedings/medea/","http://portal.acm.org/proceedings/medea/archive/" "Conference Proceedings","MEDES: Management of Emergent Digital EcoSystems","","","","2009 (October 2009)","2013 (October 2013)","http://portal.acm.org/proceedings/medes/","http://portal.acm.org/proceedings/medes/archive/" "Conference Proceedings","MELT: Mobile Entity Localization and Tracking in GPS-Less Environment","","","","2008 (September 2008)","2008 (September 2008)","http://portal.acm.org/proceedings/melt/","http://portal.acm.org/proceedings/melt/archive/" "Conference Proceedings","MEMOCODE: Formal Methods and Models for Co-Design","","","","2005 (July 2005)","2007 (May 2007)","http://portal.acm.org/proceedings/memocode/","http://portal.acm.org/proceedings/memocode/archive/" "Conference Proceedings","MERLIN: Mechanized Reasoning about Languages with Variable Binding","","","","2003 (August 2003)","2005 (September 2005)","http://portal.acm.org/proceedings/merlin/","http://portal.acm.org/proceedings/merlin/archive/" "Conference Proceedings","MG: Mardi Gras Conference","","","","2008 (January 2008)","2008 (January 2008)","http://portal.acm.org/proceedings/mg/","http://portal.acm.org/proceedings/mg/archive/" "Conference Proceedings","MGC: Middleware for Grids, Clouds and e-Science","","","","2004 (October 2004)","2012 (December 2012)","http://portal.acm.org/proceedings/mgc/","http://portal.acm.org/proceedings/mgc/archive/" "Conference Proceedings","MHC: Multimedia for Human Communication","","","","2005 (November 2005)","2005 (November 2005)","http://portal.acm.org/proceedings/mhc/","http://portal.acm.org/proceedings/mhc/archive/" "Conference Proceedings","MICNET: Mobile Internet Through Cellular Networks","","","","2009 (September 2009)","2009 (September 2009)","http://portal.acm.org/proceedings/micnet/","http://portal.acm.org/proceedings/micnet/archive/" "Conference Proceedings","MICRO: Microarchitecture","","","","1972 (September 1972)","2013 (December 2013)","http://portal.acm.org/proceedings/micro/","http://portal.acm.org/proceedings/micro/archive/" "Conference Proceedings","MIIT: Model Inference In Testing","","","","2010 (July 2010)","2010 (July 2010)","http://portal.acm.org/proceedings/miit/","http://portal.acm.org/proceedings/miit/archive/" "Conference Proceedings","MIR: Multimedia Information Retrieval","","","","2003 (November 2003)","2010 (March 2010)","http://portal.acm.org/proceedings/mir/","http://portal.acm.org/proceedings/mir/archive/" "Conference Proceedings","MIS: Metainformatics","","","","2005 (November 2005)","2005 (November 2005)","http://portal.acm.org/proceedings/mis/","http://portal.acm.org/proceedings/mis/archive/" "Conference Proceedings","MISE: Modeling in Software Engineering","","","","2007 (May 2007)","2009 (May 2009)","http://portal.acm.org/proceedings/mise/","http://portal.acm.org/proceedings/mise/archive/" "Conference Proceedings","ML: ML","","","","2006 (September 2006)","2009 (August 2009)","http://portal.acm.org/proceedings/ml/","http://portal.acm.org/proceedings/ml/archive/" "Conference Proceedings","MLG: Mining and Learning with Graphs","","","","2010 (July 2010)","2010 (July 2010)","http://portal.acm.org/proceedings/mlg/","http://portal.acm.org/proceedings/mlg/archive/" "Conference Proceedings","MLPA: Modules and Libraries for Proof Assistants","","","","2009 (August 2009)","2009 (August 2009)","http://portal.acm.org/proceedings/mlpa/","http://portal.acm.org/proceedings/mlpa/archive/" "Conference Proceedings","MMDB: Multimedia Databases","","","","2003 (November 2003)","2004 (November 2004)","http://portal.acm.org/proceedings/mmdb/","http://portal.acm.org/proceedings/mmdb/archive/" "Conference Proceedings","MML: Machine Learning and Music","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/mml/","http://portal.acm.org/proceedings/mml/archive/" "Conference Proceedings","MMSEC: Multimedia and Security","","","","2001 (October 2001)","2013 (June 2013)","http://portal.acm.org/proceedings/mmsec/","http://portal.acm.org/proceedings/mmsec/archive/" "Conference Proceedings","MMSys: Multimedia Systems","","","","2010 (February 2010)","2013 (February 2013)","http://portal.acm.org/proceedings/mmsys/","http://portal.acm.org/proceedings/mmsys/archive/" "Conference Proceedings","MNCNA: Middleware for Next-Generation Converged Networks and Applications","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/mncna/","http://portal.acm.org/proceedings/mncna/archive/" "Conference Proceedings","MOBILWARE: Mobile Wireless Middleware, Operating Systems, and Applications","","","","2007 (February 2008)","2007 (February 2008)","http://portal.acm.org/proceedings/mobilware/","http://portal.acm.org/proceedings/mobilware/archive/" "Conference Proceedings","MOCR: Multilingual OCR","","","","2009 (July 2009)","2013 (August 2013)","http://portal.acm.org/proceedings/mocr/","http://portal.acm.org/proceedings/mocr/archive/" "Conference Proceedings","MODDM: Model Driven Development for Middleware","","","","2006 (November 2006)","2006 (November 2006)","http://portal.acm.org/proceedings/moddm/","http://portal.acm.org/proceedings/moddm/archive/" "Conference Proceedings","MOMPES: Model-Based Methodologies for Pervasive and Embedded Software","","","","2010 (September 2010)","2010 (September 2010)","http://portal.acm.org/proceedings/mompes/","http://portal.acm.org/proceedings/mompes/archive/" "Conference Proceedings","MPAC: Middleware for Pervasive and Ad-Hoc Computing","","","","2004 (October 2004)","2008 (December 2008)","http://portal.acm.org/proceedings/mpac/","http://portal.acm.org/proceedings/mpac/archive/" "Conference Proceedings","MPEC: Models and Processes for the Evaluation of Off-the-Shelf Components","","","","2005 (May 2005)","2005 (May 2005)","http://portal.acm.org/proceedings/mpec/","http://portal.acm.org/proceedings/mpec/archive/" "Conference Proceedings","MPVA: Multimodal Pervasive Video Analysis","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/mpva/","http://portal.acm.org/proceedings/mpva/archive/" "Conference Proceedings","MRDM: Multi-Relational Mining","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/mrdm/","http://portal.acm.org/proceedings/mrdm/archive/" "Conference Proceedings","MS: Multimedia Semantics","","","","2007 (September 2007)","2008 (October 2008)","http://portal.acm.org/proceedings/ms/","http://portal.acm.org/proceedings/ms/archive/" "Conference Proceedings","MSC: Multimedia Service Composition","","","","2005 (November 2005)","2005 (November 2005)","http://portal.acm.org/proceedings/msc/","http://portal.acm.org/proceedings/msc/archive/" "Conference Proceedings","MSFP: Mathematically Structured Functional Programming","","","","2010 (September 2010)","2010 (September 2010)","http://portal.acm.org/proceedings/msfp/","http://portal.acm.org/proceedings/msfp/archive/" "Conference Proceedings","MSIADU: Media Studies and Implementations that Help Improving Access to Disabled Users","","","","2009 (October 2009)","2009 (October 2009)","http://portal.acm.org/proceedings/msiadu/","http://portal.acm.org/proceedings/msiadu/archive/" "Conference Proceedings","MSM: Modeling Social Media","","","","2010 (June 2010)","2013 (May 2013)","http://portal.acm.org/proceedings/msm/","http://portal.acm.org/proceedings/msm/archive/" "Conference Proceedings","MSPC: Memory System Performance and Correctness","","","","2002 (June 2002)","2012 (June 2012)","http://portal.acm.org/proceedings/mspc/","http://portal.acm.org/proceedings/mspc/archive/" "Conference Proceedings","MSR: Mining Software Repositories","","","","2005 (May 2005)","2011 (May 2011)","http://portal.acm.org/proceedings/msr/","http://portal.acm.org/proceedings/msr/archive/" "Conference Proceedings","MSWiM: Modeling, Analysis and Simulation of Wireless and Mobile Systems","","","","1999 (August 1999)","2013 (November 2013)","http://portal.acm.org/proceedings/mswim/","http://portal.acm.org/proceedings/mswim/archive/" "Conference Proceedings","MTAGS: Many-Task Computing on Grids and Supercomputers","","","","2009 (November 2009)","2011 (November 2011)","http://portal.acm.org/proceedings/mtags/","http://portal.acm.org/proceedings/mtags/archive/" "Conference Proceedings","MTDL: Multimedia Technologies for Distance Learning","","","","2009 (October 2009)","2011 (December 2011)","http://portal.acm.org/proceedings/mtdl/","http://portal.acm.org/proceedings/mtdl/archive/" "Conference Proceedings","MUCS: Managing Ubiquitous Communications and Services","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/mucs/","http://portal.acm.org/proceedings/mucs/archive/" "Conference Proceedings","MULTIMEDIA: Multimedia","","","","1993 (September 1993)","2013 (October 2013)","http://portal.acm.org/proceedings/multimedia/","http://portal.acm.org/proceedings/multimedia/archive/" "Conference Proceedings","MUM: Mobile and Ubiquitous Multimedia","","","","2004 (October 2004)","2012 (December 2012)","http://portal.acm.org/proceedings/mum/","http://portal.acm.org/proceedings/mum/archive/" "Conference Proceedings","MV: Mobile Video","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/mv/","http://portal.acm.org/proceedings/mv/archive/" "Conference Proceedings","MW: Multimedia Middleware","","","","2001 (October 2001)","2012 (September 2012)","http://portal.acm.org/proceedings/mw/","http://portal.acm.org/proceedings/mw/archive/" "Conference Proceedings","MWSOC: Middleware for Service Oriented Computing","","","","2006 (November 2006)","2011 (December 2011)","http://portal.acm.org/proceedings/mwsoc/","http://portal.acm.org/proceedings/mwsoc/archive/" "Conference Proceedings","MetriSec: Security Measurements and Metrics","","","","2010 (September 2010)","2012 (September 2012)","http://portal.acm.org/proceedings/metrisec/","http://portal.acm.org/proceedings/metrisec/archive/" "Conference Proceedings","MiFor: Multimedia in Forensics","","","","2009 (October 2009)","2011 (November 2011)","http://portal.acm.org/proceedings/mifor/","http://portal.acm.org/proceedings/mifor/archive/" "Conference Proceedings","MiNEMA: Middleware for Network Eccentric and Mobile Applications","","","","2008 (April 2008)","2008 (April 2008)","http://portal.acm.org/proceedings/minema/","http://portal.acm.org/proceedings/minema/archive/" "Conference Proceedings","MiSE: Models in Software Engineering","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/mise/","http://portal.acm.org/proceedings/mise/archive/" "Conference Proceedings","MidSec: Middleware Security","","","","2008 (December 2008)","2008 (December 2008)","http://portal.acm.org/proceedings/midsec/","http://portal.acm.org/proceedings/midsec/archive/" "Conference Proceedings","MidSens: Middleware Tools, Services and Run-Time Support for Sensor Networks","","","","2006 (November 2006)","2012 (December 2012)","http://portal.acm.org/proceedings/midsens/","http://portal.acm.org/proceedings/midsens/archive/" "Conference Proceedings","Middleware Industrial Track: Middleware Industrial Track","","","","2010 (November 2010)","2013 (December 2013)","http://portal.acm.org/proceedings/middlewareindustrialtrack/","http://portal.acm.org/proceedings/middlewareindustrialtrack/archive/" "Conference Proceedings","Middleware: Middleware","","","","2000 (April 2000)","2012 (December 2012)","http://portal.acm.org/proceedings/middleware/","http://portal.acm.org/proceedings/middleware/archive/" "Conference Proceedings","MindTrek: Entertainment and Media in the Ubiquitous Era","","","","2008 (October 2008)","2013 (October 2013)","http://portal.acm.org/proceedings/mindtrek/","http://portal.acm.org/proceedings/mindtrek/archive/" "Conference Proceedings","MineNet: Mining Network Data","","","","2005 (August 2005)","2007 (June 2007)","http://portal.acm.org/proceedings/minenet/","http://portal.acm.org/proceedings/minenet/archive/" "Conference Proceedings","MoDELS: Models in software engineering","","","","2005 (October 2005)","2012 (September 2012)","http://portal.acm.org/proceedings/models/","http://portal.acm.org/proceedings/models/archive/" "Conference Proceedings","MoDeVVa: Model-Driven Engineering, Verification and Validation","","","","2009 (October 2009)","2012 (October 2012)","http://portal.acm.org/proceedings/modevva/","http://portal.acm.org/proceedings/modevva/archive/" "Conference Proceedings","MoMM: Mobile Computing and Multimedia","","","","2008 (November 2008)","2012 (December 2012)","http://portal.acm.org/proceedings/momm/","http://portal.acm.org/proceedings/momm/archive/" "Conference Proceedings","MoMeTools: Models, Methods and Tools for Reproducible Network Research","","","","2003 (August 2003)","2003 (August 2003)","http://portal.acm.org/proceedings/mometools/","http://portal.acm.org/proceedings/mometools/archive/" "Conference Proceedings","MoSE+DQS: Model Driven Service Engineering and Data Quality and Security","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/mose+dqs/","http://portal.acm.org/proceedings/mose+dqs/archive/" "Conference Proceedings","MoViD: Mobile Video Delivery","","","","2010 (October 2010)","2013 (February 2013)","http://portal.acm.org/proceedings/movid/","http://portal.acm.org/proceedings/movid/archive/" "Conference Proceedings","MobConQoE: Mobile Content Quality of Experience","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/mobconqoe/","http://portal.acm.org/proceedings/mobconqoe/archive/" "Conference Proceedings","MobMid: Mobile Middleware","","","","2008 (December 2008)","2008 (December 2008)","http://portal.acm.org/proceedings/mobmid/","http://portal.acm.org/proceedings/mobmid/archive/" "Conference Proceedings","MobiArch: Mobility in the Evolving Internet Architecture","","","","2006 (December 2006)","2013 (October 2013)","http://portal.acm.org/proceedings/mobiarch/","http://portal.acm.org/proceedings/mobiarch/archive/" "Conference Proceedings","MobiCom: Mobile Computing","","","","1995 (December 1995)","2013 (September 2013)","http://portal.acm.org/proceedings/mobicom/","http://portal.acm.org/proceedings/mobicom/archive/" "Conference Proceedings","MobiDE: Data Engineering for Wireless and Mobile Access","","","","1999 (August 1999)","2013 (June 2013)","http://portal.acm.org/proceedings/mobide/","http://portal.acm.org/proceedings/mobide/archive/" "Conference Proceedings","MobiEval: System Evaluation for Mobile Platforms","","","","2007 (June 2007)","2007 (June 2007)","http://portal.acm.org/proceedings/mobieval/","http://portal.acm.org/proceedings/mobieval/archive/" "Conference Proceedings","MobiHeld: Networking, Systems, and Applications for Mobile Handhelds","","","","2009 (August 2009)","2011 (October 2011)","http://portal.acm.org/proceedings/mobiheld/","http://portal.acm.org/proceedings/mobiheld/archive/" "Conference Proceedings","MobiHoc: Mobile Ad Hoc Networking and Computing","","","","2000 (November 2000)","2013 (July 2013)","http://portal.acm.org/proceedings/mobihoc/","http://portal.acm.org/proceedings/mobihoc/archive/" "Conference Proceedings","MobiMedia: Mobile Multimedia Communications","","","","2006 (September 2006)","2007 (August 2007)","http://portal.acm.org/proceedings/mobimedia/","http://portal.acm.org/proceedings/mobimedia/archive/" "Conference Proceedings","MobiOpp: Mobile Opportunistic Networking","","","","2007 (June 2007)","2012 (March 2012)","http://portal.acm.org/proceedings/mobiopp/","http://portal.acm.org/proceedings/mobiopp/archive/" "Conference Proceedings","MobiShare: Decentralized Resource Sharing in Mobile Computing and Networking","","","","2006 (September 2006)","2006 (September 2006)","http://portal.acm.org/proceedings/mobishare/","http://portal.acm.org/proceedings/mobishare/archive/" "Conference Proceedings","MobiSys: Mobile Systems, Applications, and Services","","","","2003 (May 2003)","2013 (June 2013)","http://portal.acm.org/proceedings/mobisys/","http://portal.acm.org/proceedings/mobisys/archive/" "Conference Proceedings","MobiVirt: Virtualization in Mobile Computing","","","","2008 (June 2008)","2008 (June 2008)","http://portal.acm.org/proceedings/mobivirt/","http://portal.acm.org/proceedings/mobivirt/archive/" "Conference Proceedings","MobiWac: Mobility Management and Wireless Access","","","","2002 (October 2002)","2013 (November 2013)","http://portal.acm.org/proceedings/mobiwac/","http://portal.acm.org/proceedings/mobiwac/archive/" "Conference Proceedings","MobileHCI: Human Computer Interaction with Mobile Devices and Services","","","","2005 (September 2005)","2013 (August 2013)","http://portal.acm.org/proceedings/mobilehci/","http://portal.acm.org/proceedings/mobilehci/archive/" "Conference Proceedings","Mobility: Mobile Technology, Applications, and Systems","","","","2006 (October 2006)","2009 (September 2009)","http://portal.acm.org/proceedings/mobility/","http://portal.acm.org/proceedings/mobility/archive/" "Conference Proceedings","MobilityModels: Mobility Models","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/mobilitymodels/","http://portal.acm.org/proceedings/mobilitymodels/archive/" "Conference Proceedings","NAOMI: Next Generation Aspect Oriented Middleware","","","","2008 (April 2008)","2008 (April 2008)","http://portal.acm.org/proceedings/naomi/","http://portal.acm.org/proceedings/naomi/archive/" "Conference Proceedings","NDA: Network Data Anonymization","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/nda/","http://portal.acm.org/proceedings/nda/archive/" "Conference Proceedings","NETFLIX: Large-Scale Recommender Systems and the Netflix Prize Competition","","","","2008 (August 2008)","2008 (August 2008)","http://portal.acm.org/proceedings/netflix/","http://portal.acm.org/proceedings/netflix/archive/" "Conference Proceedings","NICELI: Network-I/O Convergence","","","","2003 (August 2003)","2003 (August 2003)","http://portal.acm.org/proceedings/niceli/","http://portal.acm.org/proceedings/niceli/archive/" "Conference Proceedings","NIME: New Interfaces for Musical Expression","","","","2007 (June 2007)","2007 (June 2007)","http://portal.acm.org/proceedings/nime/","http://portal.acm.org/proceedings/nime/archive/" "Conference Proceedings","NOSSDAV: Network and Operating Systems Support for Digital Audio and Video","","","","2001 (January 2001)","2013 (February 2013)","http://portal.acm.org/proceedings/nossdav/","http://portal.acm.org/proceedings/nossdav/archive/" "Conference Proceedings","NOTERE: New Technologies in Distributed Systems","","","","2008 (June 2008)","2008 (June 2008)","http://portal.acm.org/proceedings/notere/","http://portal.acm.org/proceedings/notere/archive/" "Conference Proceedings","NPAR: Non-Photorealistic Animation and Rendering","","","","2000 (June 2000)","2013 (July 2013)","http://portal.acm.org/proceedings/npar/","http://portal.acm.org/proceedings/npar/archive/" "Conference Proceedings","NPIV: New Paradigms in Information Visualization and Manipulation","","","","1997 (November 1997)","1998 (November 1998)","http://portal.acm.org/proceedings/npiv/","http://portal.acm.org/proceedings/npiv/archive/" "Conference Proceedings","NPIVM: NPIVM","","","","1999 (November 1999)","1999 (November 1999)","http://portal.acm.org/proceedings/npivm/","http://portal.acm.org/proceedings/npivm/archive/" "Conference Proceedings","NRBC: Next-Generation Residential Broadband Challenges","","","","2004 (October 2004)","2004 (October 2004)","http://portal.acm.org/proceedings/nrbc/","http://portal.acm.org/proceedings/nrbc/archive/" "Conference Proceedings","NSDI: Networked Systems Design & Implementation ","","","","2005 (May 2005)","2011 (March 2011)","http://portal.acm.org/proceedings/nsdi/","http://portal.acm.org/proceedings/nsdi/archive/" "Conference Proceedings","NSDR: Networked Systems for Developing Regions","","","","2007 (August 2007)","2011 (June 2011)","http://portal.acm.org/proceedings/nsdr/","http://portal.acm.org/proceedings/nsdr/archive/" "Conference Proceedings","NSEC: National Software Engineering Conference","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/nsec/","http://portal.acm.org/proceedings/nsec/archive/" "Conference Proceedings","NSPW: New Security Paradigms and Workshop","","","","1993 (August 1993)","2013 (December 2013)","http://portal.acm.org/proceedings/nspw/","http://portal.acm.org/proceedings/nspw/archive/" "Conference Proceedings","Nanoarch: Nanoscale Architectures","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/nanoarch/","http://portal.acm.org/proceedings/nanoarch/archive/" "Conference Proceedings","NetEcon: Economics of Networked Systems","","","","2008 (August 2008)","2010 (October 2010)","http://portal.acm.org/proceedings/netecon/","http://portal.acm.org/proceedings/netecon/archive/" "Conference Proceedings","NetGames: Network and Systems Support for Games","","","","2002 (April 2002)","2012 (November 2012)","http://portal.acm.org/proceedings/netgames/","http://portal.acm.org/proceedings/netgames/archive/" "Conference Proceedings","NetT: Network Troubleshooting","","","","2004 (September 2004)","2004 (September 2004)","http://portal.acm.org/proceedings/nett/","http://portal.acm.org/proceedings/nett/archive/" "Conference Proceedings","NoCArc: Network on Chip Architectures","","","","2009 (December 2009)","2013 (December 2013)","http://portal.acm.org/proceedings/nocarc/","http://portal.acm.org/proceedings/nocarc/archive/" "Conference Proceedings","NordiCHI: Nordic Conference on Human-Computer Interaction","","","","2002 (October 2002)","2012 (October 2012)","http://portal.acm.org/proceedings/nordichi/","http://portal.acm.org/proceedings/nordichi/archive/" "Conference Proceedings","OBI: Ontology-supported Business Intelligence","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/obi/","http://portal.acm.org/proceedings/obi/archive/" "Conference Proceedings","OM: Optimization of Middleware and Distributed Systems","","","","2001 (August 2001)","2001 (August 2001)","http://portal.acm.org/proceedings/om/","http://portal.acm.org/proceedings/om/archive/" "Conference Proceedings","ONISW: Ontologies and Information Systems for the Semantic Web","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/onisw/","http://portal.acm.org/proceedings/onisw/archive/" "Conference Proceedings","OODS: Object-Oriented Database Systems","","","","1986 (September 1986)","1986 (September 1986)","http://portal.acm.org/proceedings/oods/","http://portal.acm.org/proceedings/oods/archive/" "Conference Proceedings","OOPWORK: OOPWORK","","","","1986 (June 1986)","1986 (June 1986)","http://portal.acm.org/proceedings/oopwork/","http://portal.acm.org/proceedings/oopwork/archive/" "Conference Proceedings","OSDI: Operating Systems Design and Implementation","","","","1994 (November 1994)","2012 (October 2012)","http://portal.acm.org/proceedings/osdi/","http://portal.acm.org/proceedings/osdi/archive/" "Conference Proceedings","OSDM: Open Source Data Mining","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/osdm/","http://portal.acm.org/proceedings/osdm/archive/" "Conference Proceedings","OZCHI: Australian Computer-Human Interaction Special Interest Group: Design","","","","2006 (November 2006)","2012 (November 2012)","http://portal.acm.org/proceedings/ozchi/","http://portal.acm.org/proceedings/ozchi/archive/" "Conference Proceedings","P2PECON: Economics of Peer-to-Peer Systems","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/p2pecon/","http://portal.acm.org/proceedings/p2pecon/archive/" "Conference Proceedings","P2PIR: PPIR","","","","2005 (November 2005)","2006 (November 2006)","http://portal.acm.org/proceedings/p2pir/","http://portal.acm.org/proceedings/p2pir/archive/" "Conference Proceedings","PACT: Parallel Architectures and Compilation Techniques","","","","1993 (January 1993)","2013 (October 2013)","http://portal.acm.org/proceedings/pact/","http://portal.acm.org/proceedings/pact/archive/" "Conference Proceedings","PADD: Parallel and Distributed Debugging","","","","1988 (November 1988)","1993 (December 1993)","http://portal.acm.org/proceedings/padd/","http://portal.acm.org/proceedings/padd/archive/" "Conference Proceedings","PADS: Principles of Advanced and Distributed Simulation","","","","1993 (July 1993)","2013 (May 2013)","http://portal.acm.org/proceedings/pads/","http://portal.acm.org/proceedings/pads/archive/" "Conference Proceedings","PADTAD: Parallel and Distributed Systems: Testing, Analysis, and Debugging","","","","2006 (July 2006)","2012 (July 2012)","http://portal.acm.org/proceedings/padtad/","http://portal.acm.org/proceedings/padtad/archive/" "Conference Proceedings","PAIS: Privacy and Anonymity in Information Society","","","","2008 (March 2008)","2011 (March 2011)","http://portal.acm.org/proceedings/pais/","http://portal.acm.org/proceedings/pais/archive/" "Conference Proceedings","PASCO: Parallel Symbolic Computation","","","","1997 (July 1997)","2010 (July 2010)","http://portal.acm.org/proceedings/pasco/","http://portal.acm.org/proceedings/pasco/archive/" "Conference Proceedings","PASTE: Program Analysis for Software Tools and Engineering","","","","1998 (July 1998)","2013 (June 2013)","http://portal.acm.org/proceedings/paste/","http://portal.acm.org/proceedings/paste/archive/" "Conference Proceedings","PAVLAD: Privacy and Anonymity for Very Large Databases","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/pavlad/","http://portal.acm.org/proceedings/pavlad/archive/" "Conference Proceedings","PCAR: Practical Cognitive Agents and Robots","","","","2006 (November 2006)","2010 (May 2010)","http://portal.acm.org/proceedings/pcar/","http://portal.acm.org/proceedings/pcar/archive/" "Conference Proceedings","PCGames: Procedural Content Generation in Games","","","","2010 (June 2010)","2011 (June 2011)","http://portal.acm.org/proceedings/pcgames/","http://portal.acm.org/proceedings/pcgames/archive/" "Conference Proceedings","PCK: Principles of Computing & Knowledge","","","","2003 (June 2003)","2003 (June 2003)","http://portal.acm.org/proceedings/pck/","http://portal.acm.org/proceedings/pck/archive/" "Conference Proceedings","PCS: Personal Computer Security","","","","1986 (September 1986)","1986 (September 1986)","http://portal.acm.org/proceedings/pcs/","http://portal.acm.org/proceedings/pcs/archive/" "Conference Proceedings","PDC: Participatory Design","","","","2004 (July 2004)","2012 (August 2012)","http://portal.acm.org/proceedings/pdc/","http://portal.acm.org/proceedings/pdc/archive/" "Conference Proceedings","PDSW: Petascale Data Storage","","","","2007 (November 2007)","2013 (November 2013)","http://portal.acm.org/proceedings/pdsw/","http://portal.acm.org/proceedings/pdsw/archive/" "Conference Proceedings","PE-WASUN: Performance Evaluation of Wireless Ad hoc Sensor, and Ubiquitous Networks","","","","2004 (October 2004)","2013 (November 2013)","http://portal.acm.org/proceedings/pe-wasun/","http://portal.acm.org/proceedings/pe-wasun/archive/" "Conference Proceedings","PEICS: Pattern-Driven Engineering of Interactive Computing Systems","","","","2010 (July 2010)","2011 (June 2011)","http://portal.acm.org/proceedings/peics/","http://portal.acm.org/proceedings/peics/archive/" "Conference Proceedings","PEPM: Partial Evaluation and Program Manipulation","","","","1991 (May 1991)","2013 (January 2013)","http://portal.acm.org/proceedings/pepm/","http://portal.acm.org/proceedings/pepm/archive/" "Conference Proceedings","PERFORMANCE: Computer Performance Modelling, Measurement and Evaluation","","","","1980 (May 1980)","1980 (May 1980)","http://portal.acm.org/proceedings/performance/","http://portal.acm.org/proceedings/performance/archive/" "Conference Proceedings","PESOS: Principles of Engineering Service-Oriented Systems","","","","2009 (May 2009)","2011 (May 2011)","http://portal.acm.org/proceedings/pesos/","http://portal.acm.org/proceedings/pesos/archive/" "Conference Proceedings","PETRA: Pervasive Technologies Related to Assistive Environments","","","","2008 (July 2008)","2013 (May 2013)","http://portal.acm.org/proceedings/petra/","http://portal.acm.org/proceedings/petra/archive/" "Conference Proceedings","PGAS: Partitioned Global Address Space Programing Models","","","","2009 (October 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/pgas/","http://portal.acm.org/proceedings/pgas/archive/" "Conference Proceedings","PIKM: Ph.D. Students in Information and Knowledge Management","","","","2007 (November 2007)","2013 (November 2013)","http://portal.acm.org/proceedings/pikm/","http://portal.acm.org/proceedings/pikm/archive/" "Conference Proceedings","PINS: Practice and Theory of Incentives in Networked Systems","","","","2004 (September 2004)","2004 (September 2004)","http://portal.acm.org/proceedings/pins/","http://portal.acm.org/proceedings/pins/archive/" "Conference Proceedings","PLAS: Programming Languages and Analysis for Security","","","","2006 (June 2006)","2013 (June 2013)","http://portal.acm.org/proceedings/plas/","http://portal.acm.org/proceedings/plas/archive/" "Conference Proceedings","PLATE: Linking Aspect Technology and Evolution","","","","2009 (March 2009)","2009 (March 2009)","http://portal.acm.org/proceedings/plate/","http://portal.acm.org/proceedings/plate/archive/" "Conference Proceedings","PLDI: Programming Language Design and Implementation","","","","1988 (June 1988)","2013 (June 2013)","http://portal.acm.org/proceedings/pldi/","http://portal.acm.org/proceedings/pldi/archive/" "Conference Proceedings","PLEASE: Product Line Approaches in Software Engineering","","","","2010 (May 2010)","2011 (May 2011)","http://portal.acm.org/proceedings/please/","http://portal.acm.org/proceedings/please/archive/" "Conference Proceedings","PLOS: Programming Languages and Operating Systems","","","","2006 (October 2006)","2013 (November 2013)","http://portal.acm.org/proceedings/plos/","http://portal.acm.org/proceedings/plos/archive/" "Conference Proceedings","PLPV: Programming Languages Meets Program Verification","","","","2007 (October 2007)","2013 (January 2013)","http://portal.acm.org/proceedings/plpv/","http://portal.acm.org/proceedings/plpv/archive/" "Conference Proceedings","PLoP: Pattern Languages of Programs","","","","2006 (October 2006)","2010 (August 2009)","http://portal.acm.org/proceedings/plop/","http://portal.acm.org/proceedings/plop/archive/" "Conference Proceedings","PMHWN: Performance Monitoring and Measurement of Heterogenous Wireless and Wired Networks","","","","2006 (October 2006)","2013 (November 2013)","http://portal.acm.org/proceedings/pmhwn/","http://portal.acm.org/proceedings/pmhwn/archive/" "Conference Proceedings","PODC: Principles of Distributed Computing","","","","1982 (August 1982)","2013 (July 2013)","http://portal.acm.org/proceedings/podc/","http://portal.acm.org/proceedings/podc/archive/" "Conference Proceedings","PODS: Principles of Database Systems","","","","1982 (March 1982)","2013 (June 2013)","http://portal.acm.org/proceedings/pods/","http://portal.acm.org/proceedings/pods/archive/" "Conference Proceedings","POMC: Principles of Mobile Computing","","","","2002 (October 2002)","2002 (October 2002)","http://portal.acm.org/proceedings/pomc/","http://portal.acm.org/proceedings/pomc/archive/" "Conference Proceedings","POOSC: Parallel/High-Performance Object-Oriented Scientific Computing","","","","2009 (July 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/poosc/","http://portal.acm.org/proceedings/poosc/archive/" "Conference Proceedings","POPL: Principles of Programming Languages","","","","1973 (October 1973)","2013 (January 2013)","http://portal.acm.org/proceedings/popl/","http://portal.acm.org/proceedings/popl/archive/" "Conference Proceedings","PP-TV: Peer-to-Peer Streaming and IP-TV","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/pp-tv/","http://portal.acm.org/proceedings/pp-tv/archive/" "Conference Proceedings","PPDP: Principles and Practice of Declarative Programming","","","","2000 (September 2000)","2013 (September 2013)","http://portal.acm.org/proceedings/ppdp/","http://portal.acm.org/proceedings/ppdp/archive/" "Conference Proceedings","PPEALS: Parallel Programming: Experience with Applications, Languages and Systems","","","","1988 (January 1988)","1988 (January 1988)","http://portal.acm.org/proceedings/ppeals/","http://portal.acm.org/proceedings/ppeals/archive/" "Conference Proceedings","PPMMS: Peer-to-Peer Multimedia Streaming","","","","2005 (November 2005)","2005 (November 2005)","http://portal.acm.org/proceedings/ppmms/","http://portal.acm.org/proceedings/ppmms/archive/" "Conference Proceedings","PPPJ: Principles and Practice of Programming in Java","","","","2006 (August 2006)","2013 (September 2013)","http://portal.acm.org/proceedings/pppj/","http://portal.acm.org/proceedings/pppj/archive/" "Conference Proceedings","PPoPP: Principles and Practice of Parallel Programming","","","","1990 (February 1990)","2013 (February 2013)","http://portal.acm.org/proceedings/ppopp/","http://portal.acm.org/proceedings/ppopp/archive/" "Conference Proceedings","PRESTO: Programmable Routers for Extensible Services of Tomorrow","","","","2008 (August 2008)","2010 (November 2010)","http://portal.acm.org/proceedings/presto/","http://portal.acm.org/proceedings/presto/archive/" "Conference Proceedings","PROCAMS: Projector Camera Systems","","","","2008 (August 2008)","2008 (August 2008)","http://portal.acm.org/proceedings/procams/","http://portal.acm.org/proceedings/procams/archive/" "Conference Proceedings","PROMISE: Predictor Models in Software Engineering","","","","2005 (May 2005)","2013 (October 2013)","http://portal.acm.org/proceedings/promise/","http://portal.acm.org/proceedings/promise/archive/" "Conference Proceedings","PRS: Parallel Rendering","","","","1993 (November 1993)","1997 (October 1997)","http://portal.acm.org/proceedings/prs/","http://portal.acm.org/proceedings/prs/archive/" "Conference Proceedings","PST: Privacy, Security and Trust","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/pst/","http://portal.acm.org/proceedings/pst/archive/" "Conference Proceedings","PUI: Perceptive User Interfaces","","","","2001 (November 2001)","2001 (November 2001)","http://portal.acm.org/proceedings/pui/","http://portal.acm.org/proceedings/pui/archive/" "Conference Proceedings","PVG: Parallel and Large-Data Visualization and Graphics","","","","2001 (October 2001)","2003 (October 2003)","http://portal.acm.org/proceedings/pvg/","http://portal.acm.org/proceedings/pvg/archive/" "Conference Proceedings","PVGS: Parallel Visualization and Graphics","","","","1999 (October 1999)","1999 (October 1999)","http://portal.acm.org/proceedings/pvgs/","http://portal.acm.org/proceedings/pvgs/archive/" "Conference Proceedings","PaIR: Patent Information Retrieval","","","","2008 (October 2008)","2011 (October 2011)","http://portal.acm.org/proceedings/pair/","http://portal.acm.org/proceedings/pair/archive/" "Conference Proceedings","PerMIS: Performance Metrics for Intelligent Systems","","","","2007 (August 2007)","2012 (March 2012)","http://portal.acm.org/proceedings/permis/","http://portal.acm.org/proceedings/permis/archive/" "Conference Proceedings","Persuasive: Persuasive Technology","","","","2009 (April 2009)","2009 (April 2009)","http://portal.acm.org/proceedings/persuasive/","http://portal.acm.org/proceedings/persuasive/archive/" "Conference Proceedings","Ph.D.: EDBT Ph.D. workshop","","","","2008 (March 2008)","2008 (March 2008)","http://portal.acm.org/proceedings/ph.d./","http://portal.acm.org/proceedings/ph.d./archive/" "Conference Proceedings","QSWinet: Quality of Service and Security for Wireless in Mobile Networks","","","","2005 (October 2005)","2012 (October 2012)","http://portal.acm.org/proceedings/qswinet/","http://portal.acm.org/proceedings/qswinet/archive/" "Conference Proceedings","QShine: Heterogeneous Networking for Quality, Reliability, Security and Robustness","","","","2006 (August 2006)","2008 (July 2008)","http://portal.acm.org/proceedings/qshine/","http://portal.acm.org/proceedings/qshine/archive/" "Conference Proceedings","QTNA: Queueing Theory and Network Applications","","","","2009 (July 2009)","2011 (August 2011)","http://portal.acm.org/proceedings/qtna/","http://portal.acm.org/proceedings/qtna/archive/" "Conference Proceedings","QUASOSS: Quality of Service-Oriented Software Systems","","","","2009 (August 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/quasoss/","http://portal.acm.org/proceedings/quasoss/archive/" "Conference Proceedings","QUOVADIS: Quantitative Stochastic Models in the Verification and Design of Software Systems","","","","2010 (May 2010)","2010 (May 2010)","http://portal.acm.org/proceedings/quovadis/","http://portal.acm.org/proceedings/quovadis/archive/" "Conference Proceedings","QUTE-SWAP: Quantitative Techniques for Software Agile Process","","","","2004 (November 2004)","2004 (November 2004)","http://portal.acm.org/proceedings/qute-swap/","http://portal.acm.org/proceedings/qute-swap/archive/" "Conference Proceedings","QoP: Quality of Protection","","","","2006 (October 2006)","2008 (October 2008)","http://portal.acm.org/proceedings/qop/","http://portal.acm.org/proceedings/qop/archive/" "Conference Proceedings","RAM-SE: Reflection, AOP and Meta-Data for Software Evolution","","","","2009 (July 2009)","2012 (June 2012)","http://portal.acm.org/proceedings/ram-se/","http://portal.acm.org/proceedings/ram-se/archive/" "Conference Proceedings","RAOOL: Relationships and Associations in Object-Oriented Languages","","","","2009 (July 2009)","2009 (July 2009)","http://portal.acm.org/proceedings/raool/","http://portal.acm.org/proceedings/raool/archive/" "Conference Proceedings","RBAC: Role-Based Access Control","","","","1996 (December 1996)","2000 (July 2000)","http://portal.acm.org/proceedings/rbac/","http://portal.acm.org/proceedings/rbac/archive/" "Conference Proceedings","REALMAN: Multi-Hop Ad Hoc Networks","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/realman/","http://portal.acm.org/proceedings/realman/archive/" "Conference Proceedings","REALWSN: Real-world Wireless Sensor Networks","","","","2008 (April 2008)","2008 (April 2008)","http://portal.acm.org/proceedings/realwsn/","http://portal.acm.org/proceedings/realwsn/archive/" "Conference Proceedings","REBSE: Realising Evidence-Based Software Engineering","","","","2005 (May 2005)","2007 (May 2007)","http://portal.acm.org/proceedings/rebse/","http://portal.acm.org/proceedings/rebse/archive/" "Conference Proceedings","RECOMB: Resaerch in Computational Molecular Biology","","","","1997 (January 1997)","2004 (March 2004)","http://portal.acm.org/proceedings/recomb/","http://portal.acm.org/proceedings/recomb/archive/" "Conference Proceedings","RIPQoS: Revisiting IP QoS","","","","2003 (August 2003)","2003 (August 2003)","http://portal.acm.org/proceedings/ripqos/","http://portal.acm.org/proceedings/ripqos/archive/" "Conference Proceedings","RKRAS: Research In Knowledge Representation For Autonomous Systems","","","","2005 (November 2005)","2005 (November 2005)","http://portal.acm.org/proceedings/rkras/","http://portal.acm.org/proceedings/rkras/archive/" "Conference Proceedings","ROA: Role of Abstraction in Software Engineering","","","","2006 (May 2006)","2008 (May 2008)","http://portal.acm.org/proceedings/roa/","http://portal.acm.org/proceedings/roa/archive/" "Conference Proceedings","ROSATEA: Role of Software Architecture for Testing and Analysis","","","","2006 (July 2006)","2006 (July 2006)","http://portal.acm.org/proceedings/rosatea/","http://portal.acm.org/proceedings/rosatea/archive/" "Conference Proceedings","RSSE: Recommendation Systems for Software Engineering","","","","2008 (November 2008)","2010 (May 2010)","http://portal.acm.org/proceedings/rsse/","http://portal.acm.org/proceedings/rsse/archive/" "Conference Proceedings","RT: Randon Testing","","","","2006 (July 2006)","2007 (November 2007)","http://portal.acm.org/proceedings/rt/","http://portal.acm.org/proceedings/rt/archive/" "Conference Proceedings","RULE: Rule-Based Programming","","","","2002 (October 2002)","2002 (October 2002)","http://portal.acm.org/proceedings/rule/","http://portal.acm.org/proceedings/rule/archive/" "Conference Proceedings","ReArch: Re-architecting the Internet","","","","2009 (December 2009)","2010 (November 2010)","http://portal.acm.org/proceedings/rearch/","http://portal.acm.org/proceedings/rearch/archive/" "Conference Proceedings","RecSys: Recommender Systems","","","","2007 (October 2007)","2013 (October 2013)","http://portal.acm.org/proceedings/recsys/","http://portal.acm.org/proceedings/recsys/archive/" "Conference Proceedings","Resilience: Resilience in High Performance","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/resilience/","http://portal.acm.org/proceedings/resilience/archive/" "Conference Proceedings","S&D4RCES: Security and Dependability for Resource Constrained Embedded Systems","","","","2010 (September 2010)","2010 (September 2010)","http://portal.acm.org/proceedings/s&d4rces/","http://portal.acm.org/proceedings/s&d4rces/archive/" "Conference Proceedings","S3: Wireless of the Students, by the Students, for the Students","","","","2008 (February 2008)","2011 (September 2011)","http://portal.acm.org/proceedings/s3/","http://portal.acm.org/proceedings/s3/archive/" "Conference Proceedings","SAC: Symposium on Applied Computing","","","","1986 (October 1986)","2013 (March 2013)","http://portal.acm.org/proceedings/sac/","http://portal.acm.org/proceedings/sac/archive/" "Conference Proceedings","SACLA: Southern African Computer Lecturers' Association","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/sacla/","http://portal.acm.org/proceedings/sacla/archive/" "Conference Proceedings","SACMAT: Symposium on Access Control Models and Technologies","","","","2001 (May 2001)","2013 (June 2013)","http://portal.acm.org/proceedings/sacmat/","http://portal.acm.org/proceedings/sacmat/archive/" "Conference Proceedings","SADPI: Semantically Aware Document Processing and Indexing","","","","2007 (May 2007)","2007 (May 2007)","http://portal.acm.org/proceedings/sadpi/","http://portal.acm.org/proceedings/sadpi/archive/" "Conference Proceedings","SAICSIT: South African Institute of Computer Scientists and Information Technologists","","","","2004 (October 2004)","2013 (October 2013)","http://portal.acm.org/proceedings/saicsit/","http://portal.acm.org/proceedings/saicsit/archive/" "Conference Proceedings","SAM: Software Architectures and Mobility","","","","2008 (May 2008)","2013 (October 2013)","http://portal.acm.org/proceedings/sam/","http://portal.acm.org/proceedings/sam/archive/" "Conference Proceedings","SAME: Semantic Ambient Media Experiences","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/same/","http://portal.acm.org/proceedings/same/archive/" "Conference Proceedings","SANET: Sensor and Actor Networks","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/sanet/","http://portal.acm.org/proceedings/sanet/archive/" "Conference Proceedings","SAPMIA: Social, Adaptive and Personalized Multimedia Interaction and Access","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/sapmia/","http://portal.acm.org/proceedings/sapmia/archive/" "Conference Proceedings","SAS: Static Analysis","","","","2003 (June 2003)","2003 (June 2003)","http://portal.acm.org/proceedings/sas/","http://portal.acm.org/proceedings/sas/archive/" "Conference Proceedings","SASN: Security of Ad hoc and Sensor Networks","","","","2003 (October 2003)","2006 (October 2006)","http://portal.acm.org/proceedings/sasn/","http://portal.acm.org/proceedings/sasn/archive/" "Conference Proceedings","SAVCBS: Specification and Verification of Component-Based Systems","","","","2005 (September 2005)","2009 (August 2009)","http://portal.acm.org/proceedings/savcbs/","http://portal.acm.org/proceedings/savcbs/archive/" "Conference Proceedings","SAW: Static Analysis","","","","2008 (June 2008)","2008 (June 2008)","http://portal.acm.org/proceedings/saw/","http://portal.acm.org/proceedings/saw/archive/" "Conference Proceedings","SBCCI: Symposium on Integrated Circuits and System Design","","","","1998 (January 1998)","2011 (August 2011)","http://portal.acm.org/proceedings/sbcci/","http://portal.acm.org/proceedings/sbcci/archive/" "Conference Proceedings","SBIM: Sketch-Based Interfaces and Modeling","","","","2007 (August 2007)","2013 (July 2013)","http://portal.acm.org/proceedings/sbim/","http://portal.acm.org/proceedings/sbim/archive/" "Conference Proceedings","SC: Supercomputing","","","","1988 (November 1988)","2013 (November 2013)","http://portal.acm.org/proceedings/sc/","http://portal.acm.org/proceedings/sc/archive/" "Conference Proceedings","SCA: Symposium on Computer Animation","","","","2002 (July 2002)","2013 (July 2013)","http://portal.acm.org/proceedings/sca/","http://portal.acm.org/proceedings/sca/archive/" "Conference Proceedings","SCC: Services Computing","","","","2009 (September 2009)","2009 (September 2009)","http://portal.acm.org/proceedings/scc/","http://portal.acm.org/proceedings/scc/archive/" "Conference Proceedings","SCCG: Spring Conference on Computer graphics","","","","2001 (April 2001)","2013 (March 2013)","http://portal.acm.org/proceedings/sccg/","http://portal.acm.org/proceedings/sccg/archive/" "Conference Proceedings","SCE: Summit on Computing Education","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/sce/","http://portal.acm.org/proceedings/sce/archive/" "Conference Proceedings","SCESM: Scenarios and State Machines","","","","2005 (May 2005)","2007 (May 2007)","http://portal.acm.org/proceedings/scesm/","http://portal.acm.org/proceedings/scesm/archive/" "Conference Proceedings","SCM: Software Configuration Management","","","","1989 (October 1989)","2005 (September 2005)","http://portal.acm.org/proceedings/scm/","http://portal.acm.org/proceedings/scm/archive/" "Conference Proceedings","SCN: Simulation of Computer Networks","","","","1987 (August 1987)","1987 (August 1987)","http://portal.acm.org/proceedings/scn/","http://portal.acm.org/proceedings/scn/archive/" "Conference Proceedings","SCOPES: Software and Compilers for Embedded Systems","","","","2005 (September 2005)","2013 (June 2013)","http://portal.acm.org/proceedings/scopes/","http://portal.acm.org/proceedings/scopes/archive/" "Conference Proceedings","SCORE: Software Metrics","","","","1982 (August 1982)","1982 (August 1982)","http://portal.acm.org/proceedings/score/","http://portal.acm.org/proceedings/score/archive/" "Conference Proceedings","SCSC: Summer Computer Simulation Conference","","","","2007 (July 2007)","2013 (July 2013)","http://portal.acm.org/proceedings/scsc/","http://portal.acm.org/proceedings/scsc/archive/" "Conference Proceedings","SDDDM: Dependable Distributed Data Management","","","","2008 (April 2008)","2009 (March 2009)","http://portal.acm.org/proceedings/sdddm/","http://portal.acm.org/proceedings/sdddm/archive/" "Conference Proceedings","SDE: Software Development Environments","","","","1984 (April 1984)","1992 (November 1992)","http://portal.acm.org/proceedings/sde/","http://portal.acm.org/proceedings/sde/archive/" "Conference Proceedings","SDG: Software Development Governance","","","","2008 (May 2008)","2010 (May 2010)","http://portal.acm.org/proceedings/sdg/","http://portal.acm.org/proceedings/sdg/archive/" "Conference Proceedings","SDSOA: Systems Development in SOA Environments","","","","2007 (May 2007)","2008 (May 2008)","http://portal.acm.org/proceedings/sdsoa/","http://portal.acm.org/proceedings/sdsoa/archive/" "Conference Proceedings","SE-HPC: Software Engineering for High Performance Computing Applications","","","","2005 (May 2005)","2007 (May 2007)","http://portal.acm.org/proceedings/se-hpc/","http://portal.acm.org/proceedings/se-hpc/archive/" "Conference Proceedings","SEAMS: Software Engineering for Adaptive and Self-Managing Systems","","","","2006 (May 2006)","2011 (May 2011)","http://portal.acm.org/proceedings/seams/","http://portal.acm.org/proceedings/seams/archive/" "Conference Proceedings","SEAS: Software Engineering for Automotive Systems","","","","2005 (May 2005)","2007 (May 2007)","http://portal.acm.org/proceedings/seas/","http://portal.acm.org/proceedings/seas/archive/" "Conference Proceedings","SECSE: Software Engineering for Computational Science and Engineering","","","","2009 (May 2009)","2011 (May 2011)","http://portal.acm.org/proceedings/secse/","http://portal.acm.org/proceedings/secse/archive/" "Conference Proceedings","SEESE: Software Engineering in East and South Europe","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/seese/","http://portal.acm.org/proceedings/seese/archive/" "Conference Proceedings","SEEUP: Software Engineering Foundations for End User Programming","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/seeup/","http://portal.acm.org/proceedings/seeup/archive/" "Conference Proceedings","SEHC: Software Engineering in Health Care","","","","2009 (May 2009)","2011 (May 2011)","http://portal.acm.org/proceedings/sehc/","http://portal.acm.org/proceedings/sehc/archive/" "Conference Proceedings","SEKE: Software Engineering and Knowledge Engineering","","","","2002 (July 2002)","2002 (July 2002)","http://portal.acm.org/proceedings/seke/","http://portal.acm.org/proceedings/seke/archive/" "Conference Proceedings","SELMAS: Software Engineering for Large-Scale Multi-Agent Systems","","","","2005 (May 2005)","2006 (May 2006)","http://portal.acm.org/proceedings/selmas/","http://portal.acm.org/proceedings/selmas/archive/" "Conference Proceedings","SEM: Software Engineering and Middleware","","","","2005 (September 2005)","2006 (November 2006)","http://portal.acm.org/proceedings/sem/","http://portal.acm.org/proceedings/sem/archive/" "Conference Proceedings","SEMSEARCH: Semantic Search","","","","2010 (April 2010)","2010 (April 2010)","http://portal.acm.org/proceedings/semsearch/","http://portal.acm.org/proceedings/semsearch/archive/" "Conference Proceedings","SEPCASE: Software Engineering for Pervasive Computing Applications, Systems, and Environments","","","","2007 (May 2007)","2007 (May 2007)","http://portal.acm.org/proceedings/sepcase/","http://portal.acm.org/proceedings/sepcase/archive/" "Conference Proceedings","SEPS: Software Engineering for Pervasive Services","","","","2008 (July 2008)","2008 (July 2008)","http://portal.acm.org/proceedings/seps/","http://portal.acm.org/proceedings/seps/archive/" "Conference Proceedings","SERENE: Software Engineering for Resilient Systems","","","","2008 (November 2008)","2008 (November 2008)","http://portal.acm.org/proceedings/serene/","http://portal.acm.org/proceedings/serene/archive/" "Conference Proceedings","SESENA: Software Engineering for Sensor Network Applications","","","","2010 (May 2010)","2011 (May 2011)","http://portal.acm.org/proceedings/sesena/","http://portal.acm.org/proceedings/sesena/archive/" "Conference Proceedings","SESS: Software Engineering for Secure Systems","","","","2005 (May 2005)","2011 (May 2011)","http://portal.acm.org/proceedings/sess/","http://portal.acm.org/proceedings/sess/archive/" "Conference Proceedings","SETA: Symposium on Environments and Tools for Ada","","","","1991 (April 1991)","1994 (September 1994)","http://portal.acm.org/proceedings/seta/","http://portal.acm.org/proceedings/seta/archive/" "Conference Proceedings","SETMDM: Software Engineering for Tailor-Made Data Management","","","","2008 (March 2008)","2008 (March 2008)","http://portal.acm.org/proceedings/setmdm/","http://portal.acm.org/proceedings/setmdm/archive/" "Conference Proceedings","SGP: Symposium on Geometry Processing","","","","2003 (June 2003)","2006 (June 2006)","http://portal.acm.org/proceedings/sgp/","http://portal.acm.org/proceedings/sgp/archive/" "Conference Proceedings","SHARK: Sharing and Reusing Architectural Knowledge","","","","2007 (May 2007)","2011 (May 2011)","http://portal.acm.org/proceedings/shark/","http://portal.acm.org/proceedings/shark/archive/" "Conference Proceedings","SICOSIM: SICOSIM","","","","1972 (October 1972)","1973 (October 1973)","http://portal.acm.org/proceedings/sicosim/","http://portal.acm.org/proceedings/sicosim/archive/" "Conference Proceedings","SIGAda: SIGAda International Conference on Ada","","","","1985 (May 1985)","2011 (November 2011)","http://portal.acm.org/proceedings/sigada/","http://portal.acm.org/proceedings/sigada/archive/" "Conference Proceedings","SIGBDP: SIGBDP Conference on Trends and Directions in Expert Systems","","","","1990 (September 1990)","1990 (September 1990)","http://portal.acm.org/proceedings/sigbdp/","http://portal.acm.org/proceedings/sigbdp/archive/" "Conference Proceedings","SIGCOMM LA: Data Communication in Latin America and the Caribbean","","","","2001 (April 2001)","2001 (April 2001)","http://portal.acm.org/proceedings/sigcommla/","http://portal.acm.org/proceedings/sigcommla/archive/" "Conference Proceedings","SIGCOMM: ACM SIGCOMM","","","","1977 (September 1977)","2013 (August 2013)","http://portal.acm.org/proceedings/sigcomm/","http://portal.acm.org/proceedings/sigcomm/archive/" "Conference Proceedings","SIGCSE: Computer Science Education","","","","1970 (January 1970)","2013 (March 2013)","http://portal.acm.org/proceedings/sigcse/","http://portal.acm.org/proceedings/sigcse/archive/" "Conference Proceedings","SIGDOC: Design of Communication","","","","1982 (January 1982)","2013 (September 2013)","http://portal.acm.org/proceedings/sigdoc/","http://portal.acm.org/proceedings/sigdoc/archive/" "Conference Proceedings","SIGFIDET: Data Description, Access and Control","","","","1970 (November 1970)","1975 (January 1975)","http://portal.acm.org/proceedings/sigfidet/","http://portal.acm.org/proceedings/sigfidet/archive/" "Conference Proceedings","SIGGRAPH Asia: Computer Graphics and Interactive Techniques Conference - Asia","","","","2008 (December 2008)","2013 (November 2013)","http://portal.acm.org/proceedings/siggraphasia/","http://portal.acm.org/proceedings/siggraphasia/archive/" "Conference Proceedings","SIGGRAPH: Computer Graphics and Interactive Techniques Conference","","","","1974 (July 1974)","2013 (July 2013)","http://portal.acm.org/proceedings/siggraph/","http://portal.acm.org/proceedings/siggraph/archive/" "Conference Proceedings","SIGIR: Information Retrieval","","","","1971 (April 1971)","2013 (July 2013)","http://portal.acm.org/proceedings/sigir/","http://portal.acm.org/proceedings/sigir/archive/" "Conference Proceedings","SIGITE: Information Technology Education","","","","2003 (October 2003)","2013 (October 2013)","http://portal.acm.org/proceedings/sigite/","http://portal.acm.org/proceedings/sigite/archive/" "Conference Proceedings","SIGME: SIGME Symposium","","","","1973 (January 1973)","1973 (January 1973)","http://portal.acm.org/proceedings/sigme/","http://portal.acm.org/proceedings/sigme/archive/" "Conference Proceedings","SIGMETRICS: Measurement and Modeling of Computer Systems","","","","1974 (January 1974)","2013 (June 2013)","http://portal.acm.org/proceedings/sigmetrics/","http://portal.acm.org/proceedings/sigmetrics/archive/" "Conference Proceedings","SIGMINI: SIGMINI Symposium on Small Systems","","","","1976 (March 1976)","1978 (August 1978)","http://portal.acm.org/proceedings/sigmini/","http://portal.acm.org/proceedings/sigmini/archive/" "Conference Proceedings","SIGMOD: Management of Data","","","","1975 (May 1975)","2013 (June 2013)","http://portal.acm.org/proceedings/sigmod/","http://portal.acm.org/proceedings/sigmod/archive/" "Conference Proceedings","SIGPLAN: SIGPLAN Symposium","","","","1973 (November 1973)","1987 (July 1987)","http://portal.acm.org/proceedings/sigplan/","http://portal.acm.org/proceedings/sigplan/archive/" "Conference Proceedings","SIGSMALL: SIGSMALL/PC Symposium on Small Systems","","","","1979 (October 1979)","1991 (May 1991)","http://portal.acm.org/proceedings/sigsmall/","http://portal.acm.org/proceedings/sigsmall/archive/" "Conference Proceedings","SIGSOFT: Foundations of Software Engineering","","","","1983 (January 1983)","2012 (November 2012)","http://portal.acm.org/proceedings/sigsoft/","http://portal.acm.org/proceedings/sigsoft/archive/" "Conference Proceedings","SIGUCCS: User Services","","","","1972 (January 1972)","2013 (November 2013)","http://portal.acm.org/proceedings/siguccs/","http://portal.acm.org/proceedings/siguccs/archive/" "Conference Proceedings","SIMPLEX: Simplifying Complex Network for Practitioners","","","","2009 (July 2009)","2012 (April 2012)","http://portal.acm.org/proceedings/simplex/","http://portal.acm.org/proceedings/simplex/archive/" "Conference Proceedings","SIMUTools: Simulation Tools and Techniques","","","","2010 (March 2010)","2013 (March 2013)","http://portal.acm.org/proceedings/simutools/","http://portal.acm.org/proceedings/simutools/archive/" "Conference Proceedings","SIN: Security of Information and Networks","","","","2009 (October 2009)","2012 (October 2012)","http://portal.acm.org/proceedings/sin/","http://portal.acm.org/proceedings/sin/archive/" "Conference Proceedings","SINTER: Software Integration and Evolution at Runtime","","","","2009 (August 2009)","2009 (August 2009)","http://portal.acm.org/proceedings/sinter/","http://portal.acm.org/proceedings/sinter/archive/" "Conference Proceedings","SIPE: Services Integration in Pervasive Environments","","","","2008 (July 2008)","2009 (July 2009)","http://portal.acm.org/proceedings/sipe/","http://portal.acm.org/proceedings/sipe/archive/" "Conference Proceedings","SISAP: Similarity Search and Applications","","","","2008 (April 2008)","2011 (June 2011)","http://portal.acm.org/proceedings/sisap/","http://portal.acm.org/proceedings/sisap/archive/" "Conference Proceedings","SLIP: System Level Interconnect Prediction","","","","2000 (April 2000)","2012 (June 2012)","http://portal.acm.org/proceedings/slip/","http://portal.acm.org/proceedings/slip/archive/" "Conference Proceedings","SLIPE: Symposium on Language Issues in Programming Environments","","","","1985 (June 1985)","1985 (June 1985)","http://portal.acm.org/proceedings/slipe/","http://portal.acm.org/proceedings/slipe/archive/" "Conference Proceedings","SM: Solid Modelling and Applications","","","","1991 (May 1991)","2004 (June 2004)","http://portal.acm.org/proceedings/sm/","http://portal.acm.org/proceedings/sm/archive/" "Conference Proceedings","SMARTGRAPH: Smart Graphics","","","","2002 (June 2002)","2002 (June 2002)","http://portal.acm.org/proceedings/smartgraph/","http://portal.acm.org/proceedings/smartgraph/archive/" "Conference Proceedings","SMCtools: Tools for Solving Structured Markov Chains","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/smctools/","http://portal.acm.org/proceedings/smctools/archive/" "Conference Proceedings","SMT: Satisfiability Modulo Theories","","","","2008 (July 2008)","2009 (August 2009)","http://portal.acm.org/proceedings/smt/","http://portal.acm.org/proceedings/smt/archive/" "Conference Proceedings","SMUC: Search and Mining User-generated Contents","","","","2010 (October 2010)","2011 (October 2011)","http://portal.acm.org/proceedings/smuc/","http://portal.acm.org/proceedings/smuc/archive/" "Conference Proceedings","SMVC: Surreal Media and Virtual Cloning","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/smvc/","http://portal.acm.org/proceedings/smvc/archive/" "Conference Proceedings","SNA-KDD: Social Network Mining and Analysis","","","","2009 (June 2009)","2013 (August 2013)","http://portal.acm.org/proceedings/sna-kdd/","http://portal.acm.org/proceedings/sna-kdd/archive/" "Conference Proceedings","SNAPI: Storage Network Architecture and Parallel I/Os","","","","2003 (September 2003)","2004 (September 2004)","http://portal.acm.org/proceedings/snapi/","http://portal.acm.org/proceedings/snapi/archive/" "Conference Proceedings","SNC: Symbolic-Numeric Computation","","","","2007 (July 2007)","2011 (June 2012)","http://portal.acm.org/proceedings/snc/","http://portal.acm.org/proceedings/snc/archive/" "Conference Proceedings","SNS: Social Network Systems","","","","2010 (April 2010)","2012 (April 2012)","http://portal.acm.org/proceedings/sns/","http://portal.acm.org/proceedings/sns/archive/" "Conference Proceedings","SOAR: Self-organizing Architectures","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/soar/","http://portal.acm.org/proceedings/soar/archive/" "Conference Proceedings","SOCP: Service-oriented Computing Performance","","","","2007 (June 2007)","2007 (June 2007)","http://portal.acm.org/proceedings/socp/","http://portal.acm.org/proceedings/socp/archive/" "Conference Proceedings","SODA: Symposium on Discrete Algorithms","","","","1990 (January 1990)","2012 (January 2012)","http://portal.acm.org/proceedings/soda/","http://portal.acm.org/proceedings/soda/archive/" "Conference Proceedings","SOMITAS: Software Organisation and Monitoring of Ambient Systems","","","","2008 (February 2008)","2008 (February 2008)","http://portal.acm.org/proceedings/somitas/","http://portal.acm.org/proceedings/somitas/archive/" "Conference Proceedings","SOQUA: Software Quality Assurance","","","","2006 (November 2006)","2007 (September 2007)","http://portal.acm.org/proceedings/soqua/","http://portal.acm.org/proceedings/soqua/archive/" "Conference Proceedings","SOSE: Service-Oriented Software Engineering","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/sose/","http://portal.acm.org/proceedings/sose/archive/" "Conference Proceedings","SOSOC: Security in Opportunistic and Social networks","","","","2008 (September 2008)","2008 (September 2008)","http://portal.acm.org/proceedings/sosoc/","http://portal.acm.org/proceedings/sosoc/archive/" "Conference Proceedings","SOSP: Symposium on Operating Systems Principles","","","","1967 (January 1967)","2013 (November 2013)","http://portal.acm.org/proceedings/sosp/","http://portal.acm.org/proceedings/sosp/archive/" "Conference Proceedings","SOUPS: Symposium on Usable Privacy and Security","","","","2005 (July 2005)","2013 (July 2013)","http://portal.acm.org/proceedings/soups/","http://portal.acm.org/proceedings/soups/archive/" "Conference Proceedings","SP: Security and Privacy","","","","1996 (May 1996)","1996 (May 1996)","http://portal.acm.org/proceedings/sp/","http://portal.acm.org/proceedings/sp/archive/" "Conference Proceedings","SPAA: Symposium on Parallelism in Algorithms and Architectures","","","","1989 (March 1989)","2013 (July 2013)","http://portal.acm.org/proceedings/spaa/","http://portal.acm.org/proceedings/spaa/archive/" "Conference Proceedings","SPDT: Parallel and Distributed Tools","","","","1996 (January 1996)","1998 (August 1998)","http://portal.acm.org/proceedings/spdt/","http://portal.acm.org/proceedings/spdt/archive/" "Conference Proceedings","SPIMACS: Security and Privacy in Medical and Home-Care Systems","","","","2009 (November 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/spimacs/","http://portal.acm.org/proceedings/spimacs/archive/" "Conference Proceedings","SPIN: SPIN workshop on Model Checking of Software","","","","2001 (May 2001)","2001 (May 2001)","http://portal.acm.org/proceedings/spin/","http://portal.acm.org/proceedings/spin/archive/" "Conference Proceedings","SPLASH: Object-Oriented Programming Systems, Languages, and Applications","","","","1986 (June 1986)","2013 (October 2013)","http://portal.acm.org/proceedings/splash/","http://portal.acm.org/proceedings/splash/archive/" "Conference Proceedings","SPLAT: Software Engineering Properties of Languages and Aspect Technologies","","","","2007 (March 2007)","2008 (March 2008)","http://portal.acm.org/proceedings/splat/","http://portal.acm.org/proceedings/splat/archive/" "Conference Proceedings","SPM: Geometric and Physical Modeling","","","","2005 (June 2005)","2010 (September 2010)","http://portal.acm.org/proceedings/spm/","http://portal.acm.org/proceedings/spm/archive/" "Conference Proceedings","SPRINGL: Security and Privacy in GIS and LBS","","","","2008 (November 2008)","2011 (November 2011)","http://portal.acm.org/proceedings/springl/","http://portal.acm.org/proceedings/springl/archive/" "Conference Proceedings","SRMC: Story Representation, Mechanism and Context","","","","2004 (October 2004)","2008 (October 2008)","http://portal.acm.org/proceedings/srmc/","http://portal.acm.org/proceedings/srmc/archive/" "Conference Proceedings","SSCS: Searching Spontaneous COnversational Speech","","","","2009 (October 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/sscs/","http://portal.acm.org/proceedings/sscs/archive/" "Conference Proceedings","SSEE: Summit on Software Engineering Eductation","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/ssee/","http://portal.acm.org/proceedings/ssee/archive/" "Conference Proceedings","SSM: Search in Social Media","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/ssm/","http://portal.acm.org/proceedings/ssm/archive/" "Conference Proceedings","SSPS: Scalable Stream Processing System","","","","2008 (March 2008)","2008 (March 2008)","http://portal.acm.org/proceedings/ssps/","http://portal.acm.org/proceedings/ssps/archive/" "Conference Proceedings","SSPW: Social Signal Processing","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/sspw/","http://portal.acm.org/proceedings/sspw/archive/" "Conference Proceedings","SSR: Symposium on Software Reusability","","","","1995 (August 1995)","2001 (May 2001)","http://portal.acm.org/proceedings/ssr/","http://portal.acm.org/proceedings/ssr/archive/" "Conference Proceedings","SSRS: Survivable and Self-Regenerative Systems","","","","2003 (October 2003)","2003 (October 2003)","http://portal.acm.org/proceedings/ssrs/","http://portal.acm.org/proceedings/ssrs/archive/" "Conference Proceedings","STC: Scalable Trusted Computing","","","","2006 (November 2006)","2012 (October 2012)","http://portal.acm.org/proceedings/stc/","http://portal.acm.org/proceedings/stc/archive/" "Conference Proceedings","STOC: Symposium on Theory of Computing","","","","1969 (May 1969)","2013 (June 2013)","http://portal.acm.org/proceedings/stoc/","http://portal.acm.org/proceedings/stoc/archive/" "Conference Proceedings","STOP: Script to Program Evolution","","","","2009 (July 2009)","2009 (July 2009)","http://portal.acm.org/proceedings/stop/","http://portal.acm.org/proceedings/stop/archive/" "Conference Proceedings","STOV: Software Test Output Validation","","","","2010 (July 2010)","2010 (July 2010)","http://portal.acm.org/proceedings/stov/","http://portal.acm.org/proceedings/stov/archive/" "Conference Proceedings","SUITE: Search-driven Development: Users, Infrastructure, Tools and Evaluation","","","","2009 (May 2009)","2011 (May 2011)","http://portal.acm.org/proceedings/suite/","http://portal.acm.org/proceedings/suite/archive/" "Conference Proceedings","SVR: SIGGRAPH Video Review","","","","2001 (August 2001)","2003 (July 2003)","http://portal.acm.org/proceedings/svr/","http://portal.acm.org/proceedings/svr/archive/" "Conference Proceedings","SWS: Secure Web Services","","","","2004 (October 2004)","2009 (November 2009)","http://portal.acm.org/proceedings/sws/","http://portal.acm.org/proceedings/sws/archive/" "Conference Proceedings","SWSM: Social Web Search and Mining","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/swsm/","http://portal.acm.org/proceedings/swsm/archive/" "Conference Proceedings","SYANCO: Synthesis and Analysis of Component Connectors","","","","2007 (September 2007)","2007 (September 2007)","http://portal.acm.org/proceedings/syanco/","http://portal.acm.org/proceedings/syanco/archive/" "Conference Proceedings","SYMSAC: Symposium on Symbolic and Algebraic Computation","","","","1966 (January 1966)","1986 (October 1986)","http://portal.acm.org/proceedings/symsac/","http://portal.acm.org/proceedings/symsac/archive/" "Conference Proceedings","SYSTOR: Experimental Systems Conference","","","","2009 (May 2009)","2013 (June 2013)","http://portal.acm.org/proceedings/systor/","http://portal.acm.org/proceedings/systor/archive/" "Conference Proceedings","SafeConfig: Assurable and Usable Security Configuration","","","","2009 (November 2009)","2010 (October 2010)","http://portal.acm.org/proceedings/safeconfig/","http://portal.acm.org/proceedings/safeconfig/archive/" "Conference Proceedings","Sandbox: Symposium on Video Games","","","","2006 (July 2006)","2011 (August 2011)","http://portal.acm.org/proceedings/sandbox/","http://portal.acm.org/proceedings/sandbox/archive/" "Conference Proceedings","SecPerU: Security, Privacy and Trust in Pervasive and Ubiquitous Computing","","","","2008 (July 2008)","2008 (July 2008)","http://portal.acm.org/proceedings/secperu/","http://portal.acm.org/proceedings/secperu/archive/" "Conference Proceedings","SecuCode: Secure Execution of Untrusted Code","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/secucode/","http://portal.acm.org/proceedings/secucode/archive/" "Conference Proceedings","SecureComm: Security and Privacy in Communication Netowrks","","","","2008 (September 2008)","2008 (September 2008)","http://portal.acm.org/proceedings/securecomm/","http://portal.acm.org/proceedings/securecomm/archive/" "Conference Proceedings","SenSys: Embedded Networked Sensor Systems","","","","2003 (November 2003)","2013 (November 2013)","http://portal.acm.org/proceedings/sensys/","http://portal.acm.org/proceedings/sensys/archive/" "Conference Proceedings","SensorKDD: Knowledge Discovery from Sensor Data","","","","2009 (June 2009)","2012 (August 2012)","http://portal.acm.org/proceedings/sensorkdd/","http://portal.acm.org/proceedings/sensorkdd/archive/" "Conference Proceedings","SoCC: Cloud Computing","","","","2010 (June 2010)","2012 (October 2012)","http://portal.acm.org/proceedings/socc/","http://portal.acm.org/proceedings/socc/archive/" "Conference Proceedings","SoCG: Computational Geometry","","","","1985 (June 1985)","2013 (June 2013)","http://portal.acm.org/proceedings/socg/","http://portal.acm.org/proceedings/socg/archive/" "Conference Proceedings","SoD: Science of Design","","","","2007 (March 2007)","2007 (March 2007)","http://portal.acm.org/proceedings/sod/","http://portal.acm.org/proceedings/sod/archive/" "Conference Proceedings","SoICT: Information and Communication Technology","","","","2010 (August 2010)","2013 (December 2013)","http://portal.acm.org/proceedings/soict/","http://portal.acm.org/proceedings/soict/archive/" "Conference Proceedings","SoSEA: Social Software Engineering Applications","","","","2009 (August 2009)","2009 (August 2009)","http://portal.acm.org/proceedings/sosea/","http://portal.acm.org/proceedings/sosea/archive/" "Conference Proceedings","SocialNets: Social Network Systems","","","","2008 (April 2008)","2009 (March 2009)","http://portal.acm.org/proceedings/socialnets/","http://portal.acm.org/proceedings/socialnets/archive/" "Conference Proceedings","SoftVis: Software Visualization","","","","2003 (June 2003)","2010 (October 2010)","http://portal.acm.org/proceedings/softvis/","http://portal.acm.org/proceedings/softvis/archive/" "Conference Proceedings","SpringSim: Spring Simulation Multiconference","","","","2007 (March 2007)","2013 (April 2013)","http://portal.acm.org/proceedings/springsim/","http://portal.acm.org/proceedings/springsim/archive/" "Conference Proceedings","StReBio: Statistical and Relational Learning in Bioinformatics","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/strebio/","http://portal.acm.org/proceedings/strebio/archive/" "Conference Proceedings","StorageSS: Storage Security and Survivability","","","","2005 (November 2005)","2008 (October 2008)","http://portal.acm.org/proceedings/storagess/","http://portal.acm.org/proceedings/storagess/archive/" "Conference Proceedings","StreamKDD: Novel Data Stream Pattern Mining Techniques","","","","2010 (July 2010)","2010 (July 2010)","http://portal.acm.org/proceedings/streamkdd/","http://portal.acm.org/proceedings/streamkdd/archive/" "Conference Proceedings","TAMODIA: Task Models and Diagrams","","","","2004 (November 2004)","2005 (September 2005)","http://portal.acm.org/proceedings/tamodia/","http://portal.acm.org/proceedings/tamodia/archive/" "Conference Proceedings","TAPAS: Technology and Policy for Accessing Spectrum","","","","2006 (August 2006)","2006 (August 2006)","http://portal.acm.org/proceedings/tapas/","http://portal.acm.org/proceedings/tapas/archive/" "Conference Proceedings","TAPIA: Diversity in Computing","","","","2003 (October 2003)","2009 (April 2009)","http://portal.acm.org/proceedings/tapia/","http://portal.acm.org/proceedings/tapia/archive/" "Conference Proceedings","TAPP: Theory and Practice of Provenance","","","","2010 (February 2010)","2013 (April 2013)","http://portal.acm.org/proceedings/tapp/","http://portal.acm.org/proceedings/tapp/archive/" "Conference Proceedings","TARK: Theoretical Aspects of Rationality and Knowledge","","","","1986 (March 1986)","2009 (July 2009)","http://portal.acm.org/proceedings/tark/","http://portal.acm.org/proceedings/tark/archive/" "Conference Proceedings","TAU: Timing Iissues in the Specification and Synthesis of Digital Systems","","","","2002 (December 2002)","2002 (December 2002)","http://portal.acm.org/proceedings/tau/","http://portal.acm.org/proceedings/tau/archive/" "Conference Proceedings","TAV: Testing, Analysis and Verification","","","","1989 (November 1989)","2008 (July 2008)","http://portal.acm.org/proceedings/tav/","http://portal.acm.org/proceedings/tav/archive/" "Conference Proceedings","TEFSE: Traceability in Emerging Forms of Software Engineering","","","","2005 (November 2005)","2011 (May 2011)","http://portal.acm.org/proceedings/tefse/","http://portal.acm.org/proceedings/tefse/archive/" "Conference Proceedings","TEI: Tangible and Embedded Interaction","","","","2007 (February 2007)","2013 (February 2013)","http://portal.acm.org/proceedings/tei/","http://portal.acm.org/proceedings/tei/archive/" "Conference Proceedings","TG: TeraGrid","","","","2010 (August 2010)","2011 (July 2011)","http://portal.acm.org/proceedings/tg/","http://portal.acm.org/proceedings/tg/archive/" "Conference Proceedings","TINLAP: Theoretical Issues in Natural Language Processing","","","","1975 (June 1975)","1975 (June 1975)","http://portal.acm.org/proceedings/tinlap/","http://portal.acm.org/proceedings/tinlap/archive/" "Conference Proceedings","TLDI: Types in Language Design and Implentation","","","","2003 (January 2003)","2012 (January 2012)","http://portal.acm.org/proceedings/tldi/","http://portal.acm.org/proceedings/tldi/archive/" "Conference Proceedings","TMBIO: Text Mining in Bioinformatics","","","","2006 (November 2006)","2006 (November 2006)","http://portal.acm.org/proceedings/tmbio/","http://portal.acm.org/proceedings/tmbio/archive/" "Conference Proceedings","TMR: Tagging, Mining and Retrieval","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/tmr/","http://portal.acm.org/proceedings/tmr/archive/" "Conference Proceedings","TRI-Ada: TRI-Ada","","","","1989 (January 1989)","1997 (November 1997)","http://portal.acm.org/proceedings/tri-ada/","http://portal.acm.org/proceedings/tri-ada/archive/" "Conference Proceedings","TSA: Topic-Sentiment Analysis for Mass Opinion","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/tsa/","http://portal.acm.org/proceedings/tsa/archive/" "Conference Proceedings","TT: Software Technology Transfer in Software Engineering","","","","2006 (May 2006)","2006 (May 2006)","http://portal.acm.org/proceedings/tt/","http://portal.acm.org/proceedings/tt/archive/" "Conference Proceedings","TVS: TRECVid Video Summarization","","","","2007 (September 2007)","2008 (October 2008)","http://portal.acm.org/proceedings/tvs/","http://portal.acm.org/proceedings/tvs/archive/" "Conference Proceedings","TridentCom: Testbeds and Research Infrastructures for the Development of Networks & Communities","","","","2008 (March 2008)","2008 (March 2008)","http://portal.acm.org/proceedings/tridentcom/","http://portal.acm.org/proceedings/tridentcom/archive/" "Conference Proceedings","U-NET: User-Provided Networking","","","","2009 (December 2009)","2009 (December 2009)","http://portal.acm.org/proceedings/u-net/","http://portal.acm.org/proceedings/u-net/archive/" "Conference Proceedings","U: Knowledge Discovery from Uncertain Data","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/u/","http://portal.acm.org/proceedings/u/archive/" "Conference Proceedings","UBDM: Utility-Based Data Mining","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/ubdm/","http://portal.acm.org/proceedings/ubdm/archive/" "Conference Proceedings","UCHPC-MAW: UnConventional High Performance Computing Workshop plus Memory Access Workshop","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/uchpc-maw/","http://portal.acm.org/proceedings/uchpc-maw/archive/" "Conference Proceedings","UCVP: Use of Context in Vision Processing","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/ucvp/","http://portal.acm.org/proceedings/ucvp/archive/" "Conference Proceedings","UIST: User Interface Software and Technology","","","","1988 (January 1988)","2013 (October 2013)","http://portal.acm.org/proceedings/uist/","http://portal.acm.org/proceedings/uist/archive/" "Conference Proceedings","ULSSIS: Ultra-Large-Scale Software-Intensive Systems","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/ulssis/","http://portal.acm.org/proceedings/ulssis/archive/" "Conference Proceedings","UML: Unified Modeling Language","","","","1999 (October 1999)","2000 (October 2000)","http://portal.acm.org/proceedings/uml/","http://portal.acm.org/proceedings/uml/archive/" "Conference Proceedings","UODIGS: User-Oriented Design of Interactive Graphics Systems","","","","1977 (October 1976)","1977 (October 1976)","http://portal.acm.org/proceedings/uodigs/","http://portal.acm.org/proceedings/uodigs/archive/" "Conference Proceedings","UP: Useful Patterns","","","","2010 (July 2010)","2010 (July 2010)","http://portal.acm.org/proceedings/up/","http://portal.acm.org/proceedings/up/archive/" "Conference Proceedings","UPGRADE: Use of P2P, GRID and Agents for the Development of Content Networks","","","","2007 (June 2007)","2009 (June 2009)","http://portal.acm.org/proceedings/upgrade/","http://portal.acm.org/proceedings/upgrade/archive/" "Conference Proceedings","UXTV: Designing Interactive User Experiences for TV and Video","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/uxtv/","http://portal.acm.org/proceedings/uxtv/archive/" "Conference Proceedings","UbiComp: Ubiquitous Computing","","","","2002 (September 2002)","2013 (September 2013)","http://portal.acm.org/proceedings/ubicomp/","http://portal.acm.org/proceedings/ubicomp/archive/" "Conference Proceedings","UbiMob: Mobility and Ubiquity Computing","","","","2004 (June 2004)","2009 (July 2009)","http://portal.acm.org/proceedings/ubimob/","http://portal.acm.org/proceedings/ubimob/archive/" "Conference Proceedings","UltraVis: Ultrascale Visualization","","","","2009 (November 2009)","2013 (November 2013)","http://portal.acm.org/proceedings/ultravis/","http://portal.acm.org/proceedings/ultravis/archive/" "Conference Proceedings","VAKD: Visual Analytics and Knowledge Discovery","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/vakd/","http://portal.acm.org/proceedings/vakd/archive/" "Conference Proceedings","VANET: VehiculAr InterNETworking","","","","2004 (October 2004)","2013 (June 2013)","http://portal.acm.org/proceedings/vanet/","http://portal.acm.org/proceedings/vanet/archive/" "Conference Proceedings","VAST: Visual Analytics Science and Technology","","","","2001 (November 2001)","2009 (September 2009)","http://portal.acm.org/proceedings/vast/","http://portal.acm.org/proceedings/vast/archive/" "Conference Proceedings","VDTS: Virtualization Technology for Dependable Systems","","","","2009 (March 2009)","2009 (March 2009)","http://portal.acm.org/proceedings/vdts/","http://portal.acm.org/proceedings/vdts/archive/" "Conference Proceedings","VEE: Virtual Execution Environments","","","","2005 (June 2005)","2013 (March 2013)","http://portal.acm.org/proceedings/vee/","http://portal.acm.org/proceedings/vee/archive/" "Conference Proceedings","VG: Volume Graphics","","","","2003 (July 2003)","2005 (June 2005)","http://portal.acm.org/proceedings/vg/","http://portal.acm.org/proceedings/vg/archive/" "Conference Proceedings","VIS: Visualization","","","","1990 (October 1990)","2004 (October 2004)","http://portal.acm.org/proceedings/vis/","http://portal.acm.org/proceedings/vis/archive/" "Conference Proceedings","VISA: Virtualized Infrastructure Systems and Architectures","","","","2009 (August 2009)","2010 (September 2010)","http://portal.acm.org/proceedings/visa/","http://portal.acm.org/proceedings/visa/archive/" "Conference Proceedings","VISSYM: Symposium on Data Visualisation","","","","2003 (May 2003)","2004 (May 2004)","http://portal.acm.org/proceedings/vissym/","http://portal.acm.org/proceedings/vissym/archive/" "Conference Proceedings","VLDB: Very Large Data Bases","","","","1975 (September 1975)","2007 (September 2007)","http://portal.acm.org/proceedings/vldb/","http://portal.acm.org/proceedings/vldb/archive/" "Conference Proceedings","VLS-MCMR: Very-Large-Scale Multimedia Corpus, Mining and Retrieval","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/vls-mcmr/","http://portal.acm.org/proceedings/vls-mcmr/archive/" "Conference Proceedings","VMIL: Virtual Machines and Intermediate Languages","","","","2007 (March 2007)","2012 (October 2012)","http://portal.acm.org/proceedings/vmil/","http://portal.acm.org/proceedings/vmil/archive/" "Conference Proceedings","VMSec: Virtual Machine Security","","","","2008 (October 2008)","2009 (November 2009)","http://portal.acm.org/proceedings/vmsec/","http://portal.acm.org/proceedings/vmsec/archive/" "Conference Proceedings","VNBA: Vision Networks for Behaviour Analysis","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/vnba/","http://portal.acm.org/proceedings/vnba/archive/" "Conference Proceedings","VRCAI: Virtual Reality Continuum and its Applications in Industry","","","","2004 (June 2004)","2013 (November 2013)","http://portal.acm.org/proceedings/vrcai/","http://portal.acm.org/proceedings/vrcai/archive/" "Conference Proceedings","VRML: Virtual Reality Modeling Language","","","","1995 (January 1995)","2000 (February 2000)","http://portal.acm.org/proceedings/vrml/","http://portal.acm.org/proceedings/vrml/archive/" "Conference Proceedings","VRST: Virtual Reality Software and Technology","","","","1997 (September 1997)","2013 (October 2013)","http://portal.acm.org/proceedings/vrst/","http://portal.acm.org/proceedings/vrst/archive/" "Conference Proceedings","VSSN: Video Surveillance and Sensor Networks","","","","2004 (October 2004)","2006 (October 2006)","http://portal.acm.org/proceedings/vssn/","http://portal.acm.org/proceedings/vssn/archive/" "Conference Proceedings","VTDC: Virtualization Technology in Distributed Computing","","","","2006 (November 2006)","2013 (June 2013)","http://portal.acm.org/proceedings/vtdc/","http://portal.acm.org/proceedings/vtdc/archive/" "Conference Proceedings","VVS: Symposium on Volume Visualization","","","","1989 (May 1989)","2002 (October 2002)","http://portal.acm.org/proceedings/vvs/","http://portal.acm.org/proceedings/vvs/archive/" "Conference Proceedings","ValueTools: Performance Evaluation Methodologies and Tools","","","","2007 (October 2007)","2007 (October 2007)","http://portal.acm.org/proceedings/valuetools/","http://portal.acm.org/proceedings/valuetools/archive/" "Conference Proceedings","Valuetools: Performance Evaluation Methodologies and Tools","","","","2006 (October 2006)","2011 (May 2011)","http://portal.acm.org/proceedings/valuetools/","http://portal.acm.org/proceedings/valuetools/archive/" "Conference Proceedings","VizSEC: Visualization for Computer Security","","","","2004 (October 2004)","2006 (November 2006)","http://portal.acm.org/proceedings/vizsec/","http://portal.acm.org/proceedings/vizsec/archive/" "Conference Proceedings","VizSec: Visualization for Cyber Security","","","","2010 (September 2010)","2013 (October 2013)","http://portal.acm.org/proceedings/vizsec/","http://portal.acm.org/proceedings/vizsec/archive/" "Conference Proceedings","WA: Web Accessibility","","","","2004 (May 2004)","2013 (May 2013)","http://portal.acm.org/proceedings/wa/","http://portal.acm.org/proceedings/wa/archive/" "Conference Proceedings","WACC: Work Activities Coordination and Collaboration","","","","1999 (March 1999)","1999 (March 1999)","http://portal.acm.org/proceedings/wacc/","http://portal.acm.org/proceedings/wacc/archive/" "Conference Proceedings","WADAS: Washington Ada symposium on Ada","","","","1984 (March 1984)","1994 (July 1994)","http://portal.acm.org/proceedings/wadas/","http://portal.acm.org/proceedings/wadas/archive/" "Conference Proceedings","WADS: Workshop on Architecting Dependable Systems","","","","2005 (May 2005)","2005 (May 2005)","http://portal.acm.org/proceedings/wads/","http://portal.acm.org/proceedings/wads/archive/" "Conference Proceedings","WBIA: Workshop on Binary Instrumentation and Applications","","","","2009 (December 2009)","2009 (December 2009)","http://portal.acm.org/proceedings/wbia/","http://portal.acm.org/proceedings/wbia/archive/" "Conference Proceedings","WBMA: Biometrics Methods and Applications","","","","2003 (November 2003)","2003 (November 2003)","http://portal.acm.org/proceedings/wbma/","http://portal.acm.org/proceedings/wbma/archive/" "Conference Proceedings","WCAE: Computer Architecture Education","","","","1995 (January 1995)","2007 (June 2007)","http://portal.acm.org/proceedings/wcae/","http://portal.acm.org/proceedings/wcae/archive/" "Conference Proceedings","WCCCE: Computing Education","","","","2009 (May 2009)","2012 (May 2012)","http://portal.acm.org/proceedings/wccce/","http://portal.acm.org/proceedings/wccce/archive/" "Conference Proceedings","WCFLP: Workshop on Curry and Functional Logic Programming","","","","2005 (September 2005)","2005 (September 2005)","http://portal.acm.org/proceedings/wcflp/","http://portal.acm.org/proceedings/wcflp/archive/" "Conference Proceedings","WDTN: Delay-Tolerant Networking","","","","2005 (August 2005)","2005 (August 2005)","http://portal.acm.org/proceedings/wdtn/","http://portal.acm.org/proceedings/wdtn/archive/" "Conference Proceedings","WEASELTech: Empirical Assessment of Software Engineering Languages and Technologies","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/weaseltech/","http://portal.acm.org/proceedings/weaseltech/archive/" "Conference Proceedings","WEH: Exception Handling","","","","2008 (November 2008)","2008 (November 2008)","http://portal.acm.org/proceedings/weh/","http://portal.acm.org/proceedings/weh/archive/" "Conference Proceedings","WESS: Workshop on Embedded Systems Security","","","","2009 (October 2009)","2013 (September 2013)","http://portal.acm.org/proceedings/wess/","http://portal.acm.org/proceedings/wess/archive/" "Conference Proceedings","WETSoM: Workshop on Emerging Trends in Software Metrics","","","","2010 (May 2010)","2011 (May 2011)","http://portal.acm.org/proceedings/wetsom/","http://portal.acm.org/proceedings/wetsom/archive/" "Conference Proceedings","WEUSE: Workshop on End-User Software Engineering","","","","2005 (May 2005)","2008 (May 2008)","http://portal.acm.org/proceedings/weuse/","http://portal.acm.org/proceedings/weuse/archive/" "Conference Proceedings","WEWST: Workshop on Enhanced Web Service Technologies","","","","2009 (November 2009)","2011 (September 2011)","http://portal.acm.org/proceedings/wewst/","http://portal.acm.org/proceedings/wewst/archive/" "Conference Proceedings","WGP: Workshop on Generic Programming","","","","2006 (September 2006)","2013 (September 2013)","http://portal.acm.org/proceedings/wgp/","http://portal.acm.org/proceedings/wgp/archive/" "Conference Proceedings","WH: Wireless Health","","","","2010 (October 2010)","2012 (October 2012)","http://portal.acm.org/proceedings/wh/","http://portal.acm.org/proceedings/wh/archive/" "Conference Proceedings","WHPCF: High Performance Computational Finance","","","","2009 (November 2009)","2013 (November 2013)","http://portal.acm.org/proceedings/whpcf/","http://portal.acm.org/proceedings/whpcf/archive/" "Conference Proceedings","WI-IATW: Web Intelligence and Intelligent Agent Technology","","","","2006 (December 2006)","2012 (December 2012)","http://portal.acm.org/proceedings/wi-iatw/","http://portal.acm.org/proceedings/wi-iatw/archive/" "Conference Proceedings","WI: Web Intelligence","","","","2003 (October 2003)","2007 (November 2007)","http://portal.acm.org/proceedings/wi/","http://portal.acm.org/proceedings/wi/archive/" "Conference Proceedings","WICON: Wireless internet","","","","2006 (August 2006)","2007 (October 2007)","http://portal.acm.org/proceedings/wicon/","http://portal.acm.org/proceedings/wicon/archive/" "Conference Proceedings","WICOW: Information Credibility on the Web","","","","2008 (October 2008)","2010 (April 2010)","http://portal.acm.org/proceedings/wicow/","http://portal.acm.org/proceedings/wicow/archive/" "Conference Proceedings","WIDM: Web Information and Data Management","","","","1999 (November 1999)","2012 (November 2012)","http://portal.acm.org/proceedings/widm/","http://portal.acm.org/proceedings/widm/archive/" "Conference Proceedings","WIESS: Industrial Experiences with Systems Software ","","","","2000 (October 2000)","2002 (December 2002)","http://portal.acm.org/proceedings/wiess/","http://portal.acm.org/proceedings/wiess/archive/" "Conference Proceedings","WINITS: Wireless Networking for Intelligent Transportation Systems","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/winits/","http://portal.acm.org/proceedings/winits/archive/" "Conference Proceedings","WINTECH: Exerimental Evaluation and Characterization","","","","2009 (September 2009)","2009 (September 2009)","http://portal.acm.org/proceedings/wintech/","http://portal.acm.org/proceedings/wintech/archive/" "Conference Proceedings","WISER: Workshop on Interdisciplinary Software Engineering Research","","","","2004 (November 2004)","2006 (May 2006)","http://portal.acm.org/proceedings/wiser/","http://portal.acm.org/proceedings/wiser/archive/" "Conference Proceedings","WISG: Workshop on Information Security Governance","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/wisg/","http://portal.acm.org/proceedings/wisg/archive/" "Conference Proceedings","WISTP: Information Security Theory and Practices","","","","2007 (May 2007)","2008 (May 2008)","http://portal.acm.org/proceedings/wistp/","http://portal.acm.org/proceedings/wistp/archive/" "Conference Proceedings","WITS: Issues in the Theory of Security","","","","2005 (January 2005)","2005 (January 2005)","http://portal.acm.org/proceedings/wits/","http://portal.acm.org/proceedings/wits/archive/" "Conference Proceedings","WMASH: Wireless Mobile Applications and Services on WLAN Hotspots","","","","2003 (September 2003)","2006 (September 2006)","http://portal.acm.org/proceedings/wmash/","http://portal.acm.org/proceedings/wmash/archive/" "Conference Proceedings","WMC: Workshop on Mobile Commerce","","","","2001 (July 2001)","2002 (September 2002)","http://portal.acm.org/proceedings/wmc/","http://portal.acm.org/proceedings/wmc/archive/" "Conference Proceedings","WMI: Wireless Mobile Internet","","","","2001 (July 2001)","2001 (July 2001)","http://portal.acm.org/proceedings/wmi/","http://portal.acm.org/proceedings/wmi/archive/" "Conference Proceedings","WMISI: Workshop on Multimodal Interfaces in Semantic Interaction","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/wmisi/","http://portal.acm.org/proceedings/wmisi/archive/" "Conference Proceedings","WMPI: Memory Performance Issues","","","","2004 (June 2004)","2004 (June 2004)","http://portal.acm.org/proceedings/wmpi/","http://portal.acm.org/proceedings/wmpi/archive/" "Conference Proceedings","WMUPS: Middleware for Ubiquitous and Pervasive Systems","","","","2009 (June 2009)","2009 (June 2009)","http://portal.acm.org/proceedings/wmups/","http://portal.acm.org/proceedings/wmups/archive/" "Conference Proceedings","WMuNeP: Wireless Multimedia and Performance Modeling","","","","2005 (October 2005)","2011 (October 2011)","http://portal.acm.org/proceedings/wmunep/","http://portal.acm.org/proceedings/wmunep/archive/" "Conference Proceedings","WNS: Workshop on NS-2: the IP Network Simulator","","","","2006 (October 2006)","2006 (October 2006)","http://portal.acm.org/proceedings/wns/","http://portal.acm.org/proceedings/wns/archive/" "Conference Proceedings","WOCCI: Workshop on Child, Computer and Interaction","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/wocci/","http://portal.acm.org/proceedings/wocci/archive/" "Conference Proceedings","WODA: Workshop on Dynamic Analysis","","","","2005 (May 2005)","2012 (July 2012)","http://portal.acm.org/proceedings/woda/","http://portal.acm.org/proceedings/woda/archive/" "Conference Proceedings","WORKS: Workflows in Support of Large-Scale Science","","","","2007 (June 2007)","2013 (November 2013)","http://portal.acm.org/proceedings/works/","http://portal.acm.org/proceedings/works/archive/" "Conference Proceedings","WORM: Workshop on Recurring Malcode","","","","2003 (October 2003)","2007 (November 2007)","http://portal.acm.org/proceedings/worm/","http://portal.acm.org/proceedings/worm/archive/" "Conference Proceedings","WOSN: Online Social Networks","","","","2008 (August 2008)","2012 (August 2012)","http://portal.acm.org/proceedings/wosn/","http://portal.acm.org/proceedings/wosn/archive/" "Conference Proceedings by Affiliated Organizations","WOSP: Software and Performance","","","","1998 (October 1998)","2013 (April 2013)","http://portal.acm.org/proceedings/wosp/","http://portal.acm.org/proceedings/wosp/archive/" "Conference Proceedings","WOSS: Self-Managed Systems","","","","2002 (November 2002)","2004 (October 2004)","http://portal.acm.org/proceedings/woss/","http://portal.acm.org/proceedings/woss/archive/" "Conference Proceedings","WOSSE: Workshop on Open Source Software Engineering","","","","2005 (May 2005)","2005 (May 2005)","http://portal.acm.org/proceedings/wosse/","http://portal.acm.org/proceedings/wosse/archive/" "Conference Proceedings","WOWMOM: Workshop on Wireless Mobile Multimedia","","","","1998 (October 1998)","2006 (June 2006)","http://portal.acm.org/proceedings/wowmom/","http://portal.acm.org/proceedings/wowmom/archive/" "Conference Proceedings","WPES: Workshop on Privacy in the Electronic Society","","","","2002 (November 2002)","2013 (November 2013)","http://portal.acm.org/proceedings/wpes/","http://portal.acm.org/proceedings/wpes/archive/" "Conference Proceedings","WRAITS: Recent Advances on Intrusion-Tolerant Systems","","","","2008 (April 2008)","2008 (April 2008)","http://portal.acm.org/proceedings/wraits/","http://portal.acm.org/proceedings/wraits/archive/" "Conference Proceedings","WRASQ: Workshop on Automating Service Quality","","","","2007 (November 2007)","2007 (November 2007)","http://portal.acm.org/proceedings/wrasq/","http://portal.acm.org/proceedings/wrasq/archive/" "Conference Proceedings","WREFT: Workshop on Radiation Effects and Fault Tolerance in Nanometer Technologies","","","","2008 (May 2008)","2008 (May 2008)","http://portal.acm.org/proceedings/wreft/","http://portal.acm.org/proceedings/wreft/archive/" "Conference Proceedings","WREN: Research on Enterprise Networking","","","","2009 (August 2009)","2009 (August 2009)","http://portal.acm.org/proceedings/wren/","http://portal.acm.org/proceedings/wren/archive/" "Conference Proceedings","WRT: Refactoring Tools","","","","2008 (October 2008)","2012 (June 2012)","http://portal.acm.org/proceedings/wrt/","http://portal.acm.org/proceedings/wrt/archive/" "Conference Proceedings","WS-REST: RESTful Design","","","","2010 (April 2010)","2012 (April 2012)","http://portal.acm.org/proceedings/ws-rest/","http://portal.acm.org/proceedings/ws-rest/archive/" "Conference Proceedings","WSC: Winter Simulation Conference","","","","1971 (January 1971)","2012 (December 2012)","http://portal.acm.org/proceedings/wsc/","http://portal.acm.org/proceedings/wsc/archive/" "Conference Proceedings","WSCD: Web Search Click Data","","","","2009 (February 2009)","2009 (February 2009)","http://portal.acm.org/proceedings/wscd/","http://portal.acm.org/proceedings/wscd/archive/" "Conference Proceedings","WSDM: Web Search and Data Mining","","","","2008 (February 2008)","2013 (February 2013)","http://portal.acm.org/proceedings/wsdm/","http://portal.acm.org/proceedings/wsdm/archive/" "Conference Proceedings","WSM: Social Media","","","","2009 (October 2009)","2011 (November 2011)","http://portal.acm.org/proceedings/wsm/","http://portal.acm.org/proceedings/wsm/archive/" "Conference Proceedings","WSMC: Web-Scale Multimedia Corpus","","","","2009 (October 2009)","2009 (October 2009)","http://portal.acm.org/proceedings/wsmc/","http://portal.acm.org/proceedings/wsmc/archive/" "Conference Proceedings","WSNA: Wireless Sensor Networks and Applications","","","","2002 (September 2002)","2003 (September 2003)","http://portal.acm.org/proceedings/wsna/","http://portal.acm.org/proceedings/wsna/archive/" "Conference Proceedings","WTAOP: Workshop on Testing Aspect-Oriented Programs","","","","2006 (July 2006)","2007 (March 2007)","http://portal.acm.org/proceedings/wtaop/","http://portal.acm.org/proceedings/wtaop/archive/" "Conference Proceedings","WUAUC: Universal Accessibility of Ubiquitous Computing","","","","2001 (May 2001)","2001 (May 2001)","http://portal.acm.org/proceedings/wuauc/","http://portal.acm.org/proceedings/wuauc/archive/" "Conference Proceedings","WUP: Warm Up Workshop for ACM/IEEE ICSE 2010","","","","2009 (April 2009)","2009 (April 2009)","http://portal.acm.org/proceedings/wup/","http://portal.acm.org/proceedings/wup/archive/" "Conference Proceedings","WWW: World Wide Web","","","","2001 (April 2001)","2013 (May 2013)","http://portal.acm.org/proceedings/www/","http://portal.acm.org/proceedings/www/archive/" "Conference Proceedings","Wands: Workflow Approaches to New Data-centric Science","","","","2010 (June 2010)","2010 (June 2010)","http://portal.acm.org/proceedings/wands/","http://portal.acm.org/proceedings/wands/archive/" "Conference Proceedings","Web3D: 3D Web Technology","","","","2001 (February 2001)","2013 (June 2013)","http://portal.acm.org/proceedings/web3d/","http://portal.acm.org/proceedings/web3d/archive/" "Conference Proceedings","WebDB: Web and Databases","","","","2004 (June 2004)","2010 (June 2010)","http://portal.acm.org/proceedings/webdb/","http://portal.acm.org/proceedings/webdb/archive/" "Conference Proceedings","WebKDD/SNA-KDD: Web Mining and Social Network Analysis","","","","2007 (August 2007)","2007 (August 2007)","http://portal.acm.org/proceedings/webkdd/sna-kdd/","http://portal.acm.org/proceedings/webkdd/sna-kdd/archive/" "Conference Proceedings","WebMedia: Multimedia and the Web","","","","2005 (December 2005)","2013 (November 2013)","http://portal.acm.org/proceedings/webmedia/","http://portal.acm.org/proceedings/webmedia/archive/" "Conference Proceedings","WebSE: Workshop on Web 2.0 for Software Engineering","","","","2010 (May 2010)","2011 (May 2011)","http://portal.acm.org/proceedings/webse/","http://portal.acm.org/proceedings/webse/archive/" "Conference Proceedings","WebScience: Collaborative and Collective Intelligence","","","","2008 (June 2008)","2008 (June 2008)","http://portal.acm.org/proceedings/webscience/","http://portal.acm.org/proceedings/webscience/archive/" "Conference Proceedings","WiMD: Medical Grade Wireless Networks","","","","2009 (May 2009)","2009 (May 2009)","http://portal.acm.org/proceedings/wimd/","http://portal.acm.org/proceedings/wimd/archive/" "Conference Proceedings","WiNS-DR: Wireless Networks and Systems for Developing Regions","","","","2008 (September 2008)","2008 (September 2008)","http://portal.acm.org/proceedings/wins-dr/","http://portal.acm.org/proceedings/wins-dr/archive/" "Conference Proceedings","WiNTECH: Wireless Network Tesbeds, Experimental Evaluation and Characterization","","","","2006 (September 2006)","2013 (September 2013)","http://portal.acm.org/proceedings/wintech/","http://portal.acm.org/proceedings/wintech/archive/" "Conference Proceedings","WiSE: Wireless Security","","","","2002 (September 2002)","2006 (September 2006)","http://portal.acm.org/proceedings/wise/","http://portal.acm.org/proceedings/wise/archive/" "Conference Proceedings","WiSec: Wireless Network Security","","","","2008 (March 2008)","2013 (April 2013)","http://portal.acm.org/proceedings/wisec/","http://portal.acm.org/proceedings/wisec/archive/" "Conference Proceedings","WiTMeMo: Wireless Traffic Measurements and Modeling","","","","2005 (June 2005)","2006 (August 2006)","http://portal.acm.org/proceedings/witmemo/","http://portal.acm.org/proceedings/witmemo/archive/" "Conference Proceedings","WikiSym: International Symposium on Wikis","","","","2005 (October 2005)","2013 (August 2013)","http://portal.acm.org/proceedings/wikisym/","http://portal.acm.org/proceedings/wikisym/archive/" "Conference Proceedings","WoSQ: Workshop on Software Quality","","","","2005 (May 2005)","2011 (September 2011)","http://portal.acm.org/proceedings/wosq/","http://portal.acm.org/proceedings/wosq/archive/" "Conference Proceedings","WuWNeT: UnderWater Networks","","","","2006 (September 2006)","2012 (November 2012)","http://portal.acm.org/proceedings/wuwnet/","http://portal.acm.org/proceedings/wuwnet/archive/" "Conference Proceedings","XIME-P: XQuery Implementation, Experience and Perpectives","","","","2007 (June 2007)","2007 (June 2007)","http://portal.acm.org/proceedings/xime-p/","http://portal.acm.org/proceedings/xime-p/archive/" "Conference Proceedings","XMLSEC: XML Security","","","","2002 (November 2002)","2003 (October 2003)","http://portal.acm.org/proceedings/xmlsec/","http://portal.acm.org/proceedings/xmlsec/archive/" "Conference Proceedings","dg.o: Digital Government Research","","","","2000 (May 2000)","2013 (June 2013)","http://portal.acm.org/proceedings/dg.o/","http://portal.acm.org/proceedings/dg.o/archive/" "Conference Proceedings","e-Energy: Energy-Efficient Computing and Networking","","","","2010 (April 2010)","2013 (January 2013)","http://portal.acm.org/proceedings/e-energy/","http://portal.acm.org/proceedings/e-energy/archive/" "Conference Proceedings","e-Forensics: Forensic Applications and Techniques in Telecommunications, Information, and Multimedia","","","","2008 (January 2008)","2008 (January 2008)","http://portal.acm.org/proceedings/e-forensics/","http://portal.acm.org/proceedings/e-forensics/archive/" "Conference Proceedings","eConf: e-Services and e-Systems","","","","2009 (November 2009)","2009 (November 2009)","http://portal.acm.org/proceedings/econf/","http://portal.acm.org/proceedings/econf/archive/" "Conference Proceedings","eCrime: eCrime Researchers Summit","","","","2007 (October 2007)","2007 (October 2007)","http://portal.acm.org/proceedings/ecrime/","http://portal.acm.org/proceedings/ecrime/archive/" "Conference Proceedings","eHeritage: eHeritage and Digital Art Preservation","","","","2010 (October 2010)","2010 (October 2010)","http://portal.acm.org/proceedings/eheritage/","http://portal.acm.org/proceedings/eheritage/archive/" "Conference Proceedings","eclipse: eclipse Technology eXchange","","","","2003 (October 2003)","2007 (October 2007)","http://portal.acm.org/proceedings/eclipse/","http://portal.acm.org/proceedings/eclipse/archive/" "Conference Proceedings","i-CREATe: Rehabilitation Engineering & Assistive Technology","","","","2007 (April 2007)","2009 (April 2009)","http://portal.acm.org/proceedings/i-create/","http://portal.acm.org/proceedings/i-create/archive/" "Conference Proceedings","iNEWS: Improving Non English Web Searching","","","","2008 (October 2008)","2008 (October 2008)","http://portal.acm.org/proceedings/inews/","http://portal.acm.org/proceedings/inews/archive/" "Conference Proceedings","iiWAS: Information Integration and Web-based Applications & Services","","","","2008 (November 2008)","2012 (December 2012)","http://portal.acm.org/proceedings/iiwas/","http://portal.acm.org/proceedings/iiwas/archive/" "Conference Proceedings","mmCom: mmWave communications","","","","2010 (September 2010)","2010 (September 2010)","http://portal.acm.org/proceedings/mmcom/","http://portal.acm.org/proceedings/mmcom/archive/" "Conference Proceedings","sOc-EUSAI: Smart Objects and Ambient Intelligence","","","","2005 (October 2005)","2005 (October 2005)","http://portal.acm.org/proceedings/soc-eusai/","http://portal.acm.org/proceedings/soc-eusai/archive/" "Conference Proceedings","years of DAC: Years of DAC","","","","1988 (June 1988)","1988 (June 1988)","http://portal.acm.org/proceedings/yearsofdac/","http://portal.acm.org/proceedings/yearsofdac/archive/" ================================================ FILE: docs/resources/js/common.js ================================================ // Returns a random number between min and max (inclusive) function randomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // BEGIN GOOGLE ANALYTICS (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-86578-20', 'papaparse.com'); ga('send', 'pageview'); // END GOOGLE ANALYTICS ================================================ FILE: docs/resources/js/demo.js ================================================ var inputType = "string"; var stepped = 0, rowCount = 0, errorCount = 0, firstError; var start, end; var firstRun = true; var maxUnparseLength = 10000; $(function() { // Tabs $('#tab-string').click(function() { $('.tab').removeClass('active'); $(this).addClass('active'); $('.input-area').hide(); $('#input-string').show(); $('#submit').text("Parse"); inputType = "string"; }); $('#tab-local').click(function() { $('.tab').removeClass('active'); $(this).addClass('active'); $('.input-area').hide(); $('#input-local').show(); $('#submit').text("Parse"); inputType = "local"; }); $('#tab-remote').click(function() { $('.tab').removeClass('active'); $(this).addClass('active'); $('.input-area').hide(); $('#input-remote').show(); $('#submit').text("Parse"); inputType = "remote"; }); $('#tab-unparse').click(function() { $('.tab').removeClass('active'); $(this).addClass('active'); $('.input-area').hide(); $('#input-unparse').show(); $('#submit').text("Unparse"); inputType = "json"; }); // Sample files $('#remote-normal-file').click(function() { $('#url').val($('#local-normal-file').attr('href')); }); $('#remote-large-file').click(function() { $('#url').val($('#local-large-file').attr('href')); }); $('#remote-malformed-file').click(function() { $('#url').val($('#local-malformed-file').attr('href')); }); // Demo invoked $('#submit').click(function() { if ($(this).prop('disabled') == "true") return; stepped = 0; rowCount = 0; errorCount = 0; firstError = undefined; var config = buildConfig(); var input = $('#input').val(); if (inputType == "remote") input = $('#url').val(); else if (inputType == "json") input = $('#json').val(); // Allow only one parse at a time $(this).prop('disabled', true); if (!firstRun) console.log("--------------------------------------------------"); else firstRun = false; if (inputType == "local") { if (!$('#files')[0].files.length) { alert("Please choose at least one file to parse."); return enableButton(); } $('#files').parse({ config: config, before: function(file, inputElem) { start = now(); console.log("Parsing file...", file); }, error: function(err, file) { console.log("ERROR:", err, file); firstError = firstError || err; errorCount++; }, complete: function() { end = now(); printStats("Done with all files"); } }); } else if (inputType == "json") { if (!input) { alert("Please enter a valid JSON string to convert to CSV."); return enableButton(); } start = now(); var csv = Papa.unparse(input, config); end = now(); console.log("Unparse complete"); console.log("Time:", (end-start || "(Unknown; your browser does not support the Performance API)"), "ms"); if (csv.length > maxUnparseLength) { csv = csv.substr(0, maxUnparseLength); console.log("(Results truncated for brevity)"); } console.log(csv); setTimeout(enableButton, 100); // hackity-hack } else if (inputType == "remote" && !input) { alert("Please enter the URL of a file to download and parse."); return enableButton(); } else { start = now(); var results = Papa.parse(input, config); console.log("Synchronous results:", results); if (config.worker || config.download) console.log("Running..."); } }); $('#insert-tab').click(function() { $('#delimiter').val('\t'); }); }); function printStats(msg) { if (msg) console.log(msg); console.log(" Time:", (end-start || "(Unknown; your browser does not support the Performance API)"), "ms"); console.log(" Row count:", rowCount); if (stepped) console.log(" Stepped:", stepped); console.log(" Errors:", errorCount); if (errorCount) console.log("First error:", firstError); } function buildConfig() { return { delimiter: $('#delimiter').val(), header: $('#header').prop('checked'), dynamicTyping: $('#dynamicTyping').prop('checked'), skipEmptyLines: $('#skipEmptyLines').prop('checked'), preview: parseInt($('#preview').val() || 0), step: $('#stream').prop('checked') ? stepFn : undefined, encoding: $('#encoding').val(), worker: $('#worker').prop('checked'), comments: $('#comments').val(), complete: completeFn, error: errorFn, download: inputType == "remote" }; } function stepFn(results, parser) { stepped++; if (results) { if (results.data) rowCount += results.data.length; if (results.errors) { errorCount += results.errors.length; firstError = firstError || results.errors[0]; } } } function completeFn(results) { end = now(); if (results && results.errors) { if (results.errors) { errorCount = results.errors.length; firstError = results.errors[0]; } if (results.data && results.data.length > 0) rowCount = results.data.length; } printStats("Parse complete"); console.log(" Results:", results); // icky hack setTimeout(enableButton, 100); } function errorFn(err, file) { end = now(); console.log("ERROR:", err, file); enableButton(); } function enableButton() { $('#submit').prop('disabled', false); } function now() { return typeof window.performance !== 'undefined' ? window.performance.now() : 0; } ================================================ FILE: docs/resources/js/home.js ================================================ /*! jQuery Waypoints - v2.0.5 Copyright (c) 2011-2014 Caleb Troughton Licensed under the MIT license. https://github.com/imakewebthings/jquery-waypoints/blob/master/licenses.txt */ ;(function(){var t=[].indexOf||function(t){for(var e=0,n=this.length;e=0;s={horizontal:{},vertical:{}};f=1;c={};u="waypoints-context-id";p="resize.waypoints";y="scroll.waypoints";v=1;w="waypoints-waypoint-ids";g="waypoint";m="waypoints";o=function(){function t(t){var e=this;this.$element=t;this.element=t[0];this.didResize=false;this.didScroll=false;this.id="context"+f++;this.oldScroll={x:t.scrollLeft(),y:t.scrollTop()};this.waypoints={horizontal:{},vertical:{}};this.element[u]=this.id;c[this.id]=this;t.bind(y,function(){var t;if(!(e.didScroll||a)){e.didScroll=true;t=function(){e.doScroll();return e.didScroll=false};return r.setTimeout(t,n[m].settings.scrollThrottle)}});t.bind(p,function(){var t;if(!e.didResize){e.didResize=true;t=function(){n[m]("refresh");return e.didResize=false};return r.setTimeout(t,n[m].settings.resizeThrottle)}})}t.prototype.doScroll=function(){var t,e=this;t={horizontal:{newScroll:this.$element.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.$element.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};if(a&&(!t.vertical.oldScroll||!t.vertical.newScroll)){n[m]("refresh")}n.each(t,function(t,r){var i,o,l;l=[];o=r.newScroll>r.oldScroll;i=o?r.forward:r.backward;n.each(e.waypoints[t],function(t,e){var n,i;if(r.oldScroll<(n=e.offset)&&n<=r.newScroll){return l.push(e)}else if(r.newScroll<(i=e.offset)&&i<=r.oldScroll){return l.push(e)}});l.sort(function(t,e){return t.offset-e.offset});if(!o){l.reverse()}return n.each(l,function(t,e){if(e.options.continuous||t===l.length-1){return e.trigger([i])}})});return this.oldScroll={x:t.horizontal.newScroll,y:t.vertical.newScroll}};t.prototype.refresh=function(){var t,e,r,i=this;r=n.isWindow(this.element);e=this.$element.offset();this.doScroll();t={horizontal:{contextOffset:r?0:e.left,contextScroll:r?0:this.oldScroll.x,contextDimension:this.$element.width(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:r?0:e.top,contextScroll:r?0:this.oldScroll.y,contextDimension:r?n[m]("viewportHeight"):this.$element.height(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};return n.each(t,function(t,e){return n.each(i.waypoints[t],function(t,r){var i,o,l,s,f;i=r.options.offset;l=r.offset;o=n.isWindow(r.element)?0:r.$element.offset()[e.offsetProp];if(n.isFunction(i)){i=i.apply(r.element)}else if(typeof i==="string"){i=parseFloat(i);if(r.options.offset.indexOf("%")>-1){i=Math.ceil(e.contextDimension*i/100)}}r.offset=o-e.contextOffset+e.contextScroll-i;if(r.options.onlyOnScroll&&l!=null||!r.enabled){return}if(l!==null&&l<(s=e.oldScroll)&&s<=r.offset){return r.trigger([e.backward])}else if(l!==null&&l>(f=e.oldScroll)&&f>=r.offset){return r.trigger([e.forward])}else if(l===null&&e.oldScroll>=r.offset){return r.trigger([e.forward])}})})};t.prototype.checkEmpty=function(){if(n.isEmptyObject(this.waypoints.horizontal)&&n.isEmptyObject(this.waypoints.vertical)){this.$element.unbind([p,y].join(" "));return delete c[this.id]}};return t}();l=function(){function t(t,e,r){var i,o;if(r.offset==="bottom-in-view"){r.offset=function(){var t;t=n[m]("viewportHeight");if(!n.isWindow(e.element)){t=e.$element.height()}return t-n(this).outerHeight()}}this.$element=t;this.element=t[0];this.axis=r.horizontal?"horizontal":"vertical";this.callback=r.handler;this.context=e;this.enabled=r.enabled;this.id="waypoints"+v++;this.offset=null;this.options=r;e.waypoints[this.axis][this.id]=this;s[this.axis][this.id]=this;i=(o=this.element[w])!=null?o:[];i.push(this.id);this.element[w]=i}t.prototype.trigger=function(t){if(!this.enabled){return}if(this.callback!=null){this.callback.apply(this.element,t)}if(this.options.triggerOnce){return this.destroy()}};t.prototype.disable=function(){return this.enabled=false};t.prototype.enable=function(){this.context.refresh();return this.enabled=true};t.prototype.destroy=function(){delete s[this.axis][this.id];delete this.context.waypoints[this.axis][this.id];return this.context.checkEmpty()};t.getWaypointsByElement=function(t){var e,r;r=t[w];if(!r){return[]}e=n.extend({},s.horizontal,s.vertical);return n.map(r,function(t){return e[t]})};return t}();d={init:function(t,e){var r;e=n.extend({},n.fn[g].defaults,e);if((r=e.handler)==null){e.handler=t}this.each(function(){var t,r,i,s;t=n(this);i=(s=e.context)!=null?s:n.fn[g].defaults.context;if(!n.isWindow(i)){i=t.closest(i)}i=n(i);r=c[i[0][u]];if(!r){r=new o(i)}return new l(t,r,e)});n[m]("refresh");return this},disable:function(){return d._invoke.call(this,"disable")},enable:function(){return d._invoke.call(this,"enable")},destroy:function(){return d._invoke.call(this,"destroy")},prev:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(e>0){return t.push(n[e-1])}})},next:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(et.oldScroll.y})},left:function(t){if(t==null){t=r}return h._filter(t,"horizontal",function(t,e){return e.offset<=t.oldScroll.x})},right:function(t){if(t==null){t=r}return h._filter(t,"horizontal",function(t,e){return e.offset>t.oldScroll.x})},enable:function(){return h._invoke("enable")},disable:function(){return h._invoke("disable")},destroy:function(){return h._invoke("destroy")},extendFn:function(t,e){return d[t]=e},_invoke:function(t){var e;e=n.extend({},s.vertical,s.horizontal);return n.each(e,function(e,n){n[t]();return true})},_filter:function(t,e,r){var i,o;i=c[n(t)[0][u]];if(!i){return[]}o=[];n.each(i.waypoints[e],function(t,e){if(r(i,e)){return o.push(e)}});o.sort(function(t,e){return t.offset-e.offset});return n.map(o,function(t){return t.element})}};n[m]=function(){var t,n;n=arguments[0],t=2<=arguments.length?e.call(arguments,1):[];if(h[n]){return h[n].apply(null,t)}else{return h.aggregate.call(null,n)}};n[m].settings={resizeThrottle:100,scrollThrottle:30};return i.on("load.waypoints",function(){return n[m]("refresh")})})}).call(this); /* Sticky Elements Shortcut for jQuery Waypoints - v2.0.5 Copyright (c) 2011-2014 Caleb Troughton Licensed under the MIT license. https://github.com/imakewebthings/jquery-waypoints/blob/master/licenses.txt */ ;(function(){(function(t,n){if(typeof define==="function"&&define.amd){return define(["jquery","waypoints"],n)}else{return n(t.jQuery)}})(window,function(t){var n,i;n={wrapper:'
    ',stuckClass:"stuck",direction:"down right"};i=function(t,n){var i;t.wrap(n.wrapper);i=t.parent();return i.data("isWaypointStickyWrapper",true)};t.waypoints("extendFn","sticky",function(r){var e,a,s;a=t.extend({},t.fn.waypoint.defaults,n,r);e=i(this,a);s=a.handler;a.handler=function(n){var i,r;i=t(this).children(":first");r=a.direction.indexOf(n)!==-1;i.toggleClass(a.stuckClass,r);e.height(r?i.outerHeight():"");if(s!=null){return s.call(this,n)}};e.waypoint(a);return this.data("stuckClass",a.stuckClass)});return t.waypoints("extendFn","unsticky",function(){var t;t=this.parent();if(!t.data("isWaypointStickyWrapper")){return this}t.waypoint("destroy");this.unwrap();return this.removeClass(this.data("stuckClass"))})})}).call(this); // Code syntax highlighting by highlight.js hljs.initHighlightingOnLoad(); $(function() { // Initiate scroll effects var s = skrollr.init({ smoothScrolling: false, forceHeight: false }); // Keep header stuck to top after scrolling down $('header').waypoint('sticky'); // Show 3 random lovers/users of Papa Parse from // the list defined in lovers.js $('.lover').each(function() { var i = randomInt(0, peopleLovePapa.length-1); var lover = peopleLovePapa.splice(i, 1)[0]; var val = ""; if (lover.link) val += ''+lover.name+' '; else val += lover.name+' '; val += lover.description; if (lover.quote) val += ' "'+lover.quote+'"'; $(this).html(val); }); // Schedule the ticker to change every so often setInterval(function() { var $current = $('.ticker-item.current'); var $next = $current.next('.ticker-item'); if (!$next.length) $next = $current.siblings('.ticker-item').first(); $current.removeClass('current'); setTimeout(function() { $next.addClass('current'); }, 500); // at least as long as the CSS transition }, 7000); }); ================================================ FILE: docs/resources/js/lovers.js ================================================ /** INSTRUCTIONS If you use Papa Parse, add your site/project/company to the list below. Here is a description of the fields: link: (optional) The URL to your web site name: The name of the site/project/company description: Say why Papa Parse is important to your application. The name is prepended to this description when rendered. Make sure that it reads as a fluid sentence when the name is concatenated with the description. quote: (optional) A short testimonial of what you think of Papa Parse. Note that the name and description are required. Please use English and keep the length similar to existing entries; entries that are too long or extremely short should be edited before being accepted. Thanks for being a part of Papa Parse! **/ var peopleLovePapa = [ { link: "http://doctempleapp.com", name: "DocTemple", description: "helps you effortlessly populate .docx documents with .csv data using scalable templating solution.", quote: "Papa Parse made it extremely easy to load user CSV files in the browser. Implementing it was a breeze and it works perfect!" }, { link: "https://www.vertex.io", name: "The no-code database of the future.", description: "No-code, Postgres-powered admin, internal tools, and backend suite.", quote: "Vertex uses Papa to power all CSV related features!" }, { link: "https://www.circlehd.com", name: "CircleHD Enterprise Video Platform", description: "Makes provisioning users easy as cake in CircleHD", quote: "Papa made it easy for our React devs to be able to import and parse the user data files in CSV format, all in browser." }, { link: "https://smartystreets.com", name: "SmartyStreets", description: "verifies addresses, many of which are submitted in CSV files. Papa Parse can process files with over a million addresses in the browser.", quote: "Because of Papa Parse, we rapidly built an awesome client-side list processing service." }, { link: "http://jannah.github.io/MetaReader", name: "MetaReader", description: "helps you see your data from a meta perspective before you start detailed analysis.", quote: "Papa Parse made it very easy to load and ready user CSV files in the browser on the client side." }, { link: "https://github.com/JamesJansson/EpiML", name: "EpiML", description: "is an agent-based mathematical model for the web, still in its early stages of development.", quote: "Papa makes it so easy to use CSV, which is good for scientists." }, { link: "https://www.mediawiki.org/wiki/VisualEditor", name: "Wikipedia", description: "uses Papa Parse in VisualEditor to help article editors effortlessly build data tables from text files." }, { link: "https://github.com/Nanofus/novel.js", name: "Novel.js", description: "is a text adventure framework that uses Papa Parse to enable user-friendly translations.", quote: "Papa saves countless hours of work and makes reading large CSV files so easy!" }, { link: "https://mailcheck.co", name: "Mailcheck.co", description: "Mailcheck is email validation service. All emails usually stored in CSV's. We use Papa Parse to process data from our customers in browser", quote: "Papa Parser allowed our customers to preview and process csv's in browser, without uploading them to server. It saves lots of time and space :)" }, { link: "https://flatfile.io", name: "Flatfile.io", description: "is an add-in data importer for web-apps, providing the full UX to upload a spreadsheet, field match, and repair issues found during import.", quote: "Papa is a core part of our importer, so much so that we're committed to helping maintain it!" }, { link: "https://familiohq.com", name: "Familio", description: "is a brand-new messaging app made specifically for busy families. Automatically align all family members when sending text messages to parents in the kindergarten or school or when planning your kids birthday parties.", quote: "With Papa it was a joy to implement our tool for importing messages and places from external systems." }, { link: "https://monei.net", name: "MONEI", description: "Digital payments made easy.", quote: "With Papa life became much easier for us to manage huge csv payments files of our merchants." }, { link: "https://moonmail.io", name: "MoonMail", description: "OmniChannel Communication Platform powered by AWS PinPoint", quote: "Papa makes contact imports a plain sailing." }, { link: "https://apps.shopify.com/wholesaler", name: "Wholesaler for Shopify", description: "Shopify App to offer Wholesaling within one unique Shopify store", quote: "Super fast bulk Wholesale product price uploads. Love Papa!." }, { link: "https://www.unnitmetaliya.com/sop-sample/", name: "Visa SOP Sample", description: "Providing free guide to international students.", quote: "Use Papa Parse for many of side projects. Super fast and works all the time. Love it!" }, { link: "https://retool.com/", name: "Retool", description: "A remarkably fast way to build internal tools.", quote: "Papa makes it easy for our users to customize CSV parsing to match their business logic." }, { link: "https://www.hellodata.ai/", name: "HelloData", description: "Automatic rent surveys with real-time data on over 25M multifamily units nationwide, direct from property websites.", quote: "Papa Parse makes bulk data imports a breeze! It's helped us easily onboard our largest customers. It's robust and a true game-changer." } ]; ================================================ FILE: docs/resources/js/papaparse.js ================================================ /* @license Papa Parse v5.0.0 https://github.com/mholt/PapaParse License: MIT */ (function(root, factory) { /* globals define */ if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof module === 'object' && typeof exports !== 'undefined') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } else { // Browser globals (root is window) root.Papa = factory(); } // in strict mode we cannot access arguments.callee, so we need a named reference to // stringify the factory method for the blob worker // eslint-disable-next-line func-name }(this, function moduleFactory() { 'use strict'; var global = (function() { // alternative method, similar to `Function('return this')()` // but without using `eval` (which is disabled when // using Content Security Policy). if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } // When running tests none of the above have been defined return {}; })(); function getWorkerBlob() { var URL = global.URL || global.webkitURL || null; var code = moduleFactory.toString(); return Papa.BLOB_URL || (Papa.BLOB_URL = URL.createObjectURL(new Blob(['(', code, ')();'], {type: 'text/javascript'}))); } var IS_WORKER = !global.document && !!global.postMessage, IS_PAPA_WORKER = IS_WORKER && /blob:/i.test((global.location || {}).protocol); var workers = {}, workerIdCounter = 0; var Papa = {}; Papa.parse = CsvToJson; Papa.unparse = JsonToCsv; Papa.RECORD_SEP = String.fromCharCode(30); Papa.UNIT_SEP = String.fromCharCode(31); Papa.BYTE_ORDER_MARK = '\ufeff'; Papa.BAD_DELIMITERS = ['\r', '\n', '"', Papa.BYTE_ORDER_MARK]; Papa.WORKERS_SUPPORTED = !IS_WORKER && !!global.Worker; Papa.NODE_STREAM_INPUT = 1; // Configurable chunk sizes for local and remote files, respectively Papa.LocalChunkSize = 1024 * 1024 * 10; // 10 MB Papa.RemoteChunkSize = 1024 * 1024 * 5; // 5 MB Papa.DefaultDelimiter = ','; // Used if not specified and detection fails // Exposed for testing and development only Papa.Parser = Parser; Papa.ParserHandle = ParserHandle; Papa.NetworkStreamer = NetworkStreamer; Papa.FileStreamer = FileStreamer; Papa.StringStreamer = StringStreamer; Papa.ReadableStreamStreamer = ReadableStreamStreamer; if (typeof PAPA_BROWSER_CONTEXT === 'undefined') { Papa.DuplexStreamStreamer = DuplexStreamStreamer; } if (global.jQuery) { var $ = global.jQuery; $.fn.parse = function(options) { var config = options.config || {}; var queue = []; this.each(function(idx) { var supported = $(this).prop('tagName').toUpperCase() === 'INPUT' && $(this).attr('type').toLowerCase() === 'file' && global.FileReader; if (!supported || !this.files || this.files.length === 0) return true; // continue to next input element for (var i = 0; i < this.files.length; i++) { queue.push({ file: this.files[i], inputElem: this, instanceConfig: $.extend({}, config) }); } }); parseNextFile(); // begin parsing return this; // maintains chainability function parseNextFile() { if (queue.length === 0) { if (isFunction(options.complete)) options.complete(); return; } var f = queue[0]; if (isFunction(options.before)) { var returned = options.before(f.file, f.inputElem); if (typeof returned === 'object') { if (returned.action === 'abort') { error('AbortError', f.file, f.inputElem, returned.reason); return; // Aborts all queued files immediately } else if (returned.action === 'skip') { fileComplete(); // parse the next file in the queue, if any return; } else if (typeof returned.config === 'object') f.instanceConfig = $.extend(f.instanceConfig, returned.config); } else if (returned === 'skip') { fileComplete(); // parse the next file in the queue, if any return; } } // Wrap up the user's complete callback, if any, so that ours also gets executed var userCompleteFunc = f.instanceConfig.complete; f.instanceConfig.complete = function(results) { if (isFunction(userCompleteFunc)) userCompleteFunc(results, f.file, f.inputElem); fileComplete(); }; Papa.parse(f.file, f.instanceConfig); } function error(name, file, elem, reason) { if (isFunction(options.error)) options.error({name: name}, file, elem, reason); } function fileComplete() { queue.splice(0, 1); parseNextFile(); } }; } if (IS_PAPA_WORKER) { global.onmessage = workerThreadReceivedMessage; } function CsvToJson(_input, _config) { _config = _config || {}; var dynamicTyping = _config.dynamicTyping || false; if (isFunction(dynamicTyping)) { _config.dynamicTypingFunction = dynamicTyping; // Will be filled on first row call dynamicTyping = {}; } _config.dynamicTyping = dynamicTyping; _config.transform = isFunction(_config.transform) ? _config.transform : false; if (_config.worker && Papa.WORKERS_SUPPORTED) { var w = newWorker(); w.userStep = _config.step; w.userChunk = _config.chunk; w.userComplete = _config.complete; w.userError = _config.error; _config.step = isFunction(_config.step); _config.chunk = isFunction(_config.chunk); _config.complete = isFunction(_config.complete); _config.error = isFunction(_config.error); delete _config.worker; // prevent infinite loop w.postMessage({ input: _input, config: _config, workerId: w.id }); return; } var streamer = null; if (_input === Papa.NODE_STREAM_INPUT && typeof PAPA_BROWSER_CONTEXT === 'undefined') { // create a node Duplex stream for use // with .pipe streamer = new DuplexStreamStreamer(_config); return streamer.getStream(); } else if (typeof _input === 'string') { if (_config.download) streamer = new NetworkStreamer(_config); else streamer = new StringStreamer(_config); } else if (_input.readable === true && isFunction(_input.read) && isFunction(_input.on)) { streamer = new ReadableStreamStreamer(_config); } else if ((global.File && _input instanceof File) || _input instanceof Object) // ...Safari. (see issue #106) streamer = new FileStreamer(_config); return streamer.stream(_input); } function JsonToCsv(_input, _config) { // Default configuration /** whether to surround every datum with quotes */ var _quotes = false; /** whether to write headers */ var _writeHeader = true; /** delimiting character(s) */ var _delimiter = ','; /** newline character(s) */ var _newline = '\r\n'; /** quote character */ var _quoteChar = '"'; /** escaped quote character, either "" or " */ var _escapedQuote = _quoteChar + _quoteChar; /** whether to skip empty lines */ var _skipEmptyLines = false; /** the columns (keys) we expect when we unparse objects */ var _columns = null; unpackConfig(); var quoteCharRegex = new RegExp(escapeRegExp(_quoteChar), 'g'); if (typeof _input === 'string') _input = JSON.parse(_input); if (Array.isArray(_input)) { if (!_input.length || Array.isArray(_input[0])) return serialize(null, _input, _skipEmptyLines); else if (typeof _input[0] === 'object') return serialize(_columns || objectKeys(_input[0]), _input, _skipEmptyLines); } else if (typeof _input === 'object') { if (typeof _input.data === 'string') _input.data = JSON.parse(_input.data); if (Array.isArray(_input.data)) { if (!_input.fields) _input.fields = _input.meta && _input.meta.fields; if (!_input.fields) _input.fields = Array.isArray(_input.data[0]) ? _input.fields : objectKeys(_input.data[0]); if (!(Array.isArray(_input.data[0])) && typeof _input.data[0] !== 'object') _input.data = [_input.data]; // handles input like [1,2,3] or ['asdf'] } return serialize(_input.fields || [], _input.data || [], _skipEmptyLines); } // Default (any valid paths should return before this) throw new Error('Unable to serialize unrecognized input'); function unpackConfig() { if (typeof _config !== 'object') return; if (typeof _config.delimiter === 'string' && !Papa.BAD_DELIMITERS.filter(function(value) { return _config.delimiter.indexOf(value) !== -1; }).length) { _delimiter = _config.delimiter; } if (typeof _config.quotes === 'boolean' || Array.isArray(_config.quotes)) _quotes = _config.quotes; if (typeof _config.skipEmptyLines === 'boolean' || typeof _config.skipEmptyLines === 'string') _skipEmptyLines = _config.skipEmptyLines; if (typeof _config.newline === 'string') _newline = _config.newline; if (typeof _config.quoteChar === 'string') _quoteChar = _config.quoteChar; if (typeof _config.header === 'boolean') _writeHeader = _config.header; if (Array.isArray(_config.columns)) { if (_config.columns.length === 0) throw new Error('Option columns is empty'); _columns = _config.columns; } if (_config.escapeChar !== undefined) { _escapedQuote = _config.escapeChar + _quoteChar; } } /** Turns an object's keys into an array */ function objectKeys(obj) { if (typeof obj !== 'object') return []; var keys = []; for (var key in obj) keys.push(key); return keys; } /** The double for loop that iterates the data and writes out a CSV string including header row */ function serialize(fields, data, skipEmptyLines) { var csv = ''; if (typeof fields === 'string') fields = JSON.parse(fields); if (typeof data === 'string') data = JSON.parse(data); var hasHeader = Array.isArray(fields) && fields.length > 0; var dataKeyedByField = !(Array.isArray(data[0])); // If there a header row, write it first if (hasHeader && _writeHeader) { for (var i = 0; i < fields.length; i++) { if (i > 0) csv += _delimiter; csv += safe(fields[i], i); } if (data.length > 0) csv += _newline; } // Then write out the data for (var row = 0; row < data.length; row++) { var maxCol = hasHeader ? fields.length : data[row].length; var emptyLine = false; var nullLine = hasHeader ? Object.keys(data[row]).length === 0 : data[row].length === 0; if (skipEmptyLines && !hasHeader) { emptyLine = skipEmptyLines === 'greedy' ? data[row].join('').trim() === '' : data[row].length === 1 && data[row][0].length === 0; } if (skipEmptyLines === 'greedy' && hasHeader) { var line = []; for (var c = 0; c < maxCol; c++) { var cx = dataKeyedByField ? fields[c] : c; line.push(data[row][cx]); } emptyLine = line.join('').trim() === ''; } if (!emptyLine) { for (var col = 0; col < maxCol; col++) { if (col > 0 && !nullLine) csv += _delimiter; var colIdx = hasHeader && dataKeyedByField ? fields[col] : col; csv += safe(data[row][colIdx], col); } if (row < data.length - 1 && (!skipEmptyLines || (maxCol > 0 && !nullLine))) { csv += _newline; } } } return csv; } /** Encloses a value around quotes if needed (makes a value safe for CSV insertion) */ function safe(str, col) { if (typeof str === 'undefined' || str === null) return ''; if (str.constructor === Date) return JSON.stringify(str).slice(1, 25); str = str.toString().replace(quoteCharRegex, _escapedQuote); var needsQuotes = (typeof _quotes === 'boolean' && _quotes) || (Array.isArray(_quotes) && _quotes[col]) || hasAny(str, Papa.BAD_DELIMITERS) || str.indexOf(_delimiter) > -1 || str.charAt(0) === ' ' || str.charAt(str.length - 1) === ' '; return needsQuotes ? _quoteChar + str + _quoteChar : str; } function hasAny(str, substrings) { for (var i = 0; i < substrings.length; i++) if (str.indexOf(substrings[i]) > -1) return true; return false; } } /** ChunkStreamer is the base prototype for various streamer implementations. */ function ChunkStreamer(config) { this._handle = null; this._finished = false; this._completed = false; this._halted = false; this._input = null; this._baseIndex = 0; this._partialLine = ''; this._rowCount = 0; this._start = 0; this._nextChunk = null; this.isFirstChunk = true; this._completeResults = { data: [], errors: [], meta: {} }; replaceConfig.call(this, config); this.parseChunk = function(chunk, isFakeChunk) { // First chunk pre-processing const skipFirstNLines = parseInt(this._config.skipFirstNLines) || 0; if (this.isFirstChunk && skipFirstNLines > 0) { let _newline = this._config.newline; if (!_newline) { const quoteChar = this._config.quoteChar || '"'; _newline = this._handle.guessLineEndings(chunk, quoteChar); } const splitChunk = chunk.split(_newline); chunk = [...splitChunk.slice(skipFirstNLines)].join(_newline); } if (this.isFirstChunk && isFunction(this._config.beforeFirstChunk)) { var modifiedChunk = this._config.beforeFirstChunk(chunk); if (modifiedChunk !== undefined) chunk = modifiedChunk; } this.isFirstChunk = false; this._halted = false; // Rejoin the line we likely just split in two by chunking the file var aggregate = this._partialLine + chunk; this._partialLine = ''; var results = this._handle.parse(aggregate, this._baseIndex, !this._finished); if (this._handle.paused() || this._handle.aborted()) { this._halted = true; return; } var lastIndex = results.meta.cursor; if (!this._finished) { this._partialLine = aggregate.substring(lastIndex - this._baseIndex); this._baseIndex = lastIndex; } if (results && results.data) this._rowCount += results.data.length; var finishedIncludingPreview = this._finished || (this._config.preview && this._rowCount >= this._config.preview); if (IS_PAPA_WORKER) { global.postMessage({ results: results, workerId: Papa.WORKER_ID, finished: finishedIncludingPreview }); } else if (isFunction(this._config.chunk) && !isFakeChunk) { this._config.chunk(results, this._handle); if (this._handle.paused() || this._handle.aborted()) { this._halted = true; return; } results = undefined; this._completeResults = undefined; } if (!this._config.step && !this._config.chunk) { this._completeResults.data = this._completeResults.data.concat(results.data); this._completeResults.errors = this._completeResults.errors.concat(results.errors); this._completeResults.meta = results.meta; } if (!this._completed && finishedIncludingPreview && isFunction(this._config.complete) && (!results || !results.meta.aborted)) { this._config.complete(this._completeResults, this._input); this._completed = true; } if (!finishedIncludingPreview && (!results || !results.meta.paused)) this._nextChunk(); return results; }; this._sendError = function(error) { if (isFunction(this._config.error)) this._config.error(error); else if (IS_PAPA_WORKER && this._config.error) { global.postMessage({ workerId: Papa.WORKER_ID, error: error, finished: false }); } }; function replaceConfig(config) { // Deep-copy the config so we can edit it var configCopy = copy(config); configCopy.chunkSize = parseInt(configCopy.chunkSize); // parseInt VERY important so we don't concatenate strings! if (!config.step && !config.chunk) configCopy.chunkSize = null; // disable Range header if not streaming; bad values break IIS - see issue #196 this._handle = new ParserHandle(configCopy); this._handle.streamer = this; this._config = configCopy; // persist the copy to the caller } } function NetworkStreamer(config) { config = config || {}; if (!config.chunkSize) config.chunkSize = Papa.RemoteChunkSize; ChunkStreamer.call(this, config); var xhr; if (IS_WORKER) { this._nextChunk = function() { this._readChunk(); this._chunkLoaded(); }; } else { this._nextChunk = function() { this._readChunk(); }; } this.stream = function(url) { this._input = url; this._nextChunk(); // Starts streaming }; this._readChunk = function() { if (this._finished) { this._chunkLoaded(); return; } xhr = new XMLHttpRequest(); if (this._config.withCredentials) { xhr.withCredentials = this._config.withCredentials; } if (!IS_WORKER) { xhr.onload = bindFunction(this._chunkLoaded, this); xhr.onerror = bindFunction(this._chunkError, this); } xhr.open('GET', this._input, !IS_WORKER); // Headers can only be set when once the request state is OPENED if (this._config.downloadRequestHeaders) { var headers = this._config.downloadRequestHeaders; for (var headerName in headers) { xhr.setRequestHeader(headerName, headers[headerName]); } } if (this._config.chunkSize) { var end = this._start + this._config.chunkSize - 1; // minus one because byte range is inclusive xhr.setRequestHeader('Range', 'bytes=' + this._start + '-' + end); } try { xhr.send(); } catch (err) { this._chunkError(err.message); } if (IS_WORKER && xhr.status === 0) this._chunkError(); else this._start += this._config.chunkSize; }; this._chunkLoaded = function() { if (xhr.readyState !== 4) return; if (xhr.status < 200 || xhr.status >= 400) { this._chunkError(); return; } this._finished = !this._config.chunkSize || this._start > getFileSize(xhr); this.parseChunk(xhr.responseText); }; this._chunkError = function(errorMessage) { var errorText = xhr.statusText || errorMessage; this._sendError(new Error(errorText)); }; function getFileSize(xhr) { var contentRange = xhr.getResponseHeader('Content-Range'); if (contentRange === null) { // no content range, then finish! return -1; } return parseInt(contentRange.substr(contentRange.lastIndexOf('/') + 1)); } } NetworkStreamer.prototype = Object.create(ChunkStreamer.prototype); NetworkStreamer.prototype.constructor = NetworkStreamer; function FileStreamer(config) { config = config || {}; if (!config.chunkSize) config.chunkSize = Papa.LocalChunkSize; ChunkStreamer.call(this, config); var reader, slice; // FileReader is better than FileReaderSync (even in worker) - see http://stackoverflow.com/q/24708649/1048862 // But Firefox is a pill, too - see issue #76: https://github.com/mholt/PapaParse/issues/76 var usingAsyncReader = typeof FileReader !== 'undefined'; // Safari doesn't consider it a function - see issue #105 this.stream = function(file) { this._input = file; slice = file.slice || file.webkitSlice || file.mozSlice; if (usingAsyncReader) { reader = new FileReader(); // Preferred method of reading files, even in workers reader.onload = bindFunction(this._chunkLoaded, this); reader.onerror = bindFunction(this._chunkError, this); } else reader = new FileReaderSync(); // Hack for running in a web worker in Firefox this._nextChunk(); // Starts streaming }; this._nextChunk = function() { if (!this._finished && (!this._config.preview || this._rowCount < this._config.preview)) this._readChunk(); }; this._readChunk = function() { var input = this._input; if (this._config.chunkSize) { var end = Math.min(this._start + this._config.chunkSize, this._input.size); input = slice.call(input, this._start, end); } var txt = reader.readAsText(input, this._config.encoding); if (!usingAsyncReader) this._chunkLoaded({ target: { result: txt } }); // mimic the async signature }; this._chunkLoaded = function(event) { // Very important to increment start each time before handling results this._start += this._config.chunkSize; this._finished = !this._config.chunkSize || this._start >= this._input.size; this.parseChunk(event.target.result); }; this._chunkError = function() { this._sendError(reader.error); }; } FileStreamer.prototype = Object.create(ChunkStreamer.prototype); FileStreamer.prototype.constructor = FileStreamer; function StringStreamer(config) { config = config || {}; ChunkStreamer.call(this, config); var remaining; this.stream = function(s) { remaining = s; return this._nextChunk(); }; this._nextChunk = function() { if (this._finished) return; var size = this._config.chunkSize; var chunk = size ? remaining.substr(0, size) : remaining; remaining = size ? remaining.substr(size) : ''; this._finished = !remaining; return this.parseChunk(chunk); }; } StringStreamer.prototype = Object.create(StringStreamer.prototype); StringStreamer.prototype.constructor = StringStreamer; function ReadableStreamStreamer(config) { config = config || {}; ChunkStreamer.call(this, config); var queue = []; var parseOnData = true; var streamHasEnded = false; this.pause = function() { ChunkStreamer.prototype.pause.apply(this, arguments); this._input.pause(); }; this.resume = function() { ChunkStreamer.prototype.resume.apply(this, arguments); this._input.resume(); }; this.stream = function(stream) { this._input = stream; this._input.on('data', this._streamData); this._input.on('end', this._streamEnd); this._input.on('error', this._streamError); }; this._checkIsFinished = function() { if (streamHasEnded && queue.length === 1) { this._finished = true; } }; this._nextChunk = function() { this._checkIsFinished(); if (queue.length) { this.parseChunk(queue.shift()); } else { parseOnData = true; } }; this._streamData = bindFunction(function(chunk) { try { queue.push(typeof chunk === 'string' ? chunk : chunk.toString(this._config.encoding)); if (parseOnData) { parseOnData = false; this._checkIsFinished(); this.parseChunk(queue.shift()); } } catch (error) { this._streamError(error); } }, this); this._streamError = bindFunction(function(error) { this._streamCleanUp(); this._sendError(error); }, this); this._streamEnd = bindFunction(function() { this._streamCleanUp(); streamHasEnded = true; this._streamData(''); }, this); this._streamCleanUp = bindFunction(function() { this._input.removeListener('data', this._streamData); this._input.removeListener('end', this._streamEnd); this._input.removeListener('error', this._streamError); }, this); } ReadableStreamStreamer.prototype = Object.create(ChunkStreamer.prototype); ReadableStreamStreamer.prototype.constructor = ReadableStreamStreamer; function DuplexStreamStreamer(_config) { var Duplex = require('stream').Duplex; var config = copy(_config); var parseOnWrite = true; var writeStreamHasFinished = false; var parseCallbackQueue = []; var stream = null; this._onCsvData = function(results) { var data = results.data; if (!stream.push(data) && !this._handle.paused()) { // the writeable consumer buffer has filled up // so we need to pause until more items // can be processed this._handle.pause(); } }; this._onCsvComplete = function() { // node will finish the read stream when // null is pushed stream.push(null); }; config.step = bindFunction(this._onCsvData, this); config.complete = bindFunction(this._onCsvComplete, this); ChunkStreamer.call(this, config); this._nextChunk = function() { if (writeStreamHasFinished && parseCallbackQueue.length === 1) { this._finished = true; } if (parseCallbackQueue.length) { parseCallbackQueue.shift()(); } else { parseOnWrite = true; } }; this._addToParseQueue = function(chunk, callback) { // add to queue so that we can indicate // completion via callback // node will automatically pause the incoming stream // when too many items have been added without their // callback being invoked parseCallbackQueue.push(bindFunction(function() { this.parseChunk(typeof chunk === 'string' ? chunk : chunk.toString(config.encoding)); if (isFunction(callback)) { return callback(); } }, this)); if (parseOnWrite) { parseOnWrite = false; this._nextChunk(); } }; this._onRead = function() { if (this._handle.paused()) { // the writeable consumer can handle more data // so resume the chunk parsing this._handle.resume(); } }; this._onWrite = function(chunk, encoding, callback) { this._addToParseQueue(chunk, callback); }; this._onWriteComplete = function() { writeStreamHasFinished = true; // have to write empty string // so parser knows its done this._addToParseQueue(''); }; this.getStream = function() { return stream; }; stream = new Duplex({ readableObjectMode: true, decodeStrings: false, read: bindFunction(this._onRead, this), write: bindFunction(this._onWrite, this) }); stream.once('finish', bindFunction(this._onWriteComplete, this)); } if (typeof PAPA_BROWSER_CONTEXT === 'undefined') { DuplexStreamStreamer.prototype = Object.create(ChunkStreamer.prototype); DuplexStreamStreamer.prototype.constructor = DuplexStreamStreamer; } // Use one ParserHandle per entire CSV file or string function ParserHandle(_config) { // One goal is to minimize the use of regular expressions... var FLOAT = /^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i; var ISO_DATE = /(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/; var self = this; var _stepCounter = 0; // Number of times step was called (number of rows parsed) var _rowCounter = 0; // Number of rows that have been parsed so far var _input; // The input being parsed var _parser; // The core parser being used var _paused = false; // Whether we are paused or not var _aborted = false; // Whether the parser has aborted or not var _delimiterError; // Temporary state between delimiter detection and processing results var _fields = []; // Fields are from the header row of the input, if there is one var _results = { // The last results returned from the parser data: [], errors: [], meta: {} }; if (isFunction(_config.step)) { var userStep = _config.step; _config.step = function(results) { _results = results; if (needsHeaderRow()) processResults(); else // only call user's step function after header row { processResults(); // It's possbile that this line was empty and there's no row here after all if (_results.data.length === 0) return; _stepCounter += results.data.length; if (_config.preview && _stepCounter > _config.preview) _parser.abort(); else userStep(_results, self); } }; } /** * Parses input. Most users won't need, and shouldn't mess with, the baseIndex * and ignoreLastRow parameters. They are used by streamers (wrapper functions) * when an input comes in multiple chunks, like from a file. */ this.parse = function(input, baseIndex, ignoreLastRow) { var quoteChar = _config.quoteChar || '"'; if (!_config.newline) _config.newline = this.guessLineEndings(input, quoteChar); _delimiterError = false; if (!_config.delimiter) { var delimGuess = guessDelimiter(input, _config.newline, _config.skipEmptyLines, _config.comments, _config.delimitersToGuess); if (delimGuess.successful) _config.delimiter = delimGuess.bestDelimiter; else { _delimiterError = true; // add error after parsing (otherwise it would be overwritten) _config.delimiter = Papa.DefaultDelimiter; } _results.meta.delimiter = _config.delimiter; } else if(isFunction(_config.delimiter)) { _config.delimiter = _config.delimiter(input); _results.meta.delimiter = _config.delimiter; } var parserConfig = copy(_config); if (_config.preview && _config.header) parserConfig.preview++; // to compensate for header row _input = input; _parser = new Parser(parserConfig); _results = _parser.parse(_input, baseIndex, ignoreLastRow); processResults(); return _paused ? { meta: { paused: true } } : (_results || { meta: { paused: false } }); }; this.paused = function() { return _paused; }; this.pause = function() { _paused = true; _parser.abort(); _input = _input.substr(_parser.getCharIndex()); }; this.resume = function() { if(self.streamer._halted) { _paused = false; self.streamer.parseChunk(_input, true); } else { // Bugfix: #636 In case the processing hasn't halted yet // wait for it to halt in order to resume setTimeout(this.resume, 3); } }; this.aborted = function() { return _aborted; }; this.abort = function() { _aborted = true; _parser.abort(); _results.meta.aborted = true; if (isFunction(_config.complete)) _config.complete(_results); _input = ''; }; this.guessLineEndings = function(input, quoteChar) { input = input.substr(0, 1024 * 1024); // max length 1 MB // Replace all the text inside quotes var re = new RegExp(escapeRegExp(quoteChar) + '([^]*?)' + escapeRegExp(quoteChar), 'gm'); input = input.replace(re, ''); var r = input.split('\r'); var n = input.split('\n'); var nAppearsFirst = (n.length > 1 && n[0].length < r[0].length); if (r.length === 1 || nAppearsFirst) return '\n'; var numWithN = 0; for (var i = 0; i < r.length; i++) { if (r[i][0] === '\n') numWithN++; } return numWithN >= r.length / 2 ? '\r\n' : '\r'; }; function testEmptyLine(s) { return _config.skipEmptyLines === 'greedy' ? s.join('').trim() === '' : s.length === 1 && s[0].length === 0; } function processResults() { if (_results && _delimiterError) { addError('Delimiter', 'UndetectableDelimiter', 'Unable to auto-detect delimiting character; defaulted to \'' + Papa.DefaultDelimiter + '\''); _delimiterError = false; } if (_config.skipEmptyLines) { for (var i = 0; i < _results.data.length; i++) if (testEmptyLine(_results.data[i])) _results.data.splice(i--, 1); } if (needsHeaderRow()) fillHeaderFields(); return applyHeaderAndDynamicTypingAndTransformation(); } function needsHeaderRow() { return _config.header && _fields.length === 0; } function fillHeaderFields() { if (!_results) return; function addHeder(header) { if (isFunction(_config.transformHeader)) header = _config.transformHeader(header); _fields.push(header); } if (Array.isArray(_results.data[0])) { for (var i = 0; needsHeaderRow() && i < _results.data.length; i++) _results.data[i].forEach(addHeder); _results.data.splice(0, 1); } // if _results.data[0] is not an array, we are in a step where _results.data is the row. else _results.data.forEach(addHeder); } function shouldApplyDynamicTyping(field) { // Cache function values to avoid calling it for each row if (_config.dynamicTypingFunction && _config.dynamicTyping[field] === undefined) { _config.dynamicTyping[field] = _config.dynamicTypingFunction(field); } return (_config.dynamicTyping[field] || _config.dynamicTyping) === true; } function parseDynamic(field, value) { if (shouldApplyDynamicTyping(field)) { if (value === 'true' || value === 'TRUE') return true; else if (value === 'false' || value === 'FALSE') return false; else if (FLOAT.test(value)) return parseFloat(value); else if (ISO_DATE.test(value)) return new Date(value); else return (value === '' ? null : value); } return value; } function applyHeaderAndDynamicTypingAndTransformation() { if (!_results || (!_config.header && !_config.dynamicTyping && !_config.transform)) return _results; function processRow(rowSource, i) { var row = _config.header ? {} : []; var j; for (j = 0; j < rowSource.length; j++) { var field = j; var value = rowSource[j]; if (_config.header) field = j >= _fields.length ? '__parsed_extra' : _fields[j]; if (_config.transform) value = _config.transform(value,field); value = parseDynamic(field, value); if (field === '__parsed_extra') { row[field] = row[field] || []; row[field].push(value); } else row[field] = value; } if (_config.header) { if (j > _fields.length) addError('FieldMismatch', 'TooManyFields', 'Too many fields: expected ' + _fields.length + ' fields but parsed ' + j, _rowCounter + i); else if (j < _fields.length) addError('FieldMismatch', 'TooFewFields', 'Too few fields: expected ' + _fields.length + ' fields but parsed ' + j, _rowCounter + i); } return row; } var incrementBy = 1; if (!_results.data[0] || Array.isArray(_results.data[0])) { _results.data = _results.data.map(processRow); incrementBy = _results.data.length; } else _results.data = processRow(_results.data, 0); if (_config.header && _results.meta) _results.meta.fields = _fields; _rowCounter += incrementBy; return _results; } function guessDelimiter(input, newline, skipEmptyLines, comments, delimitersToGuess) { var bestDelim, bestDelta, fieldCountPrevRow; delimitersToGuess = delimitersToGuess || [',', '\t', '|', ';', Papa.RECORD_SEP, Papa.UNIT_SEP]; for (var i = 0; i < delimitersToGuess.length; i++) { var delim = delimitersToGuess[i]; var delta = 0, avgFieldCount = 0, emptyLinesCount = 0; fieldCountPrevRow = undefined; var preview = new Parser({ comments: comments, delimiter: delim, newline: newline, preview: 10 }).parse(input); for (var j = 0; j < preview.data.length; j++) { if (skipEmptyLines && testEmptyLine(preview.data[j])) { emptyLinesCount++; continue; } var fieldCount = preview.data[j].length; avgFieldCount += fieldCount; if (typeof fieldCountPrevRow === 'undefined') { fieldCountPrevRow = 0; continue; } else if (fieldCount > 1) { delta += Math.abs(fieldCount - fieldCountPrevRow); fieldCountPrevRow = fieldCount; } } if (preview.data.length > 0) avgFieldCount /= (preview.data.length - emptyLinesCount); if ((typeof bestDelta === 'undefined' || delta > bestDelta) && avgFieldCount > 1.99) { bestDelta = delta; bestDelim = delim; } } _config.delimiter = bestDelim; return { successful: !!bestDelim, bestDelimiter: bestDelim }; } function addError(type, code, msg, row) { _results.errors.push({ type: type, code: code, message: msg, row: row }); } } /** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions */ function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } /** The core parser implements speedy and correct CSV parsing */ function Parser(config) { // Unpack the config object config = config || {}; var delim = config.delimiter; var newline = config.newline; var comments = config.comments; var step = config.step; var preview = config.preview; var fastMode = config.fastMode; var quoteChar; /** Allows for no quoteChar by setting quoteChar to undefined in config */ if (config.quoteChar === undefined) { quoteChar = '"'; } else { quoteChar = config.quoteChar; } var escapeChar = quoteChar; if (config.escapeChar !== undefined) { escapeChar = config.escapeChar; } // Delimiter must be valid if (typeof delim !== 'string' || Papa.BAD_DELIMITERS.indexOf(delim) > -1) delim = ','; // Comment character must be valid if (comments === delim) throw new Error('Comment character same as delimiter'); else if (comments === true) comments = '#'; else if (typeof comments !== 'string' || Papa.BAD_DELIMITERS.indexOf(comments) > -1) comments = false; // Newline must be valid: \r, \n, or \r\n if (newline !== '\n' && newline !== '\r' && newline !== '\r\n') newline = '\n'; // We're gonna need these at the Parser scope var cursor = 0; var aborted = false; this.parse = function(input, baseIndex, ignoreLastRow) { // For some reason, in Chrome, this speeds things up (!?) if (typeof input !== 'string') throw new Error('Input must be a string'); // We don't need to compute some of these every time parse() is called, // but having them in a more local scope seems to perform better var inputLen = input.length, delimLen = delim.length, newlineLen = newline.length, commentsLen = comments.length; var stepIsFunction = isFunction(step); // Establish starting state cursor = 0; var data = [], errors = [], row = [], lastCursor = 0; if (!input) return returnable(); if (fastMode || (fastMode !== false && input.indexOf(quoteChar) === -1)) { var rows = input.split(newline); for (var i = 0; i < rows.length; i++) { row = rows[i]; cursor += row.length; if (i !== rows.length - 1) cursor += newline.length; else if (ignoreLastRow) return returnable(); if (comments && row.substr(0, commentsLen) === comments) continue; if (stepIsFunction) { data = []; pushRow(row.split(delim)); doStep(); if (aborted) return returnable(); } else pushRow(row.split(delim)); if (preview && i >= preview) { data = data.slice(0, preview); return returnable(true); } } return returnable(); } var nextDelim = input.indexOf(delim, cursor); var nextNewline = input.indexOf(newline, cursor); var quoteCharRegex = new RegExp(escapeRegExp(escapeChar) + escapeRegExp(quoteChar), 'g'); var quoteSearch = input.indexOf(quoteChar, cursor); // Parser loop for (;;) { // Field has opening quote if (input[cursor] === quoteChar) { // Start our search for the closing quote where the cursor is quoteSearch = cursor; // Skip the opening quote cursor++; for (;;) { // Find closing quote quoteSearch = input.indexOf(quoteChar, quoteSearch + 1); //No other quotes are found - no other delimiters if (quoteSearch === -1) { if (!ignoreLastRow) { // No closing quote... what a pity errors.push({ type: 'Quotes', code: 'MissingQuotes', message: 'Quoted field unterminated', row: data.length, // row has yet to be inserted index: cursor }); } return finish(); } // Closing quote at EOF if (quoteSearch === inputLen - 1) { var value = input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar); return finish(value); } // If this quote is escaped, it's part of the data; skip it // If the quote character is the escape character, then check if the next character is the escape character if (quoteChar === escapeChar && input[quoteSearch + 1] === escapeChar) { quoteSearch++; continue; } // If the quote character is not the escape character, then check if the previous character was the escape character if (quoteChar !== escapeChar && quoteSearch !== 0 && input[quoteSearch - 1] === escapeChar) { continue; } // Check up to nextDelim or nextNewline, whichever is closest var checkUpTo = nextNewline === -1 ? nextDelim : Math.min(nextDelim, nextNewline); var spacesBetweenQuoteAndDelimiter = extraSpaces(checkUpTo); // Closing quote followed by delimiter or 'unnecessary spaces + delimiter' if (input[quoteSearch + 1 + spacesBetweenQuoteAndDelimiter] === delim) { row.push(input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar)); cursor = quoteSearch + 1 + spacesBetweenQuoteAndDelimiter + delimLen; // If char after following delimiter is not quoteChar, we find next quote char position if (input[quoteSearch + 1 + spacesBetweenQuoteAndDelimiter + delimLen] !== quoteChar) { quoteSearch = input.indexOf(quoteChar, cursor); } nextDelim = input.indexOf(delim, cursor); nextNewline = input.indexOf(newline, cursor); break; } var spacesBetweenQuoteAndNewLine = extraSpaces(nextNewline); // Closing quote followed by newline or 'unnecessary spaces + newLine' if (input.substr(quoteSearch + 1 + spacesBetweenQuoteAndNewLine, newlineLen) === newline) { row.push(input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar)); saveRow(quoteSearch + 1 + spacesBetweenQuoteAndNewLine + newlineLen); nextDelim = input.indexOf(delim, cursor); // because we may have skipped the nextDelim in the quoted field quoteSearch = input.indexOf(quoteChar, cursor); // we search for first quote in next line if (stepIsFunction) { doStep(); if (aborted) return returnable(); } if (preview && data.length >= preview) return returnable(true); break; } // Checks for valid closing quotes are complete (escaped quotes or quote followed by EOF/delimiter/newline) -- assume these quotes are part of an invalid text string errors.push({ type: 'Quotes', code: 'InvalidQuotes', message: 'Trailing quote on quoted field is malformed', row: data.length, // row has yet to be inserted index: cursor }); quoteSearch++; continue; } continue; } // Comment found at start of new line if (comments && row.length === 0 && input.substr(cursor, commentsLen) === comments) { if (nextNewline === -1) // Comment ends at EOF return returnable(); cursor = nextNewline + newlineLen; nextNewline = input.indexOf(newline, cursor); nextDelim = input.indexOf(delim, cursor); continue; } // Next delimiter comes before next newline, so we've reached end of field if (nextDelim !== -1 && (nextDelim < nextNewline || nextNewline === -1)) { // we check, if we have quotes, because delimiter char may be part of field enclosed in quotes if (quoteSearch !== -1) { // we have quotes, so we try to find the next delimiter not enclosed in quotes and also next starting quote char var nextDelimObj = getNextUnqotedDelimiter(nextDelim, quoteSearch, nextNewline); // if we have next delimiter char which is not enclosed in quotes if (nextDelimObj && nextDelimObj.nextDelim) { nextDelim = nextDelimObj.nextDelim; quoteSearch = nextDelimObj.quoteSearch; row.push(input.substring(cursor, nextDelim)); cursor = nextDelim + delimLen; // we look for next delimiter char nextDelim = input.indexOf(delim, cursor); continue; } } else { row.push(input.substring(cursor, nextDelim)); cursor = nextDelim + delimLen; nextDelim = input.indexOf(delim, cursor); continue; } } // End of row if (nextNewline !== -1) { row.push(input.substring(cursor, nextNewline)); saveRow(nextNewline + newlineLen); if (stepIsFunction) { doStep(); if (aborted) return returnable(); } if (preview && data.length >= preview) return returnable(true); continue; } break; } return finish(); function pushRow(row) { data.push(row); lastCursor = cursor; } /** * checks if there are extra spaces after closing quote and given index without any text * if Yes, returns the number of spaces */ function extraSpaces(index) { var spaceLength = 0; if (index !== -1) { var textBetweenClosingQuoteAndIndex = input.substring(quoteSearch + 1, index); if (textBetweenClosingQuoteAndIndex && textBetweenClosingQuoteAndIndex.trim() === '') { spaceLength = textBetweenClosingQuoteAndIndex.length; } } return spaceLength; } /** * Appends the remaining input from cursor to the end into * row, saves the row, calls step, and returns the results. */ function finish(value) { if (ignoreLastRow) return returnable(); if (typeof value === 'undefined') value = input.substr(cursor); row.push(value); cursor = inputLen; // important in case parsing is paused pushRow(row); if (stepIsFunction) doStep(); return returnable(); } /** * Appends the current row to the results. It sets the cursor * to newCursor and finds the nextNewline. The caller should * take care to execute user's step function and check for * preview and end parsing if necessary. */ function saveRow(newCursor) { cursor = newCursor; pushRow(row); row = []; nextNewline = input.indexOf(newline, cursor); } /** Returns an object with the results, errors, and meta. */ function returnable(stopped, step) { var isStep = step || false; return { data: isStep ? data[0] : data, errors: errors, meta: { delimiter: delim, linebreak: newline, aborted: aborted, truncated: !!stopped, cursor: lastCursor + (baseIndex || 0) } }; } /** Executes the user's step function and resets data & errors. */ function doStep() { step(returnable(undefined, true)); data = []; errors = []; } /** Gets the delimiter character, which is not inside the quoted field */ function getNextUnqotedDelimiter(nextDelim, quoteSearch, newLine) { var result = { nextDelim: undefined, quoteSearch: undefined }; // get the next closing quote character var nextQuoteSearch = input.indexOf(quoteChar, quoteSearch + 1); // if next delimiter is part of a field enclosed in quotes if (nextDelim > quoteSearch && nextDelim < nextQuoteSearch && (nextQuoteSearch < newLine || newLine === -1)) { // get the next delimiter character after this one var nextNextDelim = input.indexOf(delim, nextQuoteSearch); // if there is no next delimiter, return default result if (nextNextDelim === -1) { return result; } // find the next opening quote char position if (nextNextDelim > nextQuoteSearch) { nextQuoteSearch = input.indexOf(quoteChar, nextQuoteSearch + 1); } // try to get the next delimiter position result = getNextUnqotedDelimiter(nextNextDelim, nextQuoteSearch, newLine); } else { result = { nextDelim: nextDelim, quoteSearch: quoteSearch }; } return result; } }; /** Sets the abort flag */ this.abort = function() { aborted = true; }; /** Gets the cursor position */ this.getCharIndex = function() { return cursor; }; } function newWorker() { if (!Papa.WORKERS_SUPPORTED) return false; var workerUrl = getWorkerBlob(); var w = new global.Worker(workerUrl); w.onmessage = mainThreadReceivedMessage; w.id = workerIdCounter++; workers[w.id] = w; return w; } /** Callback when main thread receives a message */ function mainThreadReceivedMessage(e) { var msg = e.data; var worker = workers[msg.workerId]; var aborted = false; if (msg.error) worker.userError(msg.error, msg.file); else if (msg.results && msg.results.data) { var abort = function() { aborted = true; completeWorker(msg.workerId, { data: [], errors: [], meta: { aborted: true } }); }; var handle = { abort: abort, pause: notImplemented, resume: notImplemented }; if (isFunction(worker.userStep)) { for (var i = 0; i < msg.results.data.length; i++) { worker.userStep({ data: msg.results.data[i], errors: msg.results.errors, meta: msg.results.meta }, handle); if (aborted) break; } delete msg.results; // free memory ASAP } else if (isFunction(worker.userChunk)) { worker.userChunk(msg.results, handle, msg.file); delete msg.results; } } if (msg.finished && !aborted) completeWorker(msg.workerId, msg.results); } function completeWorker(workerId, results) { var worker = workers[workerId]; if (isFunction(worker.userComplete)) worker.userComplete(results); worker.terminate(); delete workers[workerId]; } function notImplemented() { throw new Error('Not implemented.'); } /** Callback when worker thread receives a message */ function workerThreadReceivedMessage(e) { var msg = e.data; if (typeof Papa.WORKER_ID === 'undefined' && msg) Papa.WORKER_ID = msg.workerId; if (typeof msg.input === 'string') { global.postMessage({ workerId: Papa.WORKER_ID, results: Papa.parse(msg.input, msg.config), finished: true }); } else if ((global.File && msg.input instanceof File) || msg.input instanceof Object) // thank you, Safari (see issue #106) { var results = Papa.parse(msg.input, msg.config); if (results) global.postMessage({ workerId: Papa.WORKER_ID, results: results, finished: true }); } } /** Makes a deep copy of an array or object (mostly) */ function copy(obj) { if (typeof obj !== 'object' || obj === null) return obj; var cpy = Array.isArray(obj) ? [] : {}; for (var key in obj) cpy[key] = copy(obj[key]); return cpy; } function bindFunction(f, self) { return function() { f.apply(self, arguments); }; } function isFunction(func) { return typeof func === 'function'; } return Papa; })); ================================================ FILE: package.json ================================================ { "name": "papaparse", "version": "5.5.3", "description": "Fast and powerful CSV parser for the browser that supports web workers and streaming large files. Converts CSV to JSON and JSON to CSV.", "keywords": [ "csv", "parser", "parse", "parsing", "delimited", "text", "data", "auto-detect", "comma", "tab", "pipe", "file", "filereader", "stream", "worker", "workers", "thread", "threading", "multi-threaded", "jquery-plugin" ], "homepage": "https://www.papaparse.com/", "repository": { "type": "git", "url": "git+https://github.com/mholt/PapaParse.git" }, "author": { "name": "Matthew Holt", "url": "https://twitter.com/mholt6" }, "license": "MIT", "main": "papaparse.js", "browser": "papaparse.min.js", "devDependencies": { "chai": "^4.2.0", "connect": "^3.3.3", "eslint": "^4.19.1", "grunt": "^1.5.2", "grunt-contrib-uglify": "^5.2.0", "mocha": "^5.2.0", "mocha-headless-chrome": "^4.0.0", "open": "7.0.0", "serve-static": "^1.7.1" }, "scripts": { "lint": "eslint --no-ignore papaparse.js Gruntfile.js .eslintrc.js 'tests/**/*.js'", "build": "grunt build", "test-browser": "node tests/test.js", "test-mocha-headless-chrome": "node tests/test.js --mocha-headless-chrome", "test-node": "mocha tests/node-tests.js tests/test-cases.js", "test": "npm run lint && npm run test-node && npm run test-mocha-headless-chrome" } } ================================================ FILE: papaparse.js ================================================ /* @license Papa Parse v5.5.3 https://github.com/mholt/PapaParse License: MIT */ (function(root, factory) { /* globals define */ if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof module === 'object' && typeof exports !== 'undefined') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } else { // Browser globals (root is window) root.Papa = factory(); } // in strict mode we cannot access arguments.callee, so we need a named reference to // stringify the factory method for the blob worker // eslint-disable-next-line func-name }(this, function moduleFactory() { 'use strict'; var global = (function() { // alternative method, similar to `Function('return this')()` // but without using `eval` (which is disabled when // using Content Security Policy). if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } // When running tests none of the above have been defined return {}; })(); function getWorkerBlob() { var URL = global.URL || global.webkitURL || null; var code = moduleFactory.toString(); return Papa.BLOB_URL || (Papa.BLOB_URL = URL.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ", '(', code, ')();'], {type: 'text/javascript'}))); } var IS_WORKER = !global.document && !!global.postMessage, IS_PAPA_WORKER = global.IS_PAPA_WORKER || false; var workers = {}, workerIdCounter = 0; var Papa = {}; Papa.parse = CsvToJson; Papa.unparse = JsonToCsv; Papa.RECORD_SEP = String.fromCharCode(30); Papa.UNIT_SEP = String.fromCharCode(31); Papa.BYTE_ORDER_MARK = '\ufeff'; Papa.BAD_DELIMITERS = ['\r', '\n', '"', Papa.BYTE_ORDER_MARK]; Papa.WORKERS_SUPPORTED = !IS_WORKER && !!global.Worker; Papa.NODE_STREAM_INPUT = 1; // Configurable chunk sizes for local and remote files, respectively Papa.LocalChunkSize = 1024 * 1024 * 10; // 10 MB Papa.RemoteChunkSize = 1024 * 1024 * 5; // 5 MB Papa.DefaultDelimiter = ','; // Used if not specified and detection fails // Exposed for testing and development only Papa.Parser = Parser; Papa.ParserHandle = ParserHandle; Papa.NetworkStreamer = NetworkStreamer; Papa.FileStreamer = FileStreamer; Papa.StringStreamer = StringStreamer; Papa.ReadableStreamStreamer = ReadableStreamStreamer; if (typeof PAPA_BROWSER_CONTEXT === 'undefined') { Papa.DuplexStreamStreamer = DuplexStreamStreamer; } if (global.jQuery) { var $ = global.jQuery; $.fn.parse = function(options) { var config = options.config || {}; var queue = []; this.each(function(idx) { var supported = $(this).prop('tagName').toUpperCase() === 'INPUT' && $(this).attr('type').toLowerCase() === 'file' && global.FileReader; if (!supported || !this.files || this.files.length === 0) return true; // continue to next input element for (var i = 0; i < this.files.length; i++) { queue.push({ file: this.files[i], inputElem: this, instanceConfig: $.extend({}, config) }); } }); parseNextFile(); // begin parsing return this; // maintains chainability function parseNextFile() { if (queue.length === 0) { if (isFunction(options.complete)) options.complete(); return; } var f = queue[0]; if (isFunction(options.before)) { var returned = options.before(f.file, f.inputElem); if (typeof returned === 'object') { if (returned.action === 'abort') { error('AbortError', f.file, f.inputElem, returned.reason); return; // Aborts all queued files immediately } else if (returned.action === 'skip') { fileComplete(); // parse the next file in the queue, if any return; } else if (typeof returned.config === 'object') f.instanceConfig = $.extend(f.instanceConfig, returned.config); } else if (returned === 'skip') { fileComplete(); // parse the next file in the queue, if any return; } } // Wrap up the user's complete callback, if any, so that ours also gets executed var userCompleteFunc = f.instanceConfig.complete; f.instanceConfig.complete = function(results) { if (isFunction(userCompleteFunc)) userCompleteFunc(results, f.file, f.inputElem); fileComplete(); }; Papa.parse(f.file, f.instanceConfig); } function error(name, file, elem, reason) { if (isFunction(options.error)) options.error({name: name}, file, elem, reason); } function fileComplete() { queue.splice(0, 1); parseNextFile(); } }; } if (IS_PAPA_WORKER) { global.onmessage = workerThreadReceivedMessage; } // Strip character from UTF-8 BOM encoded files that cause issue parsing the file function stripBom(string) { if (string.charCodeAt(0) === 0xfeff) { return string.slice(1); } return string; } function CsvToJson(_input, _config) { _config = _config || {}; var dynamicTyping = _config.dynamicTyping || false; if (isFunction(dynamicTyping)) { _config.dynamicTypingFunction = dynamicTyping; // Will be filled on first row call dynamicTyping = {}; } _config.dynamicTyping = dynamicTyping; _config.transform = isFunction(_config.transform) ? _config.transform : false; if (_config.worker && Papa.WORKERS_SUPPORTED) { var w = newWorker(); w.userStep = _config.step; w.userChunk = _config.chunk; w.userComplete = _config.complete; w.userError = _config.error; _config.step = isFunction(_config.step); _config.chunk = isFunction(_config.chunk); _config.complete = isFunction(_config.complete); _config.error = isFunction(_config.error); delete _config.worker; // prevent infinite loop w.postMessage({ input: _input, config: _config, workerId: w.id }); return; } var streamer = null; if (_input === Papa.NODE_STREAM_INPUT && typeof PAPA_BROWSER_CONTEXT === 'undefined') { // create a node Duplex stream for use // with .pipe streamer = new DuplexStreamStreamer(_config); return streamer.getStream(); } else if (typeof _input === 'string') { _input = stripBom(_input); if (_config.download) streamer = new NetworkStreamer(_config); else streamer = new StringStreamer(_config); } else if (_input.readable === true && isFunction(_input.read) && isFunction(_input.on)) { streamer = new ReadableStreamStreamer(_config); } else if ((global.File && _input instanceof File) || _input instanceof Object) // ...Safari. (see issue #106) streamer = new FileStreamer(_config); return streamer.stream(_input); } function JsonToCsv(_input, _config) { // Default configuration /** whether to surround every datum with quotes */ var _quotes = false; /** whether to write headers */ var _writeHeader = true; /** delimiting character(s) */ var _delimiter = ','; /** newline character(s) */ var _newline = '\r\n'; /** quote character */ var _quoteChar = '"'; /** escaped quote character, either "" or " */ var _escapedQuote = _quoteChar + _quoteChar; /** whether to skip empty lines */ var _skipEmptyLines = false; /** the columns (keys) we expect when we unparse objects */ var _columns = null; /** whether to prevent outputting cells that can be parsed as formulae by spreadsheet software (Excel and LibreOffice) */ var _escapeFormulae = false; unpackConfig(); var quoteCharRegex = new RegExp(escapeRegExp(_quoteChar), 'g'); if (typeof _input === 'string') _input = JSON.parse(_input); if (Array.isArray(_input)) { if (!_input.length || Array.isArray(_input[0])) return serialize(null, _input, _skipEmptyLines); else if (typeof _input[0] === 'object') return serialize(_columns || Object.keys(_input[0]), _input, _skipEmptyLines); } else if (typeof _input === 'object') { if (typeof _input.data === 'string') _input.data = JSON.parse(_input.data); if (Array.isArray(_input.data)) { if (!_input.fields) _input.fields = _input.meta && _input.meta.fields || _columns; if (!_input.fields) _input.fields = Array.isArray(_input.data[0]) ? _input.fields : typeof _input.data[0] === 'object' ? Object.keys(_input.data[0]) : []; if (!(Array.isArray(_input.data[0])) && typeof _input.data[0] !== 'object') _input.data = [_input.data]; // handles input like [1,2,3] or ['asdf'] } return serialize(_input.fields || [], _input.data || [], _skipEmptyLines); } // Default (any valid paths should return before this) throw new Error('Unable to serialize unrecognized input'); function unpackConfig() { if (typeof _config !== 'object') return; if (typeof _config.delimiter === 'string' && !Papa.BAD_DELIMITERS.filter(function(value) { return _config.delimiter.indexOf(value) !== -1; }).length) { _delimiter = _config.delimiter; } if (typeof _config.quotes === 'boolean' || typeof _config.quotes === 'function' || Array.isArray(_config.quotes)) _quotes = _config.quotes; if (typeof _config.skipEmptyLines === 'boolean' || typeof _config.skipEmptyLines === 'string') _skipEmptyLines = _config.skipEmptyLines; if (typeof _config.newline === 'string') _newline = _config.newline; if (typeof _config.quoteChar === 'string') _quoteChar = _config.quoteChar; if (typeof _config.header === 'boolean') _writeHeader = _config.header; if (Array.isArray(_config.columns)) { if (_config.columns.length === 0) throw new Error('Option columns is empty'); _columns = _config.columns; } if (_config.escapeChar !== undefined) { _escapedQuote = _config.escapeChar + _quoteChar; } if (_config.escapeFormulae instanceof RegExp) { _escapeFormulae = _config.escapeFormulae; } else if (typeof _config.escapeFormulae === 'boolean' && _config.escapeFormulae) { _escapeFormulae = /^[=+\-@\t\r].*$/; } } /** The double for loop that iterates the data and writes out a CSV string including header row */ function serialize(fields, data, skipEmptyLines) { var csv = ''; if (typeof fields === 'string') fields = JSON.parse(fields); if (typeof data === 'string') data = JSON.parse(data); var hasHeader = Array.isArray(fields) && fields.length > 0; var dataKeyedByField = !(Array.isArray(data[0])); // If there a header row, write it first if (hasHeader && _writeHeader) { for (var i = 0; i < fields.length; i++) { if (i > 0) csv += _delimiter; csv += safe(fields[i], i); } if (data.length > 0) csv += _newline; } // Then write out the data for (var row = 0; row < data.length; row++) { var maxCol = hasHeader ? fields.length : data[row].length; var emptyLine = false; var nullLine = hasHeader ? Object.keys(data[row]).length === 0 : data[row].length === 0; if (skipEmptyLines && !hasHeader) { emptyLine = skipEmptyLines === 'greedy' ? data[row].join('').trim() === '' : data[row].length === 1 && data[row][0].length === 0; } if (skipEmptyLines === 'greedy' && hasHeader) { var line = []; for (var c = 0; c < maxCol; c++) { var cx = dataKeyedByField ? fields[c] : c; line.push(data[row][cx]); } emptyLine = line.join('').trim() === ''; } if (!emptyLine) { for (var col = 0; col < maxCol; col++) { if (col > 0 && !nullLine) csv += _delimiter; var colIdx = hasHeader && dataKeyedByField ? fields[col] : col; csv += safe(data[row][colIdx], col); } if (row < data.length - 1 && (!skipEmptyLines || (maxCol > 0 && !nullLine))) { csv += _newline; } } } return csv; } /** Encloses a value around quotes if needed (makes a value safe for CSV insertion) */ function safe(str, col) { if (typeof str === 'undefined' || str === null) return ''; if (str.constructor === Date) return JSON.stringify(str).slice(1, 25); var needsQuotes = false; if (_escapeFormulae && typeof str === "string" && _escapeFormulae.test(str)) { str = "'" + str; needsQuotes = true; } var escapedQuoteStr = str.toString().replace(quoteCharRegex, _escapedQuote); needsQuotes = needsQuotes || _quotes === true || (typeof _quotes === 'function' && _quotes(str, col)) || (Array.isArray(_quotes) && _quotes[col]) || hasAny(escapedQuoteStr, Papa.BAD_DELIMITERS) || escapedQuoteStr.indexOf(_delimiter) > -1 || escapedQuoteStr.charAt(0) === ' ' || escapedQuoteStr.charAt(escapedQuoteStr.length - 1) === ' '; return needsQuotes ? _quoteChar + escapedQuoteStr + _quoteChar : escapedQuoteStr; } function hasAny(str, substrings) { for (var i = 0; i < substrings.length; i++) if (str.indexOf(substrings[i]) > -1) return true; return false; } } /** ChunkStreamer is the base prototype for various streamer implementations. */ function ChunkStreamer(config) { this._handle = null; this._finished = false; this._completed = false; this._halted = false; this._input = null; this._baseIndex = 0; this._partialLine = ''; this._rowCount = 0; this._start = 0; this._nextChunk = null; this.isFirstChunk = true; this._completeResults = { data: [], errors: [], meta: {} }; replaceConfig.call(this, config); this.parseChunk = function(chunk, isFakeChunk) { // First chunk pre-processing const skipFirstNLines = parseInt(this._config.skipFirstNLines) || 0; if (this.isFirstChunk && skipFirstNLines > 0) { let _newline = this._config.newline; if (!_newline) { const quoteChar = this._config.quoteChar || '"'; _newline = this._handle.guessLineEndings(chunk, quoteChar); } const splitChunk = chunk.split(_newline); chunk = [...splitChunk.slice(skipFirstNLines)].join(_newline); } if (this.isFirstChunk && isFunction(this._config.beforeFirstChunk)) { var modifiedChunk = this._config.beforeFirstChunk(chunk); if (modifiedChunk !== undefined) chunk = modifiedChunk; } this.isFirstChunk = false; this._halted = false; // Rejoin the line we likely just split in two by chunking the file var aggregate = this._partialLine + chunk; this._partialLine = ''; var results = this._handle.parse(aggregate, this._baseIndex, !this._finished); if (this._handle.paused() || this._handle.aborted()) { this._halted = true; return; } var lastIndex = results.meta.cursor; if (!this._finished) { this._partialLine = aggregate.substring(lastIndex - this._baseIndex); this._baseIndex = lastIndex; } if (results && results.data) this._rowCount += results.data.length; var finishedIncludingPreview = this._finished || (this._config.preview && this._rowCount >= this._config.preview); if (IS_PAPA_WORKER) { global.postMessage({ results: results, workerId: Papa.WORKER_ID, finished: finishedIncludingPreview }); } else if (isFunction(this._config.chunk) && !isFakeChunk) { this._config.chunk(results, this._handle); if (this._handle.paused() || this._handle.aborted()) { this._halted = true; return; } results = undefined; this._completeResults = undefined; } if (!this._config.step && !this._config.chunk) { this._completeResults.data = this._completeResults.data.concat(results.data); this._completeResults.errors = this._completeResults.errors.concat(results.errors); this._completeResults.meta = results.meta; } if (!this._completed && finishedIncludingPreview && isFunction(this._config.complete) && (!results || !results.meta.aborted)) { this._config.complete(this._completeResults, this._input); this._completed = true; } if (!finishedIncludingPreview && (!results || !results.meta.paused)) this._nextChunk(); return results; }; this._sendError = function(error) { if (isFunction(this._config.error)) this._config.error(error); else if (IS_PAPA_WORKER && this._config.error) { global.postMessage({ workerId: Papa.WORKER_ID, error: error, finished: false }); } }; function replaceConfig(config) { // Deep-copy the config so we can edit it var configCopy = copy(config); configCopy.chunkSize = parseInt(configCopy.chunkSize); // parseInt VERY important so we don't concatenate strings! if (!config.step && !config.chunk) configCopy.chunkSize = null; // disable Range header if not streaming; bad values break IIS - see issue #196 this._handle = new ParserHandle(configCopy); this._handle.streamer = this; this._config = configCopy; // persist the copy to the caller } } function NetworkStreamer(config) { config = config || {}; if (!config.chunkSize) config.chunkSize = Papa.RemoteChunkSize; ChunkStreamer.call(this, config); var xhr; if (IS_WORKER) { this._nextChunk = function() { this._readChunk(); this._chunkLoaded(); }; } else { this._nextChunk = function() { this._readChunk(); }; } this.stream = function(url) { this._input = url; this._nextChunk(); // Starts streaming }; this._readChunk = function() { if (this._finished) { this._chunkLoaded(); return; } xhr = new XMLHttpRequest(); if (this._config.withCredentials) { xhr.withCredentials = this._config.withCredentials; } if (!IS_WORKER) { xhr.onload = bindFunction(this._chunkLoaded, this); xhr.onerror = bindFunction(this._chunkError, this); } xhr.open(this._config.downloadRequestBody ? 'POST' : 'GET', this._input, !IS_WORKER); // Headers can only be set when once the request state is OPENED if (this._config.downloadRequestHeaders) { var headers = this._config.downloadRequestHeaders; for (var headerName in headers) { xhr.setRequestHeader(headerName, headers[headerName]); } } if (this._config.chunkSize) { var end = this._start + this._config.chunkSize - 1; // minus one because byte range is inclusive xhr.setRequestHeader('Range', 'bytes=' + this._start + '-' + end); } try { xhr.send(this._config.downloadRequestBody); } catch (err) { this._chunkError(err.message); } if (IS_WORKER && xhr.status === 0) this._chunkError(); }; this._chunkLoaded = function() { if (xhr.readyState !== 4) return; if (xhr.status < 200 || xhr.status >= 400) { this._chunkError(); return; } // Use chunckSize as it may be a diference on reponse lentgh due to characters with more than 1 byte this._start += this._config.chunkSize ? this._config.chunkSize : xhr.responseText.length; this._finished = !this._config.chunkSize || this._start >= getFileSize(xhr); this.parseChunk(xhr.responseText); }; this._chunkError = function(errorMessage) { var errorText = xhr.statusText || errorMessage; this._sendError(new Error(errorText)); }; function getFileSize(xhr) { var contentRange = xhr.getResponseHeader('Content-Range'); if (contentRange === null) { // no content range, then finish! return -1; } return parseInt(contentRange.substring(contentRange.lastIndexOf('/') + 1)); } } NetworkStreamer.prototype = Object.create(ChunkStreamer.prototype); NetworkStreamer.prototype.constructor = NetworkStreamer; function FileStreamer(config) { config = config || {}; if (!config.chunkSize) config.chunkSize = Papa.LocalChunkSize; ChunkStreamer.call(this, config); var reader, slice; // FileReader is better than FileReaderSync (even in worker) - see http://stackoverflow.com/q/24708649/1048862 // But Firefox is a pill, too - see issue #76: https://github.com/mholt/PapaParse/issues/76 var usingAsyncReader = typeof FileReader !== 'undefined'; // Safari doesn't consider it a function - see issue #105 this.stream = function(file) { this._input = file; slice = file.slice || file.webkitSlice || file.mozSlice; if (usingAsyncReader) { reader = new FileReader(); // Preferred method of reading files, even in workers reader.onload = bindFunction(this._chunkLoaded, this); reader.onerror = bindFunction(this._chunkError, this); } else reader = new FileReaderSync(); // Hack for running in a web worker in Firefox this._nextChunk(); // Starts streaming }; this._nextChunk = function() { if (!this._finished && (!this._config.preview || this._rowCount < this._config.preview)) this._readChunk(); }; this._readChunk = function() { var input = this._input; if (this._config.chunkSize) { var end = Math.min(this._start + this._config.chunkSize, this._input.size); input = slice.call(input, this._start, end); } var txt = reader.readAsText(input, this._config.encoding); if (!usingAsyncReader) this._chunkLoaded({ target: { result: txt } }); // mimic the async signature }; this._chunkLoaded = function(event) { // Very important to increment start each time before handling results this._start += this._config.chunkSize; this._finished = !this._config.chunkSize || this._start >= this._input.size; this.parseChunk(event.target.result); }; this._chunkError = function() { this._sendError(reader.error); }; } FileStreamer.prototype = Object.create(ChunkStreamer.prototype); FileStreamer.prototype.constructor = FileStreamer; function StringStreamer(config) { config = config || {}; ChunkStreamer.call(this, config); var remaining; this.stream = function(s) { remaining = s; return this._nextChunk(); }; this._nextChunk = function() { if (this._finished) return; var size = this._config.chunkSize; var chunk; if(size) { chunk = remaining.substring(0, size); remaining = remaining.substring(size); } else { chunk = remaining; remaining = ''; } this._finished = !remaining; return this.parseChunk(chunk); }; } StringStreamer.prototype = Object.create(StringStreamer.prototype); StringStreamer.prototype.constructor = StringStreamer; function ReadableStreamStreamer(config) { config = config || {}; ChunkStreamer.call(this, config); var queue = []; var parseOnData = true; var streamHasEnded = false; this.pause = function() { ChunkStreamer.prototype.pause.apply(this, arguments); this._input.pause(); }; this.resume = function() { ChunkStreamer.prototype.resume.apply(this, arguments); this._input.resume(); }; this.stream = function(stream) { this._input = stream; this._input.on('data', this._streamData); this._input.on('end', this._streamEnd); this._input.on('error', this._streamError); }; this._checkIsFinished = function() { if (streamHasEnded && queue.length === 1) { this._finished = true; } }; this._nextChunk = function() { this._checkIsFinished(); if (queue.length) { this.parseChunk(queue.shift()); } else { parseOnData = true; } }; this._streamData = bindFunction(function(chunk) { try { queue.push(typeof chunk === 'string' ? chunk : chunk.toString(this._config.encoding)); if (parseOnData) { parseOnData = false; this._checkIsFinished(); this.parseChunk(queue.shift()); } } catch (error) { this._streamError(error); } }, this); this._streamError = bindFunction(function(error) { this._streamCleanUp(); this._sendError(error); }, this); this._streamEnd = bindFunction(function() { this._streamCleanUp(); streamHasEnded = true; this._streamData(''); }, this); this._streamCleanUp = bindFunction(function() { this._input.removeListener('data', this._streamData); this._input.removeListener('end', this._streamEnd); this._input.removeListener('error', this._streamError); }, this); } ReadableStreamStreamer.prototype = Object.create(ChunkStreamer.prototype); ReadableStreamStreamer.prototype.constructor = ReadableStreamStreamer; function DuplexStreamStreamer(_config) { var Duplex = require('stream').Duplex; var config = copy(_config); var parseOnWrite = true; var writeStreamHasFinished = false; var parseCallbackQueue = []; var stream = null; this._onCsvData = function(results) { var data = results.data; if (!stream.push(data) && !this._handle.paused()) { // the writeable consumer buffer has filled up // so we need to pause until more items // can be processed this._handle.pause(); } }; this._onCsvComplete = function() { // node will finish the read stream when // null is pushed stream.push(null); }; config.step = bindFunction(this._onCsvData, this); config.complete = bindFunction(this._onCsvComplete, this); ChunkStreamer.call(this, config); this._nextChunk = function() { if (writeStreamHasFinished && parseCallbackQueue.length === 1) { this._finished = true; } if (parseCallbackQueue.length) { parseCallbackQueue.shift()(); } else { parseOnWrite = true; } }; this._addToParseQueue = function(chunk, callback) { // add to queue so that we can indicate // completion via callback // node will automatically pause the incoming stream // when too many items have been added without their // callback being invoked parseCallbackQueue.push(bindFunction(function() { this.parseChunk(typeof chunk === 'string' ? chunk : chunk.toString(config.encoding)); if (isFunction(callback)) { return callback(); } }, this)); if (parseOnWrite) { parseOnWrite = false; this._nextChunk(); } }; this._onRead = function() { if (this._handle.paused()) { // the writeable consumer can handle more data // so resume the chunk parsing this._handle.resume(); } }; this._onWrite = function(chunk, encoding, callback) { this._addToParseQueue(chunk, callback); }; this._onWriteComplete = function() { writeStreamHasFinished = true; // have to write empty string // so parser knows its done this._addToParseQueue(''); }; this.getStream = function() { return stream; }; stream = new Duplex({ readableObjectMode: true, decodeStrings: false, read: bindFunction(this._onRead, this), write: bindFunction(this._onWrite, this) }); stream.once('finish', bindFunction(this._onWriteComplete, this)); } if (typeof PAPA_BROWSER_CONTEXT === 'undefined') { DuplexStreamStreamer.prototype = Object.create(ChunkStreamer.prototype); DuplexStreamStreamer.prototype.constructor = DuplexStreamStreamer; } // Use one ParserHandle per entire CSV file or string function ParserHandle(_config) { // One goal is to minimize the use of regular expressions... var MAX_FLOAT = Math.pow(2, 53); var MIN_FLOAT = -MAX_FLOAT; var FLOAT = /^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/; var ISO_DATE = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/; var self = this; var _stepCounter = 0; // Number of times step was called (number of rows parsed) var _rowCounter = 0; // Number of rows that have been parsed so far var _input; // The input being parsed var _parser; // The core parser being used var _paused = false; // Whether we are paused or not var _aborted = false; // Whether the parser has aborted or not var _delimiterError; // Temporary state between delimiter detection and processing results var _fields = []; // Fields are from the header row of the input, if there is one var _results = { // The last results returned from the parser data: [], errors: [], meta: {} }; if (isFunction(_config.step)) { var userStep = _config.step; _config.step = function(results) { _results = results; if (needsHeaderRow()) processResults(); else // only call user's step function after header row { processResults(); // It's possbile that this line was empty and there's no row here after all if (_results.data.length === 0) return; _stepCounter += results.data.length; if (_config.preview && _stepCounter > _config.preview) _parser.abort(); else { _results.data = _results.data[0]; userStep(_results, self); } } }; } /** * Parses input. Most users won't need, and shouldn't mess with, the baseIndex * and ignoreLastRow parameters. They are used by streamers (wrapper functions) * when an input comes in multiple chunks, like from a file. */ this.parse = function(input, baseIndex, ignoreLastRow) { var quoteChar = _config.quoteChar || '"'; if (!_config.newline) _config.newline = this.guessLineEndings(input, quoteChar); _delimiterError = false; if (!_config.delimiter) { var delimGuess = guessDelimiter(input, _config.newline, _config.skipEmptyLines, _config.comments, _config.delimitersToGuess); if (delimGuess.successful) _config.delimiter = delimGuess.bestDelimiter; else { _delimiterError = true; // add error after parsing (otherwise it would be overwritten) _config.delimiter = Papa.DefaultDelimiter; } _results.meta.delimiter = _config.delimiter; } else if(isFunction(_config.delimiter)) { _config.delimiter = _config.delimiter(input); _results.meta.delimiter = _config.delimiter; } var parserConfig = copy(_config); if (_config.preview && _config.header) parserConfig.preview++; // to compensate for header row _input = input; _parser = new Parser(parserConfig); _results = _parser.parse(_input, baseIndex, ignoreLastRow); processResults(); return _paused ? { meta: { paused: true } } : (_results || { meta: { paused: false } }); }; this.paused = function() { return _paused; }; this.pause = function() { _paused = true; _parser.abort(); // If it is streaming via "chunking", the reader will start appending correctly already so no need to substring, // otherwise we can get duplicate content within a row _input = isFunction(_config.chunk) ? "" : _input.substring(_parser.getCharIndex()); }; this.resume = function() { if(self.streamer._halted) { _paused = false; self.streamer.parseChunk(_input, true); } else { // Bugfix: #636 In case the processing hasn't halted yet // wait for it to halt in order to resume setTimeout(self.resume, 3); } }; this.aborted = function() { return _aborted; }; this.abort = function() { _aborted = true; _parser.abort(); _results.meta.aborted = true; if (isFunction(_config.complete)) _config.complete(_results); _input = ''; }; this.guessLineEndings = function(input, quoteChar) { input = input.substring(0, 1024 * 1024); // max length 1 MB // Replace all the text inside quotes var re = new RegExp(escapeRegExp(quoteChar) + '([^]*?)' + escapeRegExp(quoteChar), 'gm'); input = input.replace(re, ''); var r = input.split('\r'); var n = input.split('\n'); var nAppearsFirst = (n.length > 1 && n[0].length < r[0].length); if (r.length === 1 || nAppearsFirst) return '\n'; var numWithN = 0; for (var i = 0; i < r.length; i++) { if (r[i][0] === '\n') numWithN++; } return numWithN >= r.length / 2 ? '\r\n' : '\r'; }; function testEmptyLine(s) { return _config.skipEmptyLines === 'greedy' ? s.join('').trim() === '' : s.length === 1 && s[0].length === 0; } function testFloat(s) { if (FLOAT.test(s)) { var floatValue = parseFloat(s); if (floatValue > MIN_FLOAT && floatValue < MAX_FLOAT) { return true; } } return false; } function processResults() { if (_results && _delimiterError) { addError('Delimiter', 'UndetectableDelimiter', 'Unable to auto-detect delimiting character; defaulted to \'' + Papa.DefaultDelimiter + '\''); _delimiterError = false; } if (_config.skipEmptyLines) { _results.data = _results.data.filter(function(d) { return !testEmptyLine(d); }); } if (needsHeaderRow()) fillHeaderFields(); return applyHeaderAndDynamicTypingAndTransformation(); } function needsHeaderRow() { return _config.header && _fields.length === 0; } function fillHeaderFields() { if (!_results) return; function addHeader(header, i) { header = stripBom(header); if (isFunction(_config.transformHeader)) header = _config.transformHeader(header, i); _fields.push(header); } if (Array.isArray(_results.data[0])) { for (var i = 0; needsHeaderRow() && i < _results.data.length; i++) _results.data[i].forEach(addHeader); _results.data.splice(0, 1); } // if _results.data[0] is not an array, we are in a step where _results.data is the row. else _results.data.forEach(addHeader); } function shouldApplyDynamicTyping(field) { // Cache function values to avoid calling it for each row if (_config.dynamicTypingFunction && _config.dynamicTyping[field] === undefined) { _config.dynamicTyping[field] = _config.dynamicTypingFunction(field); } return (_config.dynamicTyping[field] || _config.dynamicTyping) === true; } function parseDynamic(field, value) { if (shouldApplyDynamicTyping(field)) { if (value === 'true' || value === 'TRUE') return true; else if (value === 'false' || value === 'FALSE') return false; else if (testFloat(value)) return parseFloat(value); else if (ISO_DATE.test(value)) return new Date(value); else return (value === '' ? null : value); } return value; } function applyHeaderAndDynamicTypingAndTransformation() { if (!_results || (!_config.header && !_config.dynamicTyping && !_config.transform)) return _results; function processRow(rowSource, i) { var row = _config.header ? {} : []; var j; for (j = 0; j < rowSource.length; j++) { var field = j; var value = rowSource[j]; if (_config.header) field = j >= _fields.length ? '__parsed_extra' : _fields[j]; if (_config.transform) value = _config.transform(value,field); value = parseDynamic(field, value); if (field === '__parsed_extra') { row[field] = row[field] || []; row[field].push(value); } else row[field] = value; } if (_config.header) { if (j > _fields.length) addError('FieldMismatch', 'TooManyFields', 'Too many fields: expected ' + _fields.length + ' fields but parsed ' + j, _rowCounter + i); else if (j < _fields.length) addError('FieldMismatch', 'TooFewFields', 'Too few fields: expected ' + _fields.length + ' fields but parsed ' + j, _rowCounter + i); } return row; } var incrementBy = 1; if (!_results.data.length || Array.isArray(_results.data[0])) { _results.data = _results.data.map(processRow); incrementBy = _results.data.length; } else _results.data = processRow(_results.data, 0); if (_config.header && _results.meta) _results.meta.fields = _fields; _rowCounter += incrementBy; return _results; } function guessDelimiter(input, newline, skipEmptyLines, comments, delimitersToGuess) { var bestDelim, bestDelta, fieldCountPrevRow, maxFieldCount; delimitersToGuess = delimitersToGuess || [',', '\t', '|', ';', Papa.RECORD_SEP, Papa.UNIT_SEP]; for (var i = 0; i < delimitersToGuess.length; i++) { var delim = delimitersToGuess[i]; var delta = 0, avgFieldCount = 0, emptyLinesCount = 0; fieldCountPrevRow = undefined; var preview = new Parser({ comments: comments, delimiter: delim, newline: newline, preview: 10 }).parse(input); for (var j = 0; j < preview.data.length; j++) { if (skipEmptyLines && testEmptyLine(preview.data[j])) { emptyLinesCount++; continue; } var fieldCount = preview.data[j].length; avgFieldCount += fieldCount; if (typeof fieldCountPrevRow === 'undefined') { fieldCountPrevRow = fieldCount; continue; } else if (fieldCount > 0) { delta += Math.abs(fieldCount - fieldCountPrevRow); fieldCountPrevRow = fieldCount; } } if (preview.data.length > 0) avgFieldCount /= (preview.data.length - emptyLinesCount); if ((typeof bestDelta === 'undefined' || delta <= bestDelta) && (typeof maxFieldCount === 'undefined' || avgFieldCount > maxFieldCount) && avgFieldCount > 1.99) { bestDelta = delta; bestDelim = delim; maxFieldCount = avgFieldCount; } } _config.delimiter = bestDelim; return { successful: !!bestDelim, bestDelimiter: bestDelim }; } function addError(type, code, msg, row) { var error = { type: type, code: code, message: msg }; if(row !== undefined) { error.row = row; } _results.errors.push(error); } } /** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions */ function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } /** The core parser implements speedy and correct CSV parsing */ function Parser(config) { // Unpack the config object config = config || {}; var delim = config.delimiter; var newline = config.newline; var comments = config.comments; var step = config.step; var preview = config.preview; var fastMode = config.fastMode; var quoteChar; var renamedHeaders = null; var headerParsed = false; if (config.quoteChar === undefined || config.quoteChar === null) { quoteChar = '"'; } else { quoteChar = config.quoteChar; } var escapeChar = quoteChar; if (config.escapeChar !== undefined) { escapeChar = config.escapeChar; } // Delimiter must be valid if (typeof delim !== 'string' || Papa.BAD_DELIMITERS.indexOf(delim) > -1) delim = ','; // Comment character must be valid if (comments === delim) throw new Error('Comment character same as delimiter'); else if (comments === true) comments = '#'; else if (typeof comments !== 'string' || Papa.BAD_DELIMITERS.indexOf(comments) > -1) comments = false; // Newline must be valid: \r, \n, or \r\n if (newline !== '\n' && newline !== '\r' && newline !== '\r\n') newline = '\n'; // We're gonna need these at the Parser scope var cursor = 0; var aborted = false; this.parse = function(input, baseIndex, ignoreLastRow) { // For some reason, in Chrome, this speeds things up (!?) if (typeof input !== 'string') throw new Error('Input must be a string'); // We don't need to compute some of these every time parse() is called, // but having them in a more local scope seems to perform better var inputLen = input.length, delimLen = delim.length, newlineLen = newline.length, commentsLen = comments.length; var stepIsFunction = isFunction(step); // Establish starting state cursor = 0; var data = [], errors = [], row = [], lastCursor = 0; if (!input) return returnable(); if (fastMode || (fastMode !== false && input.indexOf(quoteChar) === -1)) { var rows = input.split(newline); for (var i = 0; i < rows.length; i++) { row = rows[i]; cursor += row.length; if (i !== rows.length - 1) cursor += newline.length; else if (ignoreLastRow) return returnable(); if (comments && row.substring(0, commentsLen) === comments) continue; if (stepIsFunction) { data = []; pushRow(row.split(delim)); doStep(); if (aborted) return returnable(); } else pushRow(row.split(delim)); if (preview && i >= preview) { data = data.slice(0, preview); return returnable(true); } } return returnable(); } var nextDelim = input.indexOf(delim, cursor); var nextNewline = input.indexOf(newline, cursor); var quoteCharRegex = new RegExp(escapeRegExp(escapeChar) + escapeRegExp(quoteChar), 'g'); var quoteSearch = input.indexOf(quoteChar, cursor); // Parser loop for (;;) { // Field has opening quote if (input[cursor] === quoteChar) { // Start our search for the closing quote where the cursor is quoteSearch = cursor; // Skip the opening quote cursor++; for (;;) { // Find closing quote quoteSearch = input.indexOf(quoteChar, quoteSearch + 1); //No other quotes are found - no other delimiters if (quoteSearch === -1) { if (!ignoreLastRow) { // No closing quote... what a pity errors.push({ type: 'Quotes', code: 'MissingQuotes', message: 'Quoted field unterminated', row: data.length, // row has yet to be inserted index: cursor }); } return finish(); } // Closing quote at EOF if (quoteSearch === inputLen - 1) { var value = input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar); return finish(value); } // If this quote is escaped, it's part of the data; skip it // If the quote character is the escape character, then check if the next character is the escape character if (quoteChar === escapeChar && input[quoteSearch + 1] === escapeChar) { quoteSearch++; continue; } // If the quote character is not the escape character, then check if the previous character was the escape character if (quoteChar !== escapeChar && quoteSearch !== 0 && input[quoteSearch - 1] === escapeChar) { continue; } if(nextDelim !== -1 && nextDelim < (quoteSearch + 1)) { nextDelim = input.indexOf(delim, (quoteSearch + 1)); } if(nextNewline !== -1 && nextNewline < (quoteSearch + 1)) { nextNewline = input.indexOf(newline, (quoteSearch + 1)); } // Check up to nextDelim or nextNewline, whichever is closest var checkUpTo = nextNewline === -1 ? nextDelim : Math.min(nextDelim, nextNewline); var spacesBetweenQuoteAndDelimiter = extraSpaces(checkUpTo); // Closing quote followed by delimiter or 'unnecessary spaces + delimiter' if (input.substr(quoteSearch + 1 + spacesBetweenQuoteAndDelimiter, delimLen) === delim) { row.push(input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar)); cursor = quoteSearch + 1 + spacesBetweenQuoteAndDelimiter + delimLen; // If char after following delimiter is not quoteChar, we find next quote char position if (input[quoteSearch + 1 + spacesBetweenQuoteAndDelimiter + delimLen] !== quoteChar) { quoteSearch = input.indexOf(quoteChar, cursor); } nextDelim = input.indexOf(delim, cursor); nextNewline = input.indexOf(newline, cursor); break; } var spacesBetweenQuoteAndNewLine = extraSpaces(nextNewline); // Closing quote followed by newline or 'unnecessary spaces + newLine' if (input.substring(quoteSearch + 1 + spacesBetweenQuoteAndNewLine, quoteSearch + 1 + spacesBetweenQuoteAndNewLine + newlineLen) === newline) { row.push(input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar)); saveRow(quoteSearch + 1 + spacesBetweenQuoteAndNewLine + newlineLen); nextDelim = input.indexOf(delim, cursor); // because we may have skipped the nextDelim in the quoted field quoteSearch = input.indexOf(quoteChar, cursor); // we search for first quote in next line if (stepIsFunction) { doStep(); if (aborted) return returnable(); } if (preview && data.length >= preview) return returnable(true); break; } // Checks for valid closing quotes are complete (escaped quotes or quote followed by EOF/delimiter/newline) -- assume these quotes are part of an invalid text string errors.push({ type: 'Quotes', code: 'InvalidQuotes', message: 'Trailing quote on quoted field is malformed', row: data.length, // row has yet to be inserted index: cursor }); quoteSearch++; continue; } continue; } // Comment found at start of new line if (comments && row.length === 0 && input.substring(cursor, cursor + commentsLen) === comments) { if (nextNewline === -1) // Comment ends at EOF return returnable(); cursor = nextNewline + newlineLen; nextNewline = input.indexOf(newline, cursor); nextDelim = input.indexOf(delim, cursor); continue; } // Next delimiter comes before next newline, so we've reached end of field if (nextDelim !== -1 && (nextDelim < nextNewline || nextNewline === -1)) { row.push(input.substring(cursor, nextDelim)); cursor = nextDelim + delimLen; // we look for next delimiter char nextDelim = input.indexOf(delim, cursor); continue; } // End of row if (nextNewline !== -1) { row.push(input.substring(cursor, nextNewline)); saveRow(nextNewline + newlineLen); if (stepIsFunction) { doStep(); if (aborted) return returnable(); } if (preview && data.length >= preview) return returnable(true); continue; } break; } return finish(); function pushRow(row) { data.push(row); lastCursor = cursor; } /** * checks if there are extra spaces after closing quote and given index without any text * if Yes, returns the number of spaces */ function extraSpaces(index) { var spaceLength = 0; if (index !== -1) { var textBetweenClosingQuoteAndIndex = input.substring(quoteSearch + 1, index); if (textBetweenClosingQuoteAndIndex && textBetweenClosingQuoteAndIndex.trim() === '') { spaceLength = textBetweenClosingQuoteAndIndex.length; } } return spaceLength; } /** * Appends the remaining input from cursor to the end into * row, saves the row, calls step, and returns the results. */ function finish(value) { if (ignoreLastRow) return returnable(); if (typeof value === 'undefined') value = input.substring(cursor); row.push(value); cursor = inputLen; // important in case parsing is paused pushRow(row); if (stepIsFunction) doStep(); return returnable(); } /** * Appends the current row to the results. It sets the cursor * to newCursor and finds the nextNewline. The caller should * take care to execute user's step function and check for * preview and end parsing if necessary. */ function saveRow(newCursor) { cursor = newCursor; pushRow(row); row = []; nextNewline = input.indexOf(newline, cursor); } /** Returns an object with the results, errors, and meta. */ function returnable(stopped) { if (config.header && !baseIndex && data.length && !headerParsed) { const result = data[0]; const headerCount = Object.create(null); // To track the count of each base header const usedHeaders = new Set(result); // To track used headers and avoid duplicates let duplicateHeaders = false; for (let i = 0; i < result.length; i++) { let header = stripBom(result[i]); if (isFunction(config.transformHeader)) header = config.transformHeader(header, i); if (!headerCount[header]) { headerCount[header] = 1; result[i] = header; } else { let newHeader; let suffixCount = headerCount[header]; // Find a unique new header do { newHeader = `${header}_${suffixCount}`; suffixCount++; } while (usedHeaders.has(newHeader)); usedHeaders.add(newHeader); // Mark this new Header as used result[i] = newHeader; headerCount[header]++; duplicateHeaders = true; if (renamedHeaders === null) { renamedHeaders = {}; } renamedHeaders[newHeader] = header; } usedHeaders.add(header); // Ensure the original header is marked as used } if (duplicateHeaders) { console.warn('Duplicate headers found and renamed.'); } headerParsed = true; } return { data: data, errors: errors, meta: { delimiter: delim, linebreak: newline, aborted: aborted, truncated: !!stopped, cursor: lastCursor + (baseIndex || 0), renamedHeaders: renamedHeaders } }; } /** Executes the user's step function and resets data & errors. */ function doStep() { step(returnable()); data = []; errors = []; } }; /** Sets the abort flag */ this.abort = function() { aborted = true; }; /** Gets the cursor position */ this.getCharIndex = function() { return cursor; }; } function newWorker() { if (!Papa.WORKERS_SUPPORTED) return false; var workerUrl = getWorkerBlob(); var w = new global.Worker(workerUrl); w.onmessage = mainThreadReceivedMessage; w.id = workerIdCounter++; workers[w.id] = w; return w; } /** Callback when main thread receives a message */ function mainThreadReceivedMessage(e) { var msg = e.data; var worker = workers[msg.workerId]; var aborted = false; if (msg.error) worker.userError(msg.error, msg.file); else if (msg.results && msg.results.data) { var abort = function() { aborted = true; completeWorker(msg.workerId, { data: [], errors: [], meta: { aborted: true } }); }; var handle = { abort: abort, pause: notImplemented, resume: notImplemented }; if (isFunction(worker.userStep)) { for (var i = 0; i < msg.results.data.length; i++) { worker.userStep({ data: msg.results.data[i], errors: msg.results.errors, meta: msg.results.meta }, handle); if (aborted) break; } delete msg.results; // free memory ASAP } else if (isFunction(worker.userChunk)) { worker.userChunk(msg.results, handle, msg.file); delete msg.results; } } if (msg.finished && !aborted) completeWorker(msg.workerId, msg.results); } function completeWorker(workerId, results) { var worker = workers[workerId]; if (isFunction(worker.userComplete)) worker.userComplete(results); worker.terminate(); delete workers[workerId]; } function notImplemented() { throw new Error('Not implemented.'); } /** Callback when worker thread receives a message */ function workerThreadReceivedMessage(e) { var msg = e.data; if (typeof Papa.WORKER_ID === 'undefined' && msg) Papa.WORKER_ID = msg.workerId; if (typeof msg.input === 'string') { global.postMessage({ workerId: Papa.WORKER_ID, results: Papa.parse(msg.input, msg.config), finished: true }); } else if ((global.File && msg.input instanceof File) || msg.input instanceof Object) // thank you, Safari (see issue #106) { var results = Papa.parse(msg.input, msg.config); if (results) global.postMessage({ workerId: Papa.WORKER_ID, results: results, finished: true }); } } /** Makes a deep copy of an array or object (mostly) */ function copy(obj) { if (typeof obj !== 'object' || obj === null) return obj; var cpy = Array.isArray(obj) ? [] : {}; for (var key in obj) cpy[key] = copy(obj[key]); return cpy; } function bindFunction(f, self) { return function() { f.apply(self, arguments); }; } function isFunction(func) { return typeof func === 'function'; } return Papa; })); ================================================ FILE: player/player.css ================================================ body { font-family: 'Source Sans Pro', sans-serif; } h1 { text-align: center; } textarea, button { font-size: 14px; } textarea { box-sizing: border-box; font: 14px/1.25em Menlo, Monaco, 'Courier New', monospace; width: 100%; padding: 10px; max-width: 900px; height: 200px; } button { padding: 10px 50px; font-size: 20px; } label { display: block; } input[type=number] { width: 55px; } .text-center { text-align: center; } /* ============================================ */ /* This file has a mobile-to-desktop breakpoint */ /* ============================================ */ @media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .clear { clear: both; display: block; overflow: hidden; visibility: hidden; width: 0; height: 0; } .grid-container:before, .clearfix:before, .grid-container:after, .clearfix:after { content: "."; display: block; overflow: hidden; visibility: hidden; font-size: 0; line-height: 0; width: 0; height: 0; } .grid-container:after, .clearfix:after { clear: both; } .grid-container { margin-left: auto; margin-right: auto; max-width: 1200px; padding-left: 10px; padding-right: 10px; } .grid-5, .mobile-grid-5, .grid-10, .mobile-grid-10, .grid-15, .mobile-grid-15, .grid-20, .mobile-grid-20, .grid-25, .mobile-grid-25, .grid-30, .mobile-grid-30, .grid-35, .mobile-grid-35, .grid-40, .mobile-grid-40, .grid-45, .mobile-grid-45, .grid-50, .mobile-grid-50, .grid-55, .mobile-grid-55, .grid-60, .mobile-grid-60, .grid-65, .mobile-grid-65, .grid-70, .mobile-grid-70, .grid-75, .mobile-grid-75, .grid-80, .mobile-grid-80, .grid-85, .mobile-grid-85, .grid-90, .mobile-grid-90, .grid-95, .mobile-grid-95, .grid-100, .mobile-grid-100, .grid-33, .mobile-grid-33, .grid-66, .mobile-grid-66 { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; padding-left: 10px; padding-right: 10px; } .grid-parent { padding-left: 0; padding-right: 0; } @media screen and (max-width: 767px) { .mobile-grid-100:before, .mobile-grid-100:after { content: "."; display: block; overflow: hidden; visibility: hidden; font-size: 0; line-height: 0; width: 0; height: 0; } .mobile-grid-100:after { clear: both; } .mobile-push-5, .mobile-pull-5, .mobile-push-10, .mobile-pull-10, .mobile-push-15, .mobile-pull-15, .mobile-push-20, .mobile-pull-20, .mobile-push-25, .mobile-pull-25, .mobile-push-30, .mobile-pull-30, .mobile-push-35, .mobile-pull-35, .mobile-push-40, .mobile-pull-40, .mobile-push-45, .mobile-pull-45, .mobile-push-50, .mobile-pull-50, .mobile-push-55, .mobile-pull-55, .mobile-push-60, .mobile-pull-60, .mobile-push-65, .mobile-pull-65, .mobile-push-70, .mobile-pull-70, .mobile-push-75, .mobile-pull-75, .mobile-push-80, .mobile-pull-80, .mobile-push-85, .mobile-pull-85, .mobile-push-90, .mobile-pull-90, .mobile-push-95, .mobile-pull-95, .mobile-push-33, .mobile-pull-33, .mobile-push-66, .mobile-pull-66 { position: relative; } .hide-on-mobile { display: none !important; } .mobile-grid-5 { float: left; width: 5%; } .mobile-prefix-5 { margin-left: 5%; } .mobile-suffix-5 { margin-right: 5%; } .mobile-push-5 { left: 5%; } .mobile-pull-5 { left: -5%; } .mobile-grid-10 { float: left; width: 10%; } .mobile-prefix-10 { margin-left: 10%; } .mobile-suffix-10 { margin-right: 10%; } .mobile-push-10 { left: 10%; } .mobile-pull-10 { left: -10%; } .mobile-grid-15 { float: left; width: 15%; } .mobile-prefix-15 { margin-left: 15%; } .mobile-suffix-15 { margin-right: 15%; } .mobile-push-15 { left: 15%; } .mobile-pull-15 { left: -15%; } .mobile-grid-20 { float: left; width: 20%; } .mobile-prefix-20 { margin-left: 20%; } .mobile-suffix-20 { margin-right: 20%; } .mobile-push-20 { left: 20%; } .mobile-pull-20 { left: -20%; } .mobile-grid-25 { float: left; width: 25%; } .mobile-prefix-25 { margin-left: 25%; } .mobile-suffix-25 { margin-right: 25%; } .mobile-push-25 { left: 25%; } .mobile-pull-25 { left: -25%; } .mobile-grid-30 { float: left; width: 30%; } .mobile-prefix-30 { margin-left: 30%; } .mobile-suffix-30 { margin-right: 30%; } .mobile-push-30 { left: 30%; } .mobile-pull-30 { left: -30%; } .mobile-grid-35 { float: left; width: 35%; } .mobile-prefix-35 { margin-left: 35%; } .mobile-suffix-35 { margin-right: 35%; } .mobile-push-35 { left: 35%; } .mobile-pull-35 { left: -35%; } .mobile-grid-40 { float: left; width: 40%; } .mobile-prefix-40 { margin-left: 40%; } .mobile-suffix-40 { margin-right: 40%; } .mobile-push-40 { left: 40%; } .mobile-pull-40 { left: -40%; } .mobile-grid-45 { float: left; width: 45%; } .mobile-prefix-45 { margin-left: 45%; } .mobile-suffix-45 { margin-right: 45%; } .mobile-push-45 { left: 45%; } .mobile-pull-45 { left: -45%; } .mobile-grid-50 { float: left; width: 50%; } .mobile-prefix-50 { margin-left: 50%; } .mobile-suffix-50 { margin-right: 50%; } .mobile-push-50 { left: 50%; } .mobile-pull-50 { left: -50%; } .mobile-grid-55 { float: left; width: 55%; } .mobile-prefix-55 { margin-left: 55%; } .mobile-suffix-55 { margin-right: 55%; } .mobile-push-55 { left: 55%; } .mobile-pull-55 { left: -55%; } .mobile-grid-60 { float: left; width: 60%; } .mobile-prefix-60 { margin-left: 60%; } .mobile-suffix-60 { margin-right: 60%; } .mobile-push-60 { left: 60%; } .mobile-pull-60 { left: -60%; } .mobile-grid-65 { float: left; width: 65%; } .mobile-prefix-65 { margin-left: 65%; } .mobile-suffix-65 { margin-right: 65%; } .mobile-push-65 { left: 65%; } .mobile-pull-65 { left: -65%; } .mobile-grid-70 { float: left; width: 70%; } .mobile-prefix-70 { margin-left: 70%; } .mobile-suffix-70 { margin-right: 70%; } .mobile-push-70 { left: 70%; } .mobile-pull-70 { left: -70%; } .mobile-grid-75 { float: left; width: 75%; } .mobile-prefix-75 { margin-left: 75%; } .mobile-suffix-75 { margin-right: 75%; } .mobile-push-75 { left: 75%; } .mobile-pull-75 { left: -75%; } .mobile-grid-80 { float: left; width: 80%; } .mobile-prefix-80 { margin-left: 80%; } .mobile-suffix-80 { margin-right: 80%; } .mobile-push-80 { left: 80%; } .mobile-pull-80 { left: -80%; } .mobile-grid-85 { float: left; width: 85%; } .mobile-prefix-85 { margin-left: 85%; } .mobile-suffix-85 { margin-right: 85%; } .mobile-push-85 { left: 85%; } .mobile-pull-85 { left: -85%; } .mobile-grid-90 { float: left; width: 90%; } .mobile-prefix-90 { margin-left: 90%; } .mobile-suffix-90 { margin-right: 90%; } .mobile-push-90 { left: 90%; } .mobile-pull-90 { left: -90%; } .mobile-grid-95 { float: left; width: 95%; } .mobile-prefix-95 { margin-left: 95%; } .mobile-suffix-95 { margin-right: 95%; } .mobile-push-95 { left: 95%; } .mobile-pull-95 { left: -95%; } .mobile-grid-33 { float: left; width: 33.33333%; } .mobile-prefix-33 { margin-left: 33.33333%; } .mobile-suffix-33 { margin-right: 33.33333%; } .mobile-push-33 { left: 33.33333%; } .mobile-pull-33 { left: -33.33333%; } .mobile-grid-66 { float: left; width: 66.66667%; } .mobile-prefix-66 { margin-left: 66.66667%; } .mobile-suffix-66 { margin-right: 66.66667%; } .mobile-push-66 { left: 66.66667%; } .mobile-pull-66 { left: -66.66667%; } .mobile-grid-100 { clear: both; width: 100%; } } @media screen and (min-width: 768px) { .grid-100:before, .grid-100:after { content: "."; display: block; overflow: hidden; visibility: hidden; font-size: 0; line-height: 0; width: 0; height: 0; } .grid-100:after { clear: both; } .push-5, .pull-5, .push-10, .pull-10, .push-15, .pull-15, .push-20, .pull-20, .push-25, .pull-25, .push-30, .pull-30, .push-35, .pull-35, .push-40, .pull-40, .push-45, .pull-45, .push-50, .pull-50, .push-55, .pull-55, .push-60, .pull-60, .push-65, .pull-65, .push-70, .pull-70, .push-75, .pull-75, .push-80, .pull-80, .push-85, .pull-85, .push-90, .pull-90, .push-95, .pull-95, .push-33, .pull-33, .push-66, .pull-66 { position: relative; } .hide-on-desktop { display: none !important; } .grid-5 { float: left; width: 5%; } .prefix-5 { margin-left: 5%; } .suffix-5 { margin-right: 5%; } .push-5 { left: 5%; } .pull-5 { left: -5%; } .grid-10 { float: left; width: 10%; } .prefix-10 { margin-left: 10%; } .suffix-10 { margin-right: 10%; } .push-10 { left: 10%; } .pull-10 { left: -10%; } .grid-15 { float: left; width: 15%; } .prefix-15 { margin-left: 15%; } .suffix-15 { margin-right: 15%; } .push-15 { left: 15%; } .pull-15 { left: -15%; } .grid-20 { float: left; width: 20%; } .prefix-20 { margin-left: 20%; } .suffix-20 { margin-right: 20%; } .push-20 { left: 20%; } .pull-20 { left: -20%; } .grid-25 { float: left; width: 25%; } .prefix-25 { margin-left: 25%; } .suffix-25 { margin-right: 25%; } .push-25 { left: 25%; } .pull-25 { left: -25%; } .grid-30 { float: left; width: 30%; } .prefix-30 { margin-left: 30%; } .suffix-30 { margin-right: 30%; } .push-30 { left: 30%; } .pull-30 { left: -30%; } .grid-35 { float: left; width: 35%; } .prefix-35 { margin-left: 35%; } .suffix-35 { margin-right: 35%; } .push-35 { left: 35%; } .pull-35 { left: -35%; } .grid-40 { float: left; width: 40%; } .prefix-40 { margin-left: 40%; } .suffix-40 { margin-right: 40%; } .push-40 { left: 40%; } .pull-40 { left: -40%; } .grid-45 { float: left; width: 45%; } .prefix-45 { margin-left: 45%; } .suffix-45 { margin-right: 45%; } .push-45 { left: 45%; } .pull-45 { left: -45%; } .grid-50 { float: left; width: 50%; } .prefix-50 { margin-left: 50%; } .suffix-50 { margin-right: 50%; } .push-50 { left: 50%; } .pull-50 { left: -50%; } .grid-55 { float: left; width: 55%; } .prefix-55 { margin-left: 55%; } .suffix-55 { margin-right: 55%; } .push-55 { left: 55%; } .pull-55 { left: -55%; } .grid-60 { float: left; width: 60%; } .prefix-60 { margin-left: 60%; } .suffix-60 { margin-right: 60%; } .push-60 { left: 60%; } .pull-60 { left: -60%; } .grid-65 { float: left; width: 65%; } .prefix-65 { margin-left: 65%; } .suffix-65 { margin-right: 65%; } .push-65 { left: 65%; } .pull-65 { left: -65%; } .grid-70 { float: left; width: 70%; } .prefix-70 { margin-left: 70%; } .suffix-70 { margin-right: 70%; } .push-70 { left: 70%; } .pull-70 { left: -70%; } .grid-75 { float: left; width: 75%; } .prefix-75 { margin-left: 75%; } .suffix-75 { margin-right: 75%; } .push-75 { left: 75%; } .pull-75 { left: -75%; } .grid-80 { float: left; width: 80%; } .prefix-80 { margin-left: 80%; } .suffix-80 { margin-right: 80%; } .push-80 { left: 80%; } .pull-80 { left: -80%; } .grid-85 { float: left; width: 85%; } .prefix-85 { margin-left: 85%; } .suffix-85 { margin-right: 85%; } .push-85 { left: 85%; } .pull-85 { left: -85%; } .grid-90 { float: left; width: 90%; } .prefix-90 { margin-left: 90%; } .suffix-90 { margin-right: 90%; } .push-90 { left: 90%; } .pull-90 { left: -90%; } .grid-95 { float: left; width: 95%; } .prefix-95 { margin-left: 95%; } .suffix-95 { margin-right: 95%; } .push-95 { left: 95%; } .pull-95 { left: -95%; } .grid-33 { float: left; width: 33.33333%; } .prefix-33 { margin-left: 33.33333%; } .suffix-33 { margin-right: 33.33333%; } .push-33 { left: 33.33333%; } .pull-33 { left: -33.33333%; } .grid-66 { float: left; width: 66.66667%; } .prefix-66 { margin-left: 66.66667%; } .suffix-66 { margin-right: 66.66667%; } .push-66 { left: 66.66667%; } .pull-66 { left: -66.66667%; } .grid-100 { clear: both; width: 100%; } } ================================================ FILE: player/player.html ================================================ Papa Parse Player

    Papa Parse Player

    Line Endings:

    or


     

    Open the Console in your browser's inspector tools to see results.
    ================================================ FILE: player/player.js ================================================ var stepped = 0, chunks = 0, rows = 0; var start, end; var parser; var pauseChecked = false; var printStepChecked = false; $(function() { $('#submit-parse').click(function() { stepped = 0; chunks = 0; rows = 0; var txt = $('#input').val(); var localChunkSize = $('#localChunkSize').val(); var remoteChunkSize = $('#remoteChunkSize').val(); var files = $('#files')[0].files; var config = buildConfig(); // NOTE: Chunk size does not get reset if changed and then set back to empty/default value if (localChunkSize) Papa.LocalChunkSize = localChunkSize; if (remoteChunkSize) Papa.RemoteChunkSize = remoteChunkSize; pauseChecked = $('#step-pause').prop('checked'); printStepChecked = $('#print-steps').prop('checked'); if (files.length > 0) { if (!$('#stream').prop('checked') && !$('#chunk').prop('checked')) { for (var i = 0; i < files.length; i++) { if (files[i].size > 1024 * 1024 * 10) { alert("A file you've selected is larger than 10 MB; please choose to stream or chunk the input to prevent the browser from crashing."); return; } } } start = performance.now(); $('#files').parse({ config: config, before: function(file, inputElem) { console.log("Parsing file:", file); }, complete: function() { console.log("Done with all files."); } }); } else { start = performance.now(); var results = Papa.parse(txt, config); console.log("Synchronous parse results:", results); } }); $('#submit-unparse').click(function() { var input = $('#input').val(); var delim = $('#delimiter').val(); var header = $('#header').prop('checked'); var results = Papa.unparse(input, { delimiter: delim, header: header, }); console.log("Unparse complete!"); console.log("--------------------------------------"); console.log(results); console.log("--------------------------------------"); }); $('#insert-tab').click(function() { $('#delimiter').val('\t'); }); }); function buildConfig() { return { delimiter: $('#delimiter').val(), newline: getLineEnding(), header: $('#header').prop('checked'), dynamicTyping: $('#dynamicTyping').prop('checked'), preview: parseInt($('#preview').val() || 0), step: $('#stream').prop('checked') ? stepFn : undefined, encoding: $('#encoding').val(), worker: $('#worker').prop('checked'), comments: $('#comments').val(), complete: completeFn, error: errorFn, download: $('#download').prop('checked'), fastMode: $('#fastmode').prop('checked'), skipEmptyLines: $('#skipEmptyLines').prop('checked'), chunk: $('#chunk').prop('checked') ? chunkFn : undefined, beforeFirstChunk: undefined, skipFirstNLines: $('#skipFirstNLines').val() }; function getLineEnding() { if ($('#newline-n').is(':checked')) return "\n"; else if ($('#newline-r').is(':checked')) return "\r"; else if ($('#newline-rn').is(':checked')) return "\r\n"; else return ""; } } function stepFn(results, parserHandle) { stepped++; rows += results.data.length; parser = parserHandle; if (pauseChecked) { console.log(results, results.data[0]); parserHandle.pause(); return; } if (printStepChecked) console.log(results, results.data[0]); } function chunkFn(results, streamer, file) { if (!results) return; chunks++; rows += results.data.length; parser = streamer; if (printStepChecked) console.log("Chunk data:", results.data.length, results); if (pauseChecked) { console.log("Pausing; " + results.data.length + " rows in chunk; file:", file); streamer.pause(); return; } } function errorFn(error, file) { console.log("ERROR:", error, file); } function completeFn() { end = performance.now(); if (!$('#stream').prop('checked') && !$('#chunk').prop('checked') && arguments[0] && arguments[0].data) rows = arguments[0].data.length; console.log("Finished input (async). Time:", end-start, arguments); console.log("Rows:", rows, "Stepped:", stepped, "Chunks:", chunks); } ================================================ FILE: tests/.eslintrc.js ================================================ module.exports = { "extends": ["../.eslintrc.js"], "parserOptions": { "ecmaVersion": 8 }, "env": { "mocha": true }, "rules": { } }; ================================================ FILE: tests/long-sample.csv ================================================ Grant,Dyer,Donec.elementum@orciluctuset.example,2013-11-23T02:30:31-08:00,2014-05-31T01:06:56-07:00,Magna Ut Associates,ljenkins Cherokee,Shields,Nulla.Semper.Tellus@duinec.example,2014-11-22T16:43:51-08:00,2013-09-26T11:47:15-07:00,Pede Corporation,Donec.elementum@orciluctuset.example Catherine,Parrish,lorem@feugiatnon.example,2015-02-11T12:01:10-08:00,2015-02-26T00:29:40-08:00,Phasellus Fermentum Convallis PC,Donec.elementum@orciluctuset.example Destiny,Shannon,libero@Aenean.example,2015-07-14T09:38:11-07:00,2014-01-11T14:53:04-08:00,Pretium Et Inc.,Donec.elementum@orciluctuset.example Callum,Underwood,Phasellus@Quisquetincidunt.example,2013-09-13T18:49:35-07:00,2014-12-04T23:04:19-08:00,Sed Turpis Nec LLP,ljenkins Elliott,Wright,cursus@nibh.example,2015-04-20T14:35:19-07:00,2015-03-05T12:56:46-08:00,Dolor Associate,Phasellus@Quisquetincidunt.example Galvin,Foley,nisi.Aenean.eget@atauctorullamcorper.example,2014-03-20T23:20:15-07:00,2014-06-11T15:00:23-07:00,Adipiscing Industrie,Phasellus@Quisquetincidunt.example Talon,Salinas,posuere.vulputate.lacus@Donecsollicitudin.example,2015-01-31T09:19:02-08:00,2014-12-17T04:59:18-08:00,Aliquam Iaculis Incorporate,Phasellus@Quisquetincidunt.example ================================================ FILE: tests/node-tests.js ================================================ "use strict"; var Papa = require("../papaparse.js"); var fs = require('fs'); var assert = require('assert'); var longSampleRawCsv = fs.readFileSync(__dirname + '/long-sample.csv', 'utf8'); var utf8BomSampleRawCsv = fs.readFileSync(__dirname + '/utf-8-bom-sample.csv', 'utf8'); function assertLongSampleParsedCorrectly(parsedCsv) { assert.equal(8, parsedCsv.data.length); assert.deepEqual(parsedCsv.data[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(parsedCsv.data[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); assert.deepEqual(parsedCsv.meta, { "delimiter": ",", "linebreak": "\n", "aborted": false, "truncated": false, renamedHeaders: null, "cursor": 1209 }); assert.equal(parsedCsv.errors.length, 0); } describe('PapaParse', function() { it('synchronously parsed CSV should be correctly parsed', function() { assertLongSampleParsedCorrectly(Papa.parse(longSampleRawCsv)); }); it('Pause and resume works (Regression Test for Bug #636)', function(done) { this.timeout(30000); var mod200Rows = [ ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Lorem ipsum dolor sit","42","ABC"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84"], ["Lorem ipsum dolor sit","42","ABC"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Lorem ipsum dolor sit","42","ABC"], ["Lorem ipsum dolor sit","42"] ]; var stepped = 0; var dataRows = []; Papa.parse(fs.createReadStream(__dirname + '/verylong-sample.csv'), { step: function(results, parser) { stepped++; if (results) { parser.pause(); parser.resume(); if (results.data && stepped % 200 === 0) { dataRows.push(results.data); } } }, complete: function() { assert.strictEqual(2001, stepped); assert.deepEqual(mod200Rows, dataRows); done(); } }); }); it('asynchronously parsed CSV should be correctly parsed', function(done) { Papa.parse(longSampleRawCsv, { complete: function(parsedCsv) { assertLongSampleParsedCorrectly(parsedCsv); done(); }, }); }); it('asynchronously parsed streaming CSV should be correctly parsed', function(done) { Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { complete: function(parsedCsv) { assertLongSampleParsedCorrectly(parsedCsv); done(); }, }); }); it('reports the correct row number on FieldMismatch errors', function(done) { Papa.parse(fs.createReadStream(__dirname + '/verylong-sample.csv'), { header: true, fastMode: true, complete: function(parsedCsv) { assert.deepEqual(parsedCsv.errors, [ { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 498 }, { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 998 }, { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 1498 }, { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 1998 } ]); assert.strictEqual(2000, parsedCsv.data.length); done(); }, }); }); it('piped streaming CSV should be correctly parsed', function(done) { var data = []; var readStream = fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'); var csvStream = readStream.pipe(Papa.parse(Papa.NODE_STREAM_INPUT)); csvStream.on('data', function(item) { data.push(item); }); csvStream.on('end', function() { assert.deepEqual(data[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(data[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); done(); }); }); it('piped streaming CSV should be correctly parsed when header is true', function(done) { var data = []; var readStream = fs.createReadStream(__dirname + '/sample-header.csv', 'utf8'); var csvStream = readStream.pipe(Papa.parse(Papa.NODE_STREAM_INPUT, {header: true})); csvStream.on('data', function(item) { data.push(item); }); csvStream.on('end', function() { assert.deepEqual(data[0], { title: 'test title 01', name: 'test name 01' }); assert.deepEqual(data[1], { title: '', name: 'test name 02' }); done(); }); }); it('should support pausing and resuming on same tick when streaming', function(done) { var rows = []; Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { chunk: function(results, parser) { rows = rows.concat(results.data); parser.pause(); parser.resume(); }, error: function(err) { done(new Error(err)); }, complete: function() { assert.deepEqual(rows[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(rows[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); done(); } }); }); it('should support pausing and resuming asynchronously when streaming', function(done) { var rows = []; Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { chunk: function(results, parser) { rows = rows.concat(results.data); parser.pause(); setTimeout(function() { parser.resume(); }, 200); }, error: function(err) { done(new Error(err)); }, complete: function() { assert.deepEqual(rows[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(rows[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); done(); } }); }); it('handles errors in beforeFirstChunk', function(done) { var expectedError = new Error('test'); Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { beforeFirstChunk: function() { throw expectedError; }, error: function(err) { assert.deepEqual(err, expectedError); done(); } }); }); it('handles errors in chunk', function(done) { var expectedError = new Error('test'); Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { chunk: function() { throw expectedError; }, error: function(err) { assert.deepEqual(err, expectedError); done(); } }); }); it('handles errors in step', function(done) { var expectedError = new Error('test'); Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { step: function() { throw expectedError; }, error: function(err) { assert.deepEqual(err, expectedError); done(); } }); }); it('handles utf-8 BOM encoded files', function(done) { Papa.parse(utf8BomSampleRawCsv, { header: true, complete: function(parsedCsv) { assert.deepEqual(parsedCsv.data[0], { A: 'X', B: 'Y', C: 'Z' }); done(); } }); }); }); ================================================ FILE: tests/sample-header.csv ================================================ title,name test title 01,test name 01 ,test name 02 ================================================ FILE: tests/sample.csv ================================================ A,B,C X,Y,Z ================================================ FILE: tests/test-cases.js ================================================ var chai; var Papa; if (typeof module !== 'undefined' && module.exports) { chai = require('chai'); Papa = require('../papaparse.js'); } var assert = chai.assert; var BASE_PATH = (typeof document === 'undefined') ? './' : document.getElementById('test-cases').src.replace(/test-cases\.js$/, ''); var RECORD_SEP = String.fromCharCode(30); var UNIT_SEP = String.fromCharCode(31); var FILES_ENABLED = false; try { new File([""], ""); // eslint-disable-line no-new // Required since Node20 as it ads a FileGlobal but not a FileReaderSync new FileReaderSync(); // eslint-disable-line no-new FILES_ENABLED = true; } catch (e) {} // safari, ie var XHR_ENABLED = false; try { new XMLHttpRequest(); // eslint-disable-line no-new XHR_ENABLED = true; } catch (e) {} // safari, ie // Tests for the core parser using new Papa.Parser().parse() (CSV to JSON) var CORE_PARSER_TESTS = [ { description: "One row", input: 'A,b,c', expected: { data: [['A', 'b', 'c']], errors: [], meta: {delimiter: ',', renamedHeaders: null} } }, { description: "Two rows", input: 'A,b,c\nd,E,f', expected: { data: [['A', 'b', 'c'], ['d', 'E', 'f']], errors: [] } }, { description: "Three rows", input: 'A,b,c\nd,E,f\nG,h,i', expected: { data: [['A', 'b', 'c'], ['d', 'E', 'f'], ['G', 'h', 'i']], errors: [] } }, { description: "Whitespace at edges of unquoted field", input: 'a, b ,c', notes: "Extra whitespace should graciously be preserved", expected: { data: [['a', ' b ', 'c']], errors: [] } }, { description: "Quoted field", input: 'A,"B",C', expected: { data: [['A', 'B', 'C']], errors: [] } }, { description: "Quoted field with extra whitespace on edges", input: 'A," B ",C', expected: { data: [['A', ' B ', 'C']], errors: [] } }, { description: "Quoted field with delimiter", input: 'A,"B,B",C', expected: { data: [['A', 'B,B', 'C']], errors: [] } }, { description: "Quoted field with line break", input: 'A,"B\nB",C', expected: { data: [['A', 'B\nB', 'C']], errors: [] } }, { description: "Quoted fields with line breaks", input: 'A,"B\nB","C\nC\nC"', expected: { data: [['A', 'B\nB', 'C\nC\nC']], errors: [] } }, { description: "Quoted fields at end of row with delimiter and line break", input: 'a,b,"c,c\nc"\nd,e,f', expected: { data: [['a', 'b', 'c,c\nc'], ['d', 'e', 'f']], errors: [] } }, { description: "Quoted field with escaped quotes", input: 'A,"B""B""B",C', expected: { data: [['A', 'B"B"B', 'C']], errors: [] } }, { description: "Quoted field with escaped quotes at boundaries", input: 'A,"""B""",C', expected: { data: [['A', '"B"', 'C']], errors: [] } }, { description: "Unquoted field with quotes at end of field", notes: "The quotes character is misplaced, but shouldn't generate an error or break the parser", input: 'A,B",C', expected: { data: [['A', 'B"', 'C']], errors: [] } }, { description: "Quoted field with quotes around delimiter", input: 'A,""",""",C', notes: "For a boundary to exist immediately before the quotes, we must not already be in quotes", expected: { data: [['A', '","', 'C']], errors: [] } }, { description: "Quoted field with quotes on right side of delimiter", input: 'A,",""",C', notes: "Similar to the test above but with quotes only after the comma", expected: { data: [['A', ',"', 'C']], errors: [] } }, { description: "Quoted field with quotes on left side of delimiter", input: 'A,""",",C', notes: "Similar to the test above but with quotes only before the comma", expected: { data: [['A', '",', 'C']], errors: [] } }, { description: "Quoted field with 5 quotes in a row and a delimiter in there, too", input: '"1","cnonce="""",nc=""""","2"', notes: "Actual input reported in issue #121", expected: { data: [['1', 'cnonce="",nc=""', '2']], errors: [] } }, { description: "Quoted field with whitespace around quotes", input: 'A, "B" ,C', notes: "The quotes must be immediately adjacent to the delimiter to indicate a quoted field", expected: { data: [['A', ' "B" ', 'C']], errors: [] } }, { description: "Misplaced quotes in data, not as opening quotes", input: 'A,B "B",C', notes: "The input is technically malformed, but this syntax should not cause an error", expected: { data: [['A', 'B "B"', 'C']], errors: [] } }, { description: "Quoted field has no closing quote", input: 'a,"b,c\nd,e,f', expected: { data: [['a', 'b,c\nd,e,f']], errors: [{ "type": "Quotes", "code": "MissingQuotes", "message": "Quoted field unterminated", "row": 0, "index": 3 }] } }, { description: "Quoted field has invalid trailing quote after delimiter with a valid closer", input: '"a,"b,c"\nd,e,f', notes: "The input is malformed, opening quotes identified, trailing quote is malformed. Trailing quote should be escaped or followed by valid new line or delimiter to be valid", expected: { data: [['a,"b,c'], ['d', 'e', 'f']], errors: [{ "type": "Quotes", "code": "InvalidQuotes", "message": "Trailing quote on quoted field is malformed", "row": 0, "index": 1 }] } }, { description: "Quoted field has invalid trailing quote after delimiter", input: 'a,"b,"c\nd,e,f', notes: "The input is malformed, opening quotes identified, trailing quote is malformed. Trailing quote should be escaped or followed by valid new line or delimiter to be valid", expected: { data: [['a', 'b,"c\nd,e,f']], errors: [{ "type": "Quotes", "code": "InvalidQuotes", "message": "Trailing quote on quoted field is malformed", "row": 0, "index": 3 }, { "type": "Quotes", "code": "MissingQuotes", "message": "Quoted field unterminated", "row": 0, "index": 3 }] } }, { description: "Quoted field has invalid trailing quote before delimiter", input: 'a,"b"c,d\ne,f,g', notes: "The input is malformed, opening quotes identified, trailing quote is malformed. Trailing quote should be escaped or followed by valid new line or delimiter to be valid", expected: { data: [['a', 'b"c,d\ne,f,g']], errors: [{ "type": "Quotes", "code": "InvalidQuotes", "message": "Trailing quote on quoted field is malformed", "row": 0, "index": 3 }, { "type": "Quotes", "code": "MissingQuotes", "message": "Quoted field unterminated", "row": 0, "index": 3 }] } }, { description: "Quoted field has invalid trailing quote after new line", input: 'a,"b,c\nd"e,f,g', notes: "The input is malformed, opening quotes identified, trailing quote is malformed. Trailing quote should be escaped or followed by valid new line or delimiter to be valid", expected: { data: [['a', 'b,c\nd"e,f,g']], errors: [{ "type": "Quotes", "code": "InvalidQuotes", "message": "Trailing quote on quoted field is malformed", "row": 0, "index": 3 }, { "type": "Quotes", "code": "MissingQuotes", "message": "Quoted field unterminated", "row": 0, "index": 3 }] } }, { description: "Quoted field has valid trailing quote via delimiter", input: 'a,"b",c\nd,e,f', notes: "Trailing quote is valid due to trailing delimiter", expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Quoted field has valid trailing quote via \\n", input: 'a,b,"c"\nd,e,f', notes: "Trailing quote is valid due to trailing new line delimiter", expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Quoted field has valid trailing quote via EOF", input: 'a,b,c\nd,e,"f"', notes: "Trailing quote is valid due to EOF", expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Quoted field contains delimiters and \\n with valid trailing quote", input: 'a,"b,c\nd,e,f"', notes: "Trailing quote is valid due to trailing delimiter", expected: { data: [['a', 'b,c\nd,e,f']], errors: [] } }, { description: "Line starts with quoted field", input: 'a,b,c\n"d",e,f', expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Line starts with unquoted empty field", input: ',b,c\n"d",e,f', expected: { data: [['', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Line ends with quoted field", input: 'a,b,c\nd,e,f\n"g","h","i"\n"j","k","l"', expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l']], errors: [] } }, { description: "Line ends with quoted field, first field of next line is empty, \\n", input: 'a,b,c\n,e,f\n,"h","i"\n,"k","l"', config: { newline: '\n', }, expected: { data: [['a', 'b', 'c'], ['', 'e', 'f'], ['', 'h', 'i'], ['', 'k', 'l']], errors: [] } }, { description: "Quoted field at end of row (but not at EOF) has quotes", input: 'a,b,"c""c"""\nd,e,f', expected: { data: [['a', 'b', 'c"c"'], ['d', 'e', 'f']], errors: [] } }, { description: "Empty quoted field at EOF is empty", input: 'a,b,""\na,b,""', expected: { data: [['a', 'b', ''], ['a', 'b', '']], errors: [] } }, { description: "Multiple consecutive empty fields", input: 'a,b,,,c,d\n,,e,,,f', expected: { data: [['a', 'b', '', '', 'c', 'd'], ['', '', 'e', '', '', 'f']], errors: [] } }, { description: "Empty input string", input: '', expected: { data: [], errors: [] } }, { description: "Input is just the delimiter (2 empty fields)", input: ',', expected: { data: [['', '']], errors: [] } }, { description: "Input is just empty fields", input: ',,\n,,,', expected: { data: [['', '', ''], ['', '', '', '']], errors: [] } }, { description: "Input is just a string (a single field)", input: 'Abc def', expected: { data: [['Abc def']], errors: [] } }, { description: "Commented line at beginning", input: '# Comment!\na,b,c', config: { comments: true }, expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Commented line in middle", input: 'a,b,c\n# Comment\nd,e,f', config: { comments: true }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Commented line at end", input: 'a,true,false\n# Comment', config: { comments: true }, expected: { data: [['a', 'true', 'false']], errors: [] } }, { description: "Two comment lines consecutively", input: 'a,b,c\n#comment1\n#comment2\nd,e,f', config: { comments: true }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Two comment lines consecutively at end of file", input: 'a,b,c\n#comment1\n#comment2', config: { comments: true }, expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Three comment lines consecutively at beginning of file", input: '#comment1\n#comment2\n#comment3\na,b,c', config: { comments: true }, expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Entire file is comment lines", input: '#comment1\n#comment2\n#comment3', config: { comments: true }, expected: { data: [], errors: [] } }, { description: "Comment with non-default character", input: 'a,b,c\n!Comment goes here\nd,e,f', config: { comments: '!' }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Bad comments value specified", notes: "Should silently disable comment parsing", input: 'a,b,c\n5comment\nd,e,f', config: { comments: 5 }, expected: { data: [['a', 'b', 'c'], ['5comment'], ['d', 'e', 'f']], errors: [] } }, { description: "Multi-character comment string", input: 'a,b,c\n=N(Comment)\nd,e,f', config: { comments: "=N(" }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Input with only a commented line", input: '#commented line', config: { comments: true, delimiter: ',' }, expected: { data: [], errors: [] } }, { description: "Input with only a commented line and blank line after", input: '#commented line\n', config: { comments: true, delimiter: ',' }, expected: { data: [['']], errors: [] } }, { description: "Input with only a commented line, without comments enabled", input: '#commented line', config: { delimiter: ',' }, expected: { data: [['#commented line']], errors: [] } }, { description: "Input without comments with line starting with whitespace", input: 'a\n b\nc', config: { delimiter: ',' }, notes: "\" \" == false, but \" \" !== false, so === comparison is required", expected: { data: [['a'], [' b'], ['c']], errors: [] } }, { description: "Multiple rows, one column (no delimiter found)", input: 'a\nb\nc\nd\ne', expected: { data: [['a'], ['b'], ['c'], ['d'], ['e']], errors: [] } }, { description: "One column input with empty fields", input: 'a\nb\n\n\nc\nd\ne\n', expected: { data: [['a'], ['b'], [''], [''], ['c'], ['d'], ['e'], ['']], errors: [] } }, { description: "Fast mode, basic", input: 'a,b,c\nd,e,f', config: { fastMode: true }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Fast mode with comments", input: '// Commented line\na,b,c', config: { fastMode: true, comments: "//" }, expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Fast mode with preview", input: 'a,b,c\nd,e,f\nh,j,i\n', config: { fastMode: true, preview: 2 }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Fast mode with blank line at end", input: 'a,b,c\n', config: { fastMode: true }, expected: { data: [['a', 'b', 'c'], ['']], errors: [] } }, { description: "Simple duplicated header names", input: 'A,A,A,A\n1,2,3,4', config: { header: true }, expected: { data: [['A', 'A_1', 'A_2', 'A_3'], ['1', '2', '3', '4']], errors: [], meta: { renamedHeaders: {A_1: 'A', A_2: 'A', A_3: 'A'}, cursor: 15 } } }, { description: "Duplicated header names with headerTransform", input: 'A,A,A,A\n1,2,3,4', config: { header: true, transformHeader: function(header) { return header.toLowerCase(); } }, expected: { data: [['a', 'a_1', 'a_2', 'a_3'], ['1', '2', '3', '4']], errors: [], meta: { renamedHeaders: {a_1: 'a', a_2: 'a', a_3: 'a'}, cursor: 15 } } }, { description: "Duplicated header names existing column", input: 'c,c,c,c_1\n1,2,3,4', config: { header: true }, expected: { data: [['c', 'c_2', 'c_3', 'c_1'], ['1', '2', '3', '4']], errors: [], meta: { renamedHeaders: {c_2: 'c', c_3: 'c'}, cursor: 17 } } }, { description: "Duplicate header names with __proto__ field", input: '__proto__,__proto__,__proto__\n1,2,3', config: { header: true }, expected: { data: [['__proto__', '__proto___1', '__proto___2'], ['1', '2', '3']], errors: [], meta: { renamedHeaders: {__proto___1: '__proto__', __proto___2: '__proto__'}, cursor: 35 } } }, ]; describe('Core Parser Tests', function() { function generateTest(test) { (test.disabled ? it.skip : it)(test.description, function() { var actual = new Papa.Parser(test.config).parse(test.input); assert.deepEqual(actual.errors, test.expected.errors); assert.deepEqual(actual.data, test.expected.data); assert.deepNestedInclude(actual.meta, test.expected.meta || {}); }); } for (var i = 0; i < CORE_PARSER_TESTS.length; i++) { generateTest(CORE_PARSER_TESTS[i]); } }); // Tests for Papa.parse() function -- high-level wrapped parser (CSV to JSON) var PARSE_TESTS = [ { description: "Two rows, just \\r", input: 'A,b,c\rd,E,f', expected: { data: [['A', 'b', 'c'], ['d', 'E', 'f']], errors: [] } }, { description: "Two rows, \\r\\n", input: 'A,b,c\r\nd,E,f', expected: { data: [['A', 'b', 'c'], ['d', 'E', 'f']], errors: [] } }, { description: "Quoted field with \\r\\n", input: 'A,"B\r\nB",C', expected: { data: [['A', 'B\r\nB', 'C']], errors: [] } }, { description: "Quoted field with \\r", input: 'A,"B\rB",C', expected: { data: [['A', 'B\rB', 'C']], errors: [] } }, { description: "Quoted field with \\n", input: 'A,"B\nB",C', expected: { data: [['A', 'B\nB', 'C']], errors: [] } }, { description: "Quoted fields with spaces between closing quote and next delimiter", input: 'A,"B" ,C,D\r\nE,F,"G" ,H', expected: { data: [['A', 'B', 'C','D'],['E', 'F', 'G','H']], errors: [] } }, { description: "Quoted fields with spaces between closing quote and next new line", input: 'A,B,C,"D" \r\nE,F,G,"H" \r\nQ,W,E,R', expected: { data: [['A', 'B', 'C','D'],['E', 'F', 'G','H'],['Q', 'W', 'E','R']], errors: [] } }, { description: "Quoted fields with spaces after closing quote", input: 'A,"B" ,C,"D" \r\nE,F,"G" ,"H" \r\nQ,W,"E" ,R', expected: { data: [['A', 'B', 'C','D'],['E', 'F', 'G','H'],['Q', 'W', 'E','R']], errors: [] } }, { description: "Misplaced quotes in data twice, not as opening quotes", input: 'A,B",C\nD,E",F', expected: { data: [['A', 'B"', 'C'], ['D', 'E"', 'F']], errors: [] } }, { description: "Mixed slash n and slash r should choose first as precident", input: 'a,b,c\nd,e,f\rg,h,i\n', expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f\rg', 'h', 'i'], ['']], errors: [] } }, { description: "Header row with one row of data", input: 'A,B,C\r\na,b,c', config: { header: true }, expected: { data: [{"A": "a", "B": "b", "C": "c"}], errors: [] } }, { description: "Header row only", input: 'A,B,C', config: { header: true }, expected: { data: [], errors: [] } }, { description: "Row with too few fields", input: 'A,B,C\r\na,b', config: { header: true }, expected: { data: [{"A": "a", "B": "b"}], errors: [{ "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 0 }] } }, { description: "Row with too many fields", input: 'A,B,C\r\na,b,c,d,e\r\nf,g,h', config: { header: true }, expected: { data: [{"A": "a", "B": "b", "C": "c", "__parsed_extra": ["d", "e"]}, {"A": "f", "B": "g", "C": "h"}], errors: [{ "type": "FieldMismatch", "code": "TooManyFields", "message": "Too many fields: expected 3 fields but parsed 5", "row": 0 }] } }, { description: "Row with enough fields but blank field in the begining", input: 'A,B,C\r\n,b1,c1\r\na2,b2,c2', expected: { data: [["A", "B", "C"], ['', 'b1', 'c1'], ['a2', 'b2', 'c2']], errors: [] } }, { description: "Row with enough fields but blank field in the begining using headers", input: 'A,B,C\r\n,b1,c1\r\n,b2,c2', config: { header: true }, expected: { data: [{"A": "", "B": "b1", "C": "c1"}, {"A": "", "B": "b2", "C": "c2"}], errors: [] } }, { description: "Row with enough fields but blank field at end", input: 'A,B,C\r\na,b,', config: { header: true }, expected: { data: [{"A": "a", "B": "b", "C": ""}], errors: [] } }, { description: "Header rows are transformed when transformHeader function is provided", input: 'A,B,C\r\na,b,c', config: { header: true, transformHeader: function(header) { return header.toLowerCase(); } }, expected: { data: [{"a": "a", "b": "b", "c": "c"}], errors: [] } }, { description: "transformHeader accepts and optional index attribute", input: 'A,B,C\r\na,b,c', config: { header: true, transformHeader: function(header, i) { return i % 2 ? header.toLowerCase() : header; } }, expected: { data: [{"A": "a", "b": "b", "C": "c"}], errors: [] } }, { description: "Line ends with quoted field, first field of next line is empty using headers", input: 'a,b,"c"\r\nd,e,"f"\r\n,"h","i"\r\n,"k","l"', config: { header: true, newline: '\r\n', }, expected: { data: [ {a: 'd', b: 'e', c: 'f'}, {a: '', b: 'h', c: 'i'}, {a: '', b: 'k', c: 'l'} ], errors: [] } }, { description: "Tab delimiter", input: 'a\tb\tc\r\nd\te\tf', config: { delimiter: "\t" }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Pipe delimiter", input: 'a|b|c\r\nd|e|f', config: { delimiter: "|" }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "ASCII 30 delimiter", input: 'a' + RECORD_SEP + 'b' + RECORD_SEP + 'c\r\nd' + RECORD_SEP + 'e' + RECORD_SEP + 'f', config: { delimiter: RECORD_SEP }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "ASCII 31 delimiter", input: 'a' + UNIT_SEP + 'b' + UNIT_SEP + 'c\r\nd' + UNIT_SEP + 'e' + UNIT_SEP + 'f', config: { delimiter: UNIT_SEP }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Bad delimiter (\\n)", input: 'a,b,c', config: { delimiter: "\n" }, notes: "Should silently default to comma", expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Multi-character delimiter", input: 'a, b, c', config: { delimiter: ", " }, expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Multi-character delimiter (length 2) with quoted field", input: 'a, b, "c, e", d', config: { delimiter: ", " }, notes: "The quotes must be immediately adjacent to the delimiter to indicate a quoted field", expected: { data: [['a', 'b', 'c, e', 'd']], errors: [] } }, { description: "Callback delimiter", input: 'a$ b$ c', config: { delimiter: function(input) { return input[1] + ' '; } }, expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Dynamic typing converts numeric literals and maintains precision", input: '1,2.2,1e3\r\n-4,-4.5,-4e-5\r\n-,5a,5-2\r\n16142028098527942586,9007199254740991,-9007199254740992', config: { dynamicTyping: true }, expected: { data: [[1, 2.2, 1000], [-4, -4.5, -0.00004], ["-", "5a", "5-2"], ["16142028098527942586", 9007199254740991, "-9007199254740992"]], errors: [] } }, { description: "Dynamic typing converts boolean literals", input: 'true,false,T,F,TRUE,FALSE,True,False', config: { dynamicTyping: true }, expected: { data: [[true, false, "T", "F", true, false, "True", "False"]], errors: [] } }, { description: "Dynamic typing doesn't convert other types", input: 'A,B,C\r\nundefined,null,[\r\nvar,float,if', config: { dynamicTyping: true }, expected: { data: [["A", "B", "C"], ["undefined", "null", "["], ["var", "float", "if"]], errors: [] } }, { description: "Dynamic typing applies to specific columns", input: 'A,B,C\r\n1,2.2,1e3\r\n-4,-4.5,-4e-5', config: { header: true, dynamicTyping: { A: true, C: true } }, expected: { data: [{"A": 1, "B": "2.2", "C": 1000}, {"A": -4, "B": "-4.5", "C": -0.00004}], errors: [] } }, { description: "Dynamic typing applies to specific columns by index", input: '1,2.2,1e3\r\n-4,-4.5,-4e-5\r\n-,5a,5-2', config: { dynamicTyping: { 1: true } }, expected: { data: [["1", 2.2, "1e3"], ["-4", -4.5, "-4e-5"], ["-", "5a", "5-2"]], errors: [] } }, { description: "Dynamic typing can be applied to `__parsed_extra`", input: 'A,B,C\r\n1,2.2,1e3,5.5\r\n-4,-4.5,-4e-5', config: { header: true, dynamicTyping: { A: true, C: true, __parsed_extra: true } }, expected: { data: [{"A": 1, "B": "2.2", "C": 1000, "__parsed_extra": [5.5]}, {"A": -4, "B": "-4.5", "C": -0.00004}], errors: [{ "type": "FieldMismatch", "code": "TooManyFields", "message": "Too many fields: expected 3 fields but parsed 4", "row": 0 }] } }, { description: "Dynamic typing by indices can be determined by function", input: '001,002,003', config: { dynamicTyping: function(field) { return (field % 2) === 0; } }, expected: { data: [[1, "002", 3]], errors: [] } }, { description: "Dynamic typing by headers can be determined by function", input: 'A_as_int,B,C_as_int\r\n001,002,003', config: { header: true, dynamicTyping: function(field) { return /_as_int$/.test(field); } }, expected: { data: [{"A_as_int": 1, "B": "002", "C_as_int": 3}], errors: [] } }, { description: "Dynamic typing converts empty values into NULL", input: '1,2.2,1e3\r\n,NULL,\r\n-,5a,null', config: { dynamicTyping: true }, expected: { data: [[1, 2.2, 1000], [null, "NULL", null], ["-", "5a", "null"]], errors: [] } }, { description: "Custom transform function is applied to values", input: 'A,B,C\r\nd,e,f', config: { transform: function(value) { return value.toLowerCase(); } }, expected: { data: [["a","b","c"], ["d","e","f"]], errors: [] } }, { description: "Custom transform accepts column number also", input: 'A,B,C\r\nd,e,f', config: { transform: function(value, column) { if (column % 2) { value = value.toLowerCase(); } return value; } }, expected: { data: [["A","b","C"], ["d","e","f"]], errors: [] } }, { description: "Custom transform accepts header name when using header", input: 'A,B,C\r\nd,e,f', config: { header: true, transform: function(value, name) { if (name === 'B') { value = value.toUpperCase(); } return value; } }, expected: { data: [{'A': "d", 'B': "E", 'C': "f"}], errors: [] } }, { description: "Dynamic typing converts ISO date strings to Dates", input: 'ISO date,long date\r\n2018-05-04T21:08:03.269Z,Fri May 04 2018 14:08:03 GMT-0700 (PDT)\r\n2018-05-08T15:20:22.642Z,Tue May 08 2018 08:20:22 GMT-0700 (PDT)', config: { dynamicTyping: true }, expected: { data: [["ISO date", "long date"], [new Date("2018-05-04T21:08:03.269Z"), "Fri May 04 2018 14:08:03 GMT-0700 (PDT)"], [new Date("2018-05-08T15:20:22.642Z"), "Tue May 08 2018 08:20:22 GMT-0700 (PDT)"]], errors: [] } }, { description: "Dynamic typing skips ISO date strings ocurring in other strings", input: 'ISO date,String with ISO date\r\n2018-05-04T21:08:03.269Z,The date is 2018-05-04T21:08:03.269Z\r\n2018-05-08T15:20:22.642Z,The date is 2018-05-08T15:20:22.642Z', config: { dynamicTyping: true }, expected: { data: [["ISO date", "String with ISO date"], [new Date("2018-05-04T21:08:03.269Z"), "The date is 2018-05-04T21:08:03.269Z"], [new Date("2018-05-08T15:20:22.642Z"), "The date is 2018-05-08T15:20:22.642Z"]], errors: [] } }, { description: "Blank line at beginning", input: '\r\na,b,c\r\nd,e,f', config: { newline: '\r\n' }, expected: { data: [[''], ['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Blank line in middle", input: 'a,b,c\r\n\r\nd,e,f', config: { newline: '\r\n' }, expected: { data: [['a', 'b', 'c'], [''], ['d', 'e', 'f']], errors: [] } }, { description: "Blank lines at end", input: 'a,b,c\nd,e,f\n\n', expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f'], [''], ['']], errors: [] } }, { description: "Blank line in middle with whitespace", input: 'a,b,c\r\n \r\nd,e,f', expected: { data: [['a', 'b', 'c'], [" "], ['d', 'e', 'f']], errors: [] } }, { description: "First field of a line is empty", input: 'a,b,c\r\n,e,f', expected: { data: [['a', 'b', 'c'], ['', 'e', 'f']], errors: [] } }, { description: "Last field of a line is empty", input: 'a,b,\r\nd,e,f', expected: { data: [['a', 'b', ''], ['d', 'e', 'f']], errors: [] } }, { description: "Other fields are empty", input: 'a,,c\r\n,,', expected: { data: [['a', '', 'c'], ['', '', '']], errors: [] } }, { description: "Empty input string", input: '', expected: { data: [], errors: [{ "type": "Delimiter", "code": "UndetectableDelimiter", "message": "Unable to auto-detect delimiting character; defaulted to ','" }] } }, { description: "Input is just the delimiter (2 empty fields)", input: ',', expected: { data: [['', '']], errors: [] } }, { description: "Input is just a string (a single field)", input: 'Abc def', expected: { data: [['Abc def']], errors: [ { "type": "Delimiter", "code": "UndetectableDelimiter", "message": "Unable to auto-detect delimiting character; defaulted to ','" } ] } }, { description: "Preview 0 rows should default to parsing all", input: 'a,b,c\r\nd,e,f\r\ng,h,i', config: { preview: 0 }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], errors: [] } }, { description: "Preview 1 row", input: 'a,b,c\r\nd,e,f\r\ng,h,i', config: { preview: 1 }, expected: { data: [['a', 'b', 'c']], errors: [] } }, { description: "Preview 2 rows", input: 'a,b,c\r\nd,e,f\r\ng,h,i', config: { preview: 2 }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Preview all (3) rows", input: 'a,b,c\r\nd,e,f\r\ng,h,i', config: { preview: 3 }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], errors: [] } }, { description: "Preview more rows than input has", input: 'a,b,c\r\nd,e,f\r\ng,h,i', config: { preview: 4 }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], errors: [] } }, { description: "Preview should count rows, not lines", input: 'a,b,c\r\nd,e,"f\r\nf",g,h,i', config: { preview: 2 }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f\r\nf', 'g', 'h', 'i']], errors: [] } }, { description: "Preview with header row", notes: "Preview is defined to be number of rows of input not including header row", input: 'a,b,c\r\nd,e,f\r\ng,h,i\r\nj,k,l', config: { header: true, preview: 2 }, expected: { data: [{"a": "d", "b": "e", "c": "f"}, {"a": "g", "b": "h", "c": "i"}], errors: [] } }, { description: "Empty lines", input: '\na,b,c\n\nd,e,f\n\n', config: { delimiter: ',' }, expected: { data: [[''], ['a', 'b', 'c'], [''], ['d', 'e', 'f'], [''], ['']], errors: [] } }, { description: "Skip empty lines", input: 'a,b,c\n\nd,e,f', config: { skipEmptyLines: true }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Skip empty lines, with newline at end of input", input: 'a,b,c\r\n\r\nd,e,f\r\n', config: { skipEmptyLines: true }, expected: { data: [['a', 'b', 'c'], ['d', 'e', 'f']], errors: [] } }, { description: "Skip empty lines, with empty input", input: '', config: { skipEmptyLines: true }, expected: { data: [], errors: [ { "type": "Delimiter", "code": "UndetectableDelimiter", "message": "Unable to auto-detect delimiting character; defaulted to ','" } ] } }, { description: "Skip empty lines, with first line only whitespace", notes: "A line must be absolutely empty to be considered empty", input: ' \na,b,c', config: { skipEmptyLines: true, delimiter: ',' }, expected: { data: [[" "], ['a', 'b', 'c']], errors: [] } }, { description: "Skip empty lines while detecting delimiter", notes: "Parsing correctly newline-terminated short data with delimiter:auto and skipEmptyLines:true", input: 'a,b\n1,2\n3,4\n', config: { header: true, skipEmptyLines: true }, expected: { data: [{'a': '1', 'b': '2'}, {'a': '3', 'b': '4'}], errors: [] } }, { description: "Lines with comments are not used when guessing the delimiter in an escaped file", notes: "Guessing the delimiter should work even if there are many lines of comments at the start of the file", input: '#1\n#2\n#3\n#4\n#5\n#6\n#7\n#8\n#9\n#10\none,"t,w,o",three\nfour,five,six', config: { comments: '#' }, expected: { data: [['one','t,w,o','three'],['four','five','six']], errors: [] } }, { description: "Lines with comments are not used when guessing the delimiter in a non-escaped file", notes: "Guessing the delimiter should work even if there are many lines of comments at the start of the file", input: '#1\n#2\n#3\n#4\n#5\n#6\n#7\n#8\n#9\n#10\n#11\none,two,three\nfour,five,six', config: { comments: '#' }, expected: { data: [['one','two','three'],['four','five','six']], errors: [] } }, { description: "Pipe delimiter is guessed correctly when mixed with comas", notes: "Guessing the delimiter should work even if there are many lines of comments at the start of the file", input: 'one|two,two|three\nfour|five,five|six', config: {}, expected: { data: [['one','two,two','three'],['four','five,five','six']], errors: [] } }, { description: "Pipe delimiter is guessed correctly choose avgFildCount max one", notes: "Guessing the delimiter should work choose the min delta one and the max one", config: {}, input: 'a,b,c\na,b,c|d|e|f', expected: { data: [['a', 'b', 'c'], ['a','b','c|d|e|f']], errors: [] } }, { description: "Pipe delimiter is guessed correctly when first field are enclosed in quotes and contain delimiter characters", notes: "Guessing the delimiter should work if the first field is enclosed in quotes, but others are not", input: '"Field1,1,1";Field2;"Field3";Field4;Field5;Field6', config: {}, expected: { data: [['Field1,1,1','Field2','Field3', 'Field4', 'Field5', 'Field6']], errors: [] } }, { description: "Pipe delimiter is guessed correctly when some fields are enclosed in quotes and contain delimiter characters and escaoped quotes", notes: "Guessing the delimiter should work even if the first field is not enclosed in quotes, but others are", input: 'Field1;Field2;"Field,3,""3,3";Field4;Field5;"Field6,6"', config: {}, expected: { data: [['Field1','Field2','Field,3,"3,3', 'Field4', 'Field5', 'Field6,6']], errors: [] } }, { description: "Single quote as quote character", notes: "Must parse correctly when single quote is specified as a quote character", input: "a,b,'c,d'", config: { quoteChar: "'" }, expected: { data: [['a', 'b', 'c,d']], errors: [] } }, { description: "Custom escape character in the middle", notes: "Must parse correctly if the backslash sign (\\) is configured as a custom escape character", input: 'a,b,"c\\"d\\"f"', config: { escapeChar: '\\' }, expected: { data: [['a', 'b', 'c"d"f']], errors: [] } }, { description: "Custom escape character at the end", notes: "Must parse correctly if the backslash sign (\\) is configured as a custom escape character and the escaped quote character appears at the end of the column", input: 'a,b,"c\\"d\\""', config: { escapeChar: '\\' }, expected: { data: [['a', 'b', 'c"d"']], errors: [] } }, { description: "Custom escape character not used for escaping", notes: "Must parse correctly if the backslash sign (\\) is configured as a custom escape character and appears as regular character in the text", input: 'a,b,"c\\d"', config: { escapeChar: '\\' }, expected: { data: [['a', 'b', 'c\\d']], errors: [] } }, { description: "Header row with preceding comment", notes: "Must parse correctly headers if they are preceded by comments", input: '#Comment\na,b\nc,d\n', config: { header: true, comments: '#', skipEmptyLines: true, delimiter: ',' }, expected: { data: [{'a': 'c', 'b': 'd'}], errors: [] } }, { description: "Carriage return in header inside quotes, with line feed endings", input: '"a\r\na","b"\n"c","d"\n"e","f"\n"g","h"\n"i","j"', config: {}, expected: { data: [['a\r\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [] } }, { description: "Line feed in header inside quotes, with carriage return + line feed endings", input: '"a\na","b"\r\n"c","d"\r\n"e","f"\r\n"g","h"\r\n"i","j"', config: {}, expected: { data: [['a\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [] } }, { description: "Using \\r\\n endings uses \\r\\n linebreak", input: 'a,b\r\nc,d\r\ne,f\r\ng,h\r\ni,j', config: {}, expected: { data: [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\r\n', delimiter: ',', cursor: 23, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "Using \\n endings uses \\n linebreak", input: 'a,b\nc,d\ne,f\ng,h\ni,j', config: {}, expected: { data: [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\n', delimiter: ',', cursor: 19, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "Using \\r\\n endings with \\r\\n in header field uses \\r\\n linebreak", input: '"a\r\na",b\r\nc,d\r\ne,f\r\ng,h\r\ni,j', config: {}, expected: { data: [['a\r\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\r\n', delimiter: ',', cursor: 28, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "Using \\r\\n endings with \\n in header field uses \\r\\n linebreak", input: '"a\na",b\r\nc,d\r\ne,f\r\ng,h\r\ni,j', config: {}, expected: { data: [['a\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\r\n', delimiter: ',', cursor: 27, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "Using \\r\\n endings with \\n in header field with skip empty lines uses \\r\\n linebreak", input: '"a\na",b\r\nc,d\r\ne,f\r\ng,h\r\ni,j\r\n', config: {skipEmptyLines: true}, expected: { data: [['a\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\r\n', delimiter: ',', cursor: 29, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "Using \\n endings with \\r\\n in header field uses \\n linebreak", input: '"a\r\na",b\nc,d\ne,f\ng,h\ni,j', config: {}, expected: { data: [['a\r\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\n', delimiter: ',', cursor: 24, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "Using reserved regex character . as quote character", input: '.a\na.,b\r\nc,d\r\ne,f\r\ng,h\r\ni,j', config: { quoteChar: '.' }, expected: { data: [['a\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\r\n', delimiter: ',', cursor: 27, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "Using reserved regex character | as quote character", input: '|a\na|,b\r\nc,d\r\ne,f\r\ng,h\r\ni,j', config: { quoteChar: '|' }, expected: { data: [['a\na', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'j']], errors: [], meta: { linebreak: '\r\n', delimiter: ',', cursor: 27, aborted: false, truncated: false, renamedHeaders: null } } }, { description: "UTF-8 BOM encoded input is stripped from invisible BOM character", input: '\ufeffA,B\nX,Y', config: {}, expected: { data: [['A', 'B'], ['X', 'Y']], errors: [], } }, { description: "UTF-8 BOM encoded input with header produces column key stripped from invisible BOM character", input: '\ufeffA,B\nX,Y', config: { header: true }, expected: { data: [{A: 'X', B: 'Y'}], errors: [], } }, { description: "Parsing with skipEmptyLines set to 'greedy'", notes: "Must parse correctly without lines with no content", input: 'a,b\n\n,\nc,d\n , \n""," "\n , \n,,,,\n', config: { skipEmptyLines: 'greedy' }, expected: { data: [['a', 'b'], ['c', 'd']], errors: [] } }, { description: "Parsing with skipEmptyLines set to 'greedy' with quotes and delimiters as content", notes: "Must include lines with escaped delimiters and quotes", input: 'a,b\n\n,\nc,d\n" , ",","\n""" """,""""""\n\n\n', config: { skipEmptyLines: 'greedy' }, expected: { data: [['a', 'b'], ['c', 'd'], [' , ', ','], ['" "', '""']], errors: [] } }, { description: "Quoted fields with spaces between closing quote and next delimiter and contains delimiter", input: 'A,",B" ,C,D\nE,F,G,H', expected: { data: [['A', ',B', 'C', 'D'],['E', 'F', 'G', 'H']], errors: [] } }, { description: "Quoted fields with spaces between closing quote and newline and contains newline", input: 'a,b,"c\n" \nd,e,f', expected: { data: [['a', 'b', 'c\n'], ['d', 'e', 'f']], errors: [] } }, { description: "Skip First N number of lines , with header and 2 rows", input: 'a,b,c,d\n1,2,3,4', config: { header: true, skipFirstNLines: 1 }, expected: { data: [], errors: [] } }, { description: "Skip First N number of lines , with header and 2 rows", input: 'to-be-ignored\na,b,c,d\n1,2,3,4', config: { header: true, skipFirstNLines: 1 }, expected: { data: [{a: '1', b: '2', c: '3', d: '4'}], errors: [] } }, { description: "Skip First N number of lines , with header false", input: 'a,b,c,d\n1,2,3,4\n4,5,6,7', config: { header: false, skipFirstNLines: 1 }, expected: { data: [['1','2','3','4'],['4','5','6','7']], errors: [] } }, { description: "Skip First N number of lines , with header false and skipFirstNLines as negative value", input: 'a,b,c,d\n1,2,3,4\n4,5,6,7', config: { header: false, skipFirstNLines: -2 }, expected: { data: [['a','b','c','d'],['1','2','3','4'],['4','5','6','7']], errors: [] } }, { description: "Skip first 2 lines , with custom newline character", input: 'skip-this\rskip-this\r1,2,3,4', config: { header: false, skipFirstNLines: 2, newline: '\r' }, expected: { data: [['1','2','3','4']], errors: [] } }, ]; describe('Parse Tests', function() { function generateTest(test) { (test.disabled ? it.skip : it)(test.description, function() { var actual = Papa.parse(test.input, test.config); // allows for testing the meta object if present in the test if (test.expected.meta) { assert.deepEqual(actual.meta, test.expected.meta); } assert.deepEqual(actual.errors, test.expected.errors); assert.deepEqual(actual.data, test.expected.data); }); } for (var i = 0; i < PARSE_TESTS.length; i++) { generateTest(PARSE_TESTS[i]); } // Custom test for Issue 1024 - renamedHeaders regression test it('Issue 1024: renamedHeaders returned for simple duplicate headers (regression test)', function() { var result = Papa.parse('Column,Column\n1-1,1-2\n2-1,2-2\n3-1,3-2', { header: true }); // Test data structure assert.deepEqual(result.data, [ {Column: '1-1', Column_1: '1-2'}, {Column: '2-1', Column_1: '2-2'}, {Column: '3-1', Column_1: '3-2'} ]); // Test errors assert.deepEqual(result.errors, []); // Test that renamedHeaders is present and correct assert.isNotNull(result.meta.renamedHeaders, 'renamedHeaders should not be null'); assert.isObject(result.meta.renamedHeaders, 'renamedHeaders should be an object'); assert.deepEqual(result.meta.renamedHeaders, {Column_1: 'Column'}, 'renamedHeaders should contain the renamed header mapping'); }); }); // Tests for Papa.parse() that involve asynchronous operation var PARSE_ASYNC_TESTS = [ { description: "Simple worker", input: "A,B,C\nX,Y,Z", config: { worker: true, }, expected: { data: [['A','B','C'],['X','Y','Z']], errors: [] } }, { description: "Simple download", input: BASE_PATH + "sample.csv", config: { download: true }, disabled: !XHR_ENABLED, expected: { data: [['A','B','C'],['X','Y','Z']], errors: [] } }, { description: "Simple download + worker", input: BASE_PATH + "sample.csv", config: { worker: true, download: true }, disabled: !XHR_ENABLED, expected: { data: [['A','B','C'],['X','Y','Z']], errors: [] } }, { description: "Simple file", disabled: !FILES_ENABLED, input: FILES_ENABLED ? new File(["A,B,C\nX,Y,Z"], "sample.csv") : false, config: { }, expected: { data: [['A','B','C'],['X','Y','Z']], errors: [] } }, { description: "Simple file + worker", disabled: !FILES_ENABLED, input: FILES_ENABLED ? new File(["A,B,C\nX,Y,Z"], "sample.csv") : false, config: { worker: true, }, expected: { data: [['A','B','C'],['X','Y','Z']], errors: [] } }, { description: "File with a few regular and lots of empty lines", disabled: !FILES_ENABLED, input: FILES_ENABLED ? new File(["A,B,C\nX,Y,Z\n" + new Array(500000).fill(",,").join("\n")], "sample.csv") : false, config: { skipEmptyLines: "greedy" }, expected: { data: [['A','B','C'],['X','Y','Z']], errors: [] } }, { description: "File with a few regular and lots of empty lines + worker", disabled: !FILES_ENABLED, input: FILES_ENABLED ? new File(["A,B,C\nX,Y,Z\n" + new Array(500000).fill(",,").join("\n")], "sample.csv") : false, config: { worker: true, skipEmptyLines: "greedy" }, expected: { data: [['A','B','C'],['X','Y','Z']], errors: [] } } ]; describe('Parse Async Tests', function() { function generateTest(test) { (test.disabled ? it.skip : it)(test.description, function(done) { var config = test.config; config.complete = function(actual) { assert.deepEqual(actual.errors, test.expected.errors); assert.deepEqual(actual.data, test.expected.data); done(); }; config.error = function(err) { throw err; }; Papa.parse(test.input, config); }); } for (var i = 0; i < PARSE_ASYNC_TESTS.length; i++) { generateTest(PARSE_ASYNC_TESTS[i]); } }); // Tests for Papa.unparse() function (JSON to CSV) var UNPARSE_TESTS = [ { description: "A simple row", notes: "Comma should be default delimiter", input: [['A', 'b', 'c']], expected: 'A,b,c' }, { description: "Two rows", input: [['A', 'b', 'c'], ['d', 'E', 'f']], expected: 'A,b,c\r\nd,E,f' }, { description: "Data with quotes", input: [['a', '"b"', 'c'], ['"d"', 'e', 'f']], expected: 'a,"""b""",c\r\n"""d""",e,f' }, { description: "Data with newlines", input: [['a', 'b\nb', 'c'], ['d', 'e', 'f\r\nf']], expected: 'a,"b\nb",c\r\nd,e,"f\r\nf"' }, { description: "Array of objects (header row)", input: [{ "Col1": "a", "Col2": "b", "Col3": "c" }, { "Col1": "d", "Col2": "e", "Col3": "f" }], expected: 'Col1,Col2,Col3\r\na,b,c\r\nd,e,f' }, { description: "With header row, missing a field in a row", input: [{ "Col1": "a", "Col2": "b", "Col3": "c" }, { "Col1": "d", "Col3": "f" }], expected: 'Col1,Col2,Col3\r\na,b,c\r\nd,,f' }, { description: "With header row, with extra field in a row", notes: "Extra field should be ignored; first object in array dictates header row", input: [{ "Col1": "a", "Col2": "b", "Col3": "c" }, { "Col1": "d", "Col2": "e", "Extra": "g", "Col3": "f" }], expected: 'Col1,Col2,Col3\r\na,b,c\r\nd,e,f' }, { description: "Specifying column names and data separately", input: { fields: ["Col1", "Col2", "Col3"], data: [["a", "b", "c"], ["d", "e", "f"]] }, expected: 'Col1,Col2,Col3\r\na,b,c\r\nd,e,f' }, { description: "Specifying column names only (no data)", notes: "Papa should add a data property that is an empty array to prevent errors (no copy is made)", input: { fields: ["Col1", "Col2", "Col3"] }, expected: 'Col1,Col2,Col3' }, { description: "Specifying data only (no field names), improperly", notes: "A single array for a single row is wrong, but it can be compensated.
    Papa should add empty fields property to prevent errors.", input: { data: ["abc", "d", "ef"] }, expected: 'abc,d,ef' }, { description: "Specifying data only (no field names), properly", notes: "An array of arrays, even if just a single row.
    Papa should add empty fields property to prevent errors.", input: { data: [["a", "b", "c"]] }, expected: 'a,b,c' }, { description: "Custom delimiter (semicolon)", input: [['A', 'b', 'c'], ['d', 'e', 'f']], config: { delimiter: ';' }, expected: 'A;b;c\r\nd;e;f' }, { description: "Custom delimiter (tab)", input: [['Ab', 'cd', 'ef'], ['g', 'h', 'ij']], config: { delimiter: '\t' }, expected: 'Ab\tcd\tef\r\ng\th\tij' }, { description: "Custom delimiter (ASCII 30)", input: [['a', 'b', 'c'], ['d', 'e', 'f']], config: { delimiter: RECORD_SEP }, expected: 'a' + RECORD_SEP + 'b' + RECORD_SEP + 'c\r\nd' + RECORD_SEP + 'e' + RECORD_SEP + 'f' }, { description: "Custom delimiter (Multi-character)", input: [['A', 'b', 'c'], ['d', 'e', 'f']], config: { delimiter: ', ' }, expected: 'A, b, c\r\nd, e, f' }, { description: "Custom delimiter (Multi-character), field contains custom delimiter", input: [['A', 'b', 'c'], ['d', 'e', 'f, g']], config: { delimiter: ', ' }, expected: 'A, b, c\r\nd, e, "f, g"' }, { description: "Bad delimiter (\\n)", notes: "Should default to comma", input: [['a', 'b', 'c'], ['d', 'e', 'f']], config: { delimiter: '\n' }, expected: 'a,b,c\r\nd,e,f' }, { description: "Custom line ending (\\r)", input: [['a', 'b', 'c'], ['d', 'e', 'f']], config: { newline: '\r' }, expected: 'a,b,c\rd,e,f' }, { description: "Custom line ending (\\n)", input: [['a', 'b', 'c'], ['d', 'e', 'f']], config: { newline: '\n' }, expected: 'a,b,c\nd,e,f' }, { description: "Custom, but strange, line ending ($)", input: [['a', 'b', 'c'], ['d', 'e', 'f']], config: { newline: '$' }, expected: 'a,b,c$d,e,f' }, { description: "Force quotes around all fields", input: [['a', 'b', 'c'], ['d', 'e', 'f']], config: { quotes: true }, expected: '"a","b","c"\r\n"d","e","f"' }, { description: "Force quotes around all fields (with header row)", input: [{ "Col1": "a", "Col2": "b", "Col3": "c" }, { "Col1": "d", "Col2": "e", "Col3": "f" }], config: { quotes: true }, expected: '"Col1","Col2","Col3"\r\n"a","b","c"\r\n"d","e","f"' }, { description: "Force quotes around certain fields only", input: [['a', 'b', 'c'], ['d', 'e', 'f']], config: { quotes: [true, false, true] }, expected: '"a",b,"c"\r\n"d",e,"f"' }, { description: "Force quotes around certain fields only (with header row)", input: [{ "Col1": "a", "Col2": "b", "Col3": "c" }, { "Col1": "d", "Col2": "e", "Col3": "f" }], config: { quotes: [true, false, true] }, expected: '"Col1",Col2,"Col3"\r\n"a",b,"c"\r\n"d",e,"f"' }, { description: "Force quotes around string fields only", input: [['a', 'b', 'c'], ['d', 10, true]], config: { quotes: function(value) { return typeof value === 'string'; } }, expected: '"a","b","c"\r\n"d",10,true' }, { description: "Force quotes around string fields only (with header row)", input: [{ "Col1": "a", "Col2": "b", "Col3": "c" }, { "Col1": "d", "Col2": 10, "Col3": true }], config: { quotes: function(value) { return typeof value === 'string'; } }, expected: '"Col1","Col2","Col3"\r\n"a","b","c"\r\n"d",10,true' }, { description: "Empty input", input: [], expected: '' }, { description: "Mismatched field counts in rows", input: [['a', 'b', 'c'], ['d', 'e'], ['f']], expected: 'a,b,c\r\nd,e\r\nf' }, { description: "JSON null is treated as empty value", input: [{ "Col1": "a", "Col2": null, "Col3": "c" }], expected: 'Col1,Col2,Col3\r\na,,c' }, { description: "Custom quote character (single quote)", input: [['a,d','b','c']], config: { quoteChar: "'"}, expected: "'a,d',b,c" }, { description: "Don't print header if header:false option specified", input: [{"Col1": "a", "Col2": "b", "Col3": "c"}, {"Col1": "d", "Col2": "e", "Col3": "f"}], config: {header: false}, expected: 'a,b,c\r\nd,e,f' }, { description: "Date objects are exported in its ISO representation", input: [{date: new Date("2018-05-04T21:08:03.269Z"), "not a date": 16}, {date: new Date("Tue May 08 2018 08:20:22 GMT-0700 (PDT)"), "not a date": 32}], expected: 'date,not a date\r\n2018-05-04T21:08:03.269Z,16\r\n2018-05-08T15:20:22.000Z,32' }, { description: "Returns empty rows when empty rows are passed and skipEmptyLines is false", input: [[null, ' '], [], ['1', '2']], config: {skipEmptyLines: false}, expected: '," "\r\n\r\n1,2' }, { description: "Returns without empty rows when skipEmptyLines is true", input: [[null, ' '], [], ['1', '2']], config: {skipEmptyLines: true}, expected: '," "\r\n1,2' }, { description: "Returns without rows with no content when skipEmptyLines is 'greedy'", input: [[null, ' '], [], ['1', '2']].concat(new Array(500000).fill(['', ''])).concat([['3', '4']]), config: {skipEmptyLines: 'greedy'}, expected: '1,2\r\n3,4' }, { description: "Returns empty rows when empty rows are passed and skipEmptyLines is false with headers", input: [{a: null, b: ' '}, {}, {a: '1', b: '2'}], config: {skipEmptyLines: false, header: true}, expected: 'a,b\r\n," "\r\n\r\n1,2' }, { description: "Returns without empty rows when skipEmptyLines is true with headers", input: [{a: null, b: ' '}, {}, {a: '1', b: '2'}], config: {skipEmptyLines: true, header: true}, expected: 'a,b\r\n," "\r\n1,2' }, { description: "Returns without rows with no content when skipEmptyLines is 'greedy' with headers", input: [{a: null, b: ' '}, {}, {a: '1', b: '2'}], config: {skipEmptyLines: 'greedy', header: true}, expected: 'a,b\r\n1,2' }, { description: "Column option used to manually specify keys", notes: "Should not throw any error when attempting to serialize key not present in object. Columns are different than keys of the first object. When an object is missing a key then the serialized value should be an empty string.", input: [{a: 1, b: '2'}, {}, {a: 3, d: 'd', c: 4,}], config: {columns: ['a', 'b', 'c']}, expected: 'a,b,c\r\n1,2,\r\n\r\n3,,4' }, { description: "Column option used to manually specify keys with input type object", notes: "Should not throw any error when attempting to serialize key not present in object. Columns are different than keys of the first object. When an object is missing a key then the serialized value should be an empty string.", input: { data: [{a: 1, b: '2'}, {}, {a: 3, d: 'd', c: 4,}] }, config: {columns: ['a', 'b', 'c']}, expected: 'a,b,c\r\n1,2,\r\n\r\n3,,4' }, { description: "Use different escapeChar", input: [{a: 'foo', b: '"quoted"'}], config: {header: false, escapeChar: '\\'}, expected: 'foo,"\\"quoted\\""' }, { description: "test defeault escapeChar", input: [{a: 'foo', b: '"quoted"'}], config: {header: false}, expected: 'foo,"""quoted"""' }, { description: "Escape formulae", input: [{ "Col1": "=danger", "Col2": "@danger", "Col3": "safe" }, { "Col1": "safe=safe", "Col2": "+danger", "Col3": "-danger, danger" }, { "Col1": "'+safe", "Col2": "'@safe", "Col3": "safe, safe" }], config: { escapeFormulae: true }, expected: 'Col1,Col2,Col3\r\n"\'=danger","\'@danger",safe\r\nsafe=safe,"\'+danger","\'-danger, danger"\r\n\'+safe,\'@safe,"safe, safe"' }, { description: "Don't escape formulae by default", input: [{ "Col1": "=danger", "Col2": "@danger", "Col3": "safe" }, { "Col1": "safe=safe", "Col2": "+danger", "Col3": "-danger, danger" }, { "Col1": "'+safe", "Col2": "'@safe", "Col3": "safe, safe" }], expected: 'Col1,Col2,Col3\r\n=danger,@danger,safe\r\nsafe=safe,+danger,"-danger, danger"\r\n\'+safe,\'@safe,"safe, safe"' }, { description: "Escape formulae with forced quotes", input: [{ "Col1": "=danger", "Col2": "@danger", "Col3": "safe" }, { "Col1": "safe=safe", "Col2": "+danger", "Col3": "-danger, danger" }, { "Col1": "'+safe", "Col2": "'@safe", "Col3": "safe, safe" }], config: { escapeFormulae: true, quotes: true }, expected: '"Col1","Col2","Col3"\r\n"\'=danger","\'@danger","safe"\r\n"safe=safe","\'+danger","\'-danger, danger"\r\n"\'+safe","\'@safe","safe, safe"' }, { description: "Escape formulae with single-quote quoteChar and escapeChar", input: [{ "Col1": "=danger", "Col2": "@danger", "Col3": "safe" }, { "Col1": "safe=safe", "Col2": "+danger", "Col3": "-danger, danger" }, { "Col1": "'+safe", "Col2": "'@safe", "Col3": "safe, safe" }], config: { escapeFormulae: true, quoteChar: "'", escapeChar: "'" }, expected: 'Col1,Col2,Col3\r\n\'\'\'=danger\',\'\'\'@danger\',safe\r\nsafe=safe,\'\'\'+danger\',\'\'\'-danger, danger\'\r\n\'\'+safe,\'\'@safe,\'safe, safe\'' }, { description: "Escape formulae with single-quote quoteChar and escapeChar and forced quotes", input: [{ "Col1": "=danger", "Col2": "@danger", "Col3": "safe" }, { "Col1": "safe=safe", "Col2": "+danger", "Col3": "-danger, danger" }, { "Col1": "'+safe", "Col2": "'@safe", "Col3": "safe, safe" }], config: { escapeFormulae: true, quotes: true, quoteChar: "'", escapeChar: "'" }, expected: '\'Col1\',\'Col2\',\'Col3\'\r\n\'\'\'=danger\',\'\'\'@danger\',\'safe\'\r\n\'safe=safe\',\'\'\'+danger\',\'\'\'-danger, danger\'\r\n\'\'\'+safe\',\'\'\'@safe\',\'safe, safe\'' }, // new escapeFormulae values: { description: "Escape formulae with tab and carriage-return", input: [{ "Col1": "\tdanger", "Col2": "\rdanger,", "Col3": "safe\t\r" }], config: { escapeFormulae: true }, expected: 'Col1,Col2,Col3\r\n"\'\tdanger","\'\rdanger,","safe\t\r"' }, { description: "Escape formulae with tab and carriage-return, with forced quotes", input: [{ "Col1": " danger", "Col2": "\rdanger,", "Col3": "safe\t\r" }], config: { escapeFormulae: true, quotes: true }, expected: '"Col1","Col2","Col3"\r\n"\'\tdanger","\'\rdanger,","safe\t\r"' }, { description: "Escape formulae with tab and carriage-return, with single-quote quoteChar and escapeChar", input: [{ "Col1": " danger", "Col2": "\rdanger,", "Col3": "safe, \t\r" }], config: { escapeFormulae: true, quoteChar: "'", escapeChar: "'" }, expected: 'Col1,Col2,Col3\r\n\'\'\'\tdanger\',\'\'\'\rdanger,\',\'safe, \t\r\'' }, { description: "Escape formulae with tab and carriage-return, with single-quote quoteChar and escapeChar and forced quotes", input: [{ "Col1": " danger", "Col2": "\rdanger,", "Col3": "safe, \t\r" }], config: { escapeFormulae: true, quotes: true, quoteChar: "'", escapeChar: "'" }, expected: '\'Col1\',\'Col2\',\'Col3\'\r\n\'\'\'\tdanger\',\'\'\'\rdanger,\',\'safe, \t\r\'' }, ]; describe('Unparse Tests', function() { function generateTest(test) { (test.disabled ? it.skip : it)(test.description, function() { var actual; try { actual = Papa.unparse(test.input, test.config); } catch (e) { if (e instanceof Error) { throw e; } actual = e; } assert.strictEqual(actual, test.expected); }); } for (var i = 0; i < UNPARSE_TESTS.length; i++) { generateTest(UNPARSE_TESTS[i]); } }); var CUSTOM_TESTS = [ { description: "Pause and resume works (Regression Test for Bug #636)", disabled: !XHR_ENABLED, timeout: 30000, expected: [2001, [ ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Lorem ipsum dolor sit","42","ABC"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84"], ["Lorem ipsum dolor sit","42","ABC"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Lorem ipsum dolor sit","42","ABC"], ["Lorem ipsum dolor sit","42"] ], 0], run: function(callback) { var stepped = 0; var dataRows = []; var errorCount = 0; var output = []; Papa.parse(BASE_PATH + "verylong-sample.csv", { download: true, step: function(results, parser) { stepped++; if (results) { parser.pause(); parser.resume(); if (results.data && stepped % 200 === 0) { dataRows.push(results.data); } } }, complete: function() { output.push(stepped); output.push(dataRows); output.push(errorCount); callback(output); } }); } }, { description: "Pause and resume works for chunks with NetworkStreamer", disabled: !XHR_ENABLED, timeout: 30000, expected: ["Etiam a dolor vitae est vestibulum", "84", "DEF"], run: function(callback) { var chunkNum = 0; Papa.parse(BASE_PATH + "verylong-sample.csv", { download: true, chunkSize: 1000, chunk: function(results, parser) { chunkNum++; parser.pause(); if (chunkNum === 2) { callback(results.data[0]); return; } parser.resume(); }, complete: function() { callback(new Error("Should have found matched row before parsing whole file")); } }); } }, { description: "Pause and resume works for chunks with FileStreamer", disabled: !XHR_ENABLED, timeout: 30000, expected: ["Etiam a dolor vitae est vestibulum", "84", "DEF"], run: function(callback) { var chunkNum = 0; var xhr = new XMLHttpRequest(); xhr.onload = function() { Papa.parse(new File([xhr.responseText], './verylong-sample.csv'), { chunkSize: 1000, chunk: function(results, parser) { chunkNum++; parser.pause(); if (chunkNum === 2) { callback(results.data[0]); return; } parser.resume(); }, complete: function() { callback(new Error("Should have found matched row before parsing whole file")); } }); }; xhr.open("GET", BASE_PATH + "verylong-sample.csv"); try { xhr.send(); } catch (err) { callback(err); return; } } }, { description: "Pause and resume works for chunks with StringStreamer", disabled: !XHR_ENABLED, timeout: 30000, // Test also with string as byte size may be diferent expected: ["Etiam a dolor vitae est vestibulum", "84", "DEF"], run: function(callback) { var chunkNum = 0; var xhr = new XMLHttpRequest(); xhr.onload = function() { Papa.parse(xhr.responseText, { chunkSize: 1000, chunk: function(results, parser) { chunkNum++; parser.pause(); if (chunkNum === 2) { callback(results.data[0]); return; } parser.resume(); }, complete: function() { callback(new Error("Should have found matched row before parsing whole file")); } }); }; xhr.open("GET", BASE_PATH + "verylong-sample.csv"); try { xhr.send(); } catch (err) { callback(err); return; } } }, { description: "Complete is called with all results if neither step nor chunk is defined", expected: [['A', 'b', 'c'], ['d', 'E', 'f'], ['G', 'h', 'i']], disabled: !FILES_ENABLED, run: function(callback) { Papa.parse(new File(['A,b,c\nd,E,f\nG,h,i'], 'sample.csv'), { chunkSize: 3, complete: function(response) { callback(response.data); } }); } }, { description: "Step is called for each row", expected: 2, run: function(callback) { var callCount = 0; Papa.parse('A,b,c\nd,E,f', { step: function() { callCount++; }, complete: function() { callback(callCount); } }); } }, { description: "Data is correctly parsed with steps", expected: [['A', 'b', 'c'], ['d', 'E', 'f']], run: function(callback) { var data = []; Papa.parse('A,b,c\nd,E,f', { step: function(results) { data.push(results.data); }, complete: function() { callback(data); } }); } }, { description: "Data is correctly parsed with steps (headers)", expected: [{One: 'A', Two: 'b', Three: 'c'}, {One: 'd', Two: 'E', Three: 'f'}], run: function(callback) { var data = []; Papa.parse('One,Two,Three\nA,b,c\nd,E,f', { header: true, step: function(results) { data.push(results.data); }, complete: function() { callback(data); } }); } }, { description: "Data is correctly parsed with steps and worker (headers)", expected: [{One: 'A', Two: 'b', Three: 'c'}, {One: 'd', Two: 'E', Three: 'f'}], run: function(callback) { var data = []; Papa.parse('One,Two,Three\nA,b,c\nd,E,f', { header: true, worker: true, step: function(results) { data.push(results.data); }, complete: function() { callback(data); } }); } }, { description: "Data is correctly parsed with steps and worker", expected: [['A', 'b', 'c'], ['d', 'E', 'f']], run: function(callback) { var data = []; Papa.parse('A,b,c\nd,E,f', { worker: true, step: function(results) { data.push(results.data); }, complete: function() { callback(data); } }); } }, { description: "Data is correctly parsed with steps when skipping empty lines", expected: [['A', 'b', 'c'], ['d', 'E', 'f']], run: function(callback) { var data = []; Papa.parse('A,b,c\n\nd,E,f', { skipEmptyLines: true, step: function(results) { data.push(results.data); }, complete: function() { callback(data); } }); } }, { description: "Data is correctly parsed with steps when there are empty values", expected: [{A: 'a', B: 'b', C: 'c', D: 'd'}, {A: 'a', B: '', C: '', D: ''}], run: function(callback) { var data = []; Papa.parse('A,B,C,D\na,b,c,d\na,,,', { header: true, step: function(results) { data.push(results.data); }, complete: function() { callback(data); } }); } }, { description: "Step is called with the contents of the row", expected: ['A', 'b', 'c'], run: function(callback) { Papa.parse('A,b,c', { step: function(response) { callback(response.data); } }); } }, { description: "Step is called with the last cursor position", expected: [6, 12, 17], run: function(callback) { var updates = []; Papa.parse('A,b,c\nd,E,f\nG,h,i', { step: function(response) { updates.push(response.meta.cursor); }, complete: function() { callback(updates); } }); } }, { description: "Step exposes cursor for downloads", expected: [129, 287, 452, 595, 727, 865, 1031, 1209], disabled: !XHR_ENABLED, run: function(callback) { var updates = []; Papa.parse(BASE_PATH + "long-sample.csv", { download: true, step: function(response) { updates.push(response.meta.cursor); }, complete: function() { callback(updates); } }); } }, { description: "Step exposes cursor for chunked downloads", expected: [129, 287, 452, 595, 727, 865, 1031, 1209], disabled: !XHR_ENABLED, run: function(callback) { var updates = []; Papa.parse(BASE_PATH + "long-sample.csv", { download: true, chunkSize: 500, step: function(response) { updates.push(response.meta.cursor); }, complete: function() { callback(updates); } }); } }, { description: "Step exposes cursor for workers", expected: [452, 452, 452, 865, 865, 865, 1209, 1209], disabled: !XHR_ENABLED, run: function(callback) { var updates = []; Papa.parse(BASE_PATH + "long-sample.csv", { download: true, chunkSize: 500, worker: true, step: function(response) { updates.push(response.meta.cursor); }, complete: function() { callback(updates); } }); } }, { description: "Chunk is called for each chunk", expected: [3, 3, 2], disabled: !XHR_ENABLED, run: function(callback) { var updates = []; Papa.parse(BASE_PATH + "long-sample.csv", { download: true, chunkSize: 500, chunk: function(response) { updates.push(response.data.length); }, complete: function() { callback(updates); } }); } }, { description: "Chunk is called with cursor position", expected: [452, 865, 1209], disabled: !XHR_ENABLED, run: function(callback) { var updates = []; Papa.parse(BASE_PATH + "long-sample.csv", { download: true, chunkSize: 500, chunk: function(response) { updates.push(response.meta.cursor); }, complete: function() { callback(updates); } }); } }, { description: "Chunk functions can pause parsing", expected: [ [['A', 'b', 'c']] ], run: function(callback) { var updates = []; Papa.parse('A,b,c\nd,E,f\nG,h,i', { chunkSize: 10, chunk: function(response, handle) { updates.push(response.data); handle.pause(); callback(updates); }, complete: function() { callback(new Error('incorrect complete callback')); } }); } }, { description: "Chunk functions can resume parsing", expected: [ [['A', 'b', 'c']], [['d', 'E', 'f'], ['G', 'h', 'i']] ], run: function(callback) { var updates = []; var handle = null; var first = true; Papa.parse('A,b,c\nd,E,f\nG,h,i', { chunkSize: 10, chunk: function(response, h) { updates.push(response.data); if (!first) return; handle = h; handle.pause(); first = false; }, complete: function() { callback(updates); } }); setTimeout(function() { handle.resume(); }, 500); } }, { description: "Chunk functions can abort parsing", expected: [ [['A', 'b', 'c']] ], run: function(callback) { var updates = []; Papa.parse('A,b,c\nd,E,f\nG,h,i', { chunkSize: 1, chunk: function(response, handle) { if (response.data.length) { updates.push(response.data); handle.abort(); } }, complete: function(response) { callback(updates); } }); } }, { description: "Step exposes indexes for files", expected: [6, 12, 17], disabled: !FILES_ENABLED, run: function(callback) { var updates = []; Papa.parse(new File(['A,b,c\nd,E,f\nG,h,i'], 'sample.csv'), { download: true, step: function(response) { updates.push(response.meta.cursor); }, complete: function() { callback(updates); } }); } }, { description: "Step exposes indexes for chunked files", expected: [6, 12, 17], disabled: !FILES_ENABLED, run: function(callback) { var updates = []; Papa.parse(new File(['A,b,c\nd,E,f\nG,h,i'], 'sample.csv'), { chunkSize: 3, step: function(response) { updates.push(response.meta.cursor); }, complete: function() { callback(updates); } }); } }, { description: "Quoted line breaks near chunk boundaries are handled", expected: [['A', 'B', 'C'], ['X', 'Y\n1\n2\n3', 'Z']], disabled: !FILES_ENABLED, run: function(callback) { var updates = []; Papa.parse(new File(['A,B,C\nX,"Y\n1\n2\n3",Z'], 'sample.csv'), { chunkSize: 3, step: function(response) { updates.push(response.data); }, complete: function() { callback(updates); } }); } }, { description: "Step functions can abort parsing", expected: [['A', 'b', 'c']], run: function(callback) { var updates = []; Papa.parse('A,b,c\nd,E,f\nG,h,i', { step: function(response, handle) { updates.push(response.data); handle.abort(); callback(updates); }, chunkSize: 6 }); } }, { description: "Complete is called after aborting", expected: true, run: function(callback) { Papa.parse('A,b,c\nd,E,f\nG,h,i', { step: function(response, handle) { handle.abort(); }, chunkSize: 6, complete: function(response) { callback(response.meta.aborted); } }); } }, { description: "Step functions can pause parsing", expected: [['A', 'b', 'c']], run: function(callback) { var updates = []; Papa.parse('A,b,c\nd,E,f\nG,h,i', { step: function(response, handle) { updates.push(response.data); handle.pause(); callback(updates); }, complete: function() { callback('incorrect complete callback'); } }); } }, { description: "Step functions can resume parsing", expected: [['A', 'b', 'c'], ['d', 'E', 'f'], ['G', 'h', 'i']], run: function(callback) { var updates = []; var handle = null; var first = true; Papa.parse('A,b,c\nd,E,f\nG,h,i', { step: function(response, h) { updates.push(response.data); if (!first) return; handle = h; handle.pause(); first = false; }, complete: function() { callback(updates); } }); setTimeout(function() { handle.resume(); }, 500); } }, { description: "Step functions can abort workers", expected: 1, disabled: !XHR_ENABLED, run: function(callback) { var updates = 0; Papa.parse(BASE_PATH + "long-sample.csv", { worker: true, download: true, chunkSize: 500, step: function(response, handle) { updates++; handle.abort(); }, complete: function() { callback(updates); } }); } }, { description: "beforeFirstChunk manipulates only first chunk", expected: 7, disabled: !XHR_ENABLED, run: function(callback) { var updates = 0; Papa.parse(BASE_PATH + "long-sample.csv", { download: true, chunkSize: 500, beforeFirstChunk: function(chunk) { return chunk.replace(/.*?\n/, ''); }, step: function(response) { updates++; }, complete: function() { callback(updates); } }); } }, { description: "First chunk not modified if beforeFirstChunk returns nothing", expected: 8, disabled: !XHR_ENABLED, run: function(callback) { var updates = 0; Papa.parse(BASE_PATH + "long-sample.csv", { download: true, chunkSize: 500, beforeFirstChunk: function(chunk) { }, step: function(response) { updates++; }, complete: function() { callback(updates); } }); } }, { description: "Should correctly guess custom delimiter when passed delimiters to guess.", expected: "~", run: function(callback) { var results = Papa.parse('"A"~"B"~"C"~"D"', { delimitersToGuess: ['~', '@', '%'] }); callback(results.meta.delimiter); } }, { description: "Should still correctly guess default delimiters when delimiters to guess are not given.", expected: ",", run: function(callback) { var results = Papa.parse('"A","B","C","D"'); callback(results.meta.delimiter); } }, { description: "Data is correctly parsed with chunks and duplicated headers", expected: [{h0: 'a', h1: 'a'}, {h0: 'b', h1: 'b'}], run: function(callback) { var data = []; Papa.parse('h0,h1\na,a\nb,b', { header: true, chunkSize: 10, chunk: function(results) { data.push(results.data[0]); }, complete: function() { callback(data); } }); } }, ]; describe('Custom Tests', function() { function generateTest(test) { (test.disabled ? it.skip : it)(test.description, function(done) { if(test.timeout) { this.timeout(test.timeout); } test.run(function(actual) { assert.deepEqual(actual, test.expected); done(); }); }); } for (var i = 0; i < CUSTOM_TESTS.length; i++) { generateTest(CUSTOM_TESTS[i]); } }); (typeof window !== "undefined" ? describe : describe.skip)("Browser Tests", () => { it("When parsing synchronously inside a web-worker not owned by PapaParse we should not invoke postMessage", async() => { // Arrange const papaParseScriptPath = new URL("../papaparse.js", window.document.baseURI).href; // Define our custom web-worker that loads PapaParse and executes a synchronous parse const blob = new Blob([ ` importScripts('${papaParseScriptPath}'); self.addEventListener("message", function(event) { if (event.data === "ExecuteParse") { // Perform our synchronous parse, as requested const results = Papa.parse('x\\ny\\n'); postMessage({type: "ParseExecutedSuccessfully", results}); } else { // Otherwise, send whatever we received back. We shouldn't be hitting this (!) If we're reached // this it means PapaParse thinks it is running inside a web-worker that it owns postMessage(event.data); } }); ` ], {type: 'text/javascript'}); const blobURL = window.URL.createObjectURL(blob); const webWorker = new Worker(blobURL); const receiveMessagePromise = new Promise((resolve, reject) => { webWorker.addEventListener("message", (event) => { if (event.data.type === "ParseExecutedSuccessfully") { resolve(event.data); } else { const error = new Error(`Received unexpected message: ${JSON.stringify(event.data, null, 2)}`); error.data = event.data; reject(error); } }); }); // Act webWorker.postMessage("ExecuteParse"); const webWorkerMessage = await receiveMessagePromise; // Assert assert.equal("ParseExecutedSuccessfully", webWorkerMessage.type); assert.equal(3, webWorkerMessage.results.data.length); }); }); ================================================ FILE: tests/test.js ================================================ var connect = require('connect'); var serveStatic = require('serve-static'); var open = require('open'); var path = require('path'); var childProcess = require('child_process'); var server = connect().use(serveStatic(path.join(__dirname, '/..'))).listen(8071, function() { if (process.argv.indexOf('--mocha-headless-chrome') !== -1) { childProcess.spawn('node_modules/.bin/mocha-headless-chrome', ['-f', 'http://localhost:8071/tests/tests.html'], { stdio: 'inherit' }).on('exit', function(code) { server.close(); process.exit(code); // eslint-disable-line no-process-exit }); } else { open('http://localhost:8071/tests/tests.html'); console.log('Serving tests...'); } }); ================================================ FILE: tests/tests.html ================================================ Papa Parse Tests
    ================================================ FILE: tests/utf-8-bom-sample.csv ================================================ A,B,C X,Y,Z ================================================ FILE: tests/verylong-sample.csv ================================================ placeholder,meaning of life,TLD Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF "Lorem ipsum dolor sit",42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42 Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84 Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84 Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42,ABC Lorem ipsum dolor sit,42,ABC Etiam a dolor vitae est vestibulum,84,DEF Lorem ipsum dolor sit,42 Lorem ipsum dolor sit,42,ABC