public void mainFlow() throws IOException {
		StringBuilder headersb = new StringBuilder();
		headerWrite(Mode.Co, nameArray, headersb);
		resp.getWriter().println(
				"<!-- mainflow_start: " + (System.currentTimeMillis() - time)
						+ "-->");
		// 出力キャッシュが揃っていなければメインの処理をする

		if (flush == null || sideCount == null || flush.isEmpty()) {
			StringBuilder sb1 = new StringBuilder(); // 出力優先度の高いStringBuilder
			StringBuilder sb2 = new StringBuilder(); // 出力優先度の低いStringBuilder
			/* メインの処理ここから */
			Record rc = new Record();

			record[1] = rc.getRecord(nameArray[1], shift, force);
			if (nameArray[2].isEmpty()) {
				setContent();
				/* シングル処理 */
				singleOut(sb1, sb2);
				sideCount = record[1][0].length;
				/* シングル処理終了 */
			} else {
				/* ダブル処理 */
				record[2] = rc.getRecord(nameArray[2], shift, force);
				setContent();
				doubleSearch(sb1, sb2);
				resp.getWriter().println(
						"<!-- doubleend: "
								+ ((System.currentTimeMillis() - time) * -1)
								+ "-->");
				if (!ipFlag && (maxCount[0] != 0 || maxCount[1] != 0)) // 検索結果が1件以上あれば検索履歴に書き込む
					new Past().putPastAndRank(nameArray, maxCount, sb1);
				resp.getWriter().println(
						"<!-- putpastend: "
								+ ((System.currentTimeMillis() - time) * -1)
								+ "-->");
				sideCount = maxCount[0] + maxCount[1];
				/* ダブル処理終了 */
			}
			/* シングル・ダブル共通処理 */
			flush = new String(sb1) + new String(sb2);
			cache.put(nameArray[1] + "," + nameArray[2], flush);
			cache.put(nameArray[1] + "," + nameArray[2] + ",count", sideCount);
			/* 共通処理終了 */
		}
		StringBuilder sb0 = new StringBuilder(); // sideOutput用
		new Past().sideOutput(sb0, sideCount, nameArray); // サイドメニューはキャッシュに含めないので逐次書き出す
		resp.getWriter().println(
				"<!-- sideoutend: "
						+ ((System.currentTimeMillis() - time) * -1) + "-->");
		resp.getWriter()
				.println(new String(headersb) + flush + new String(sb0));
	}